How to use the llvm::Linker?

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
yao
Reply | Threaded
Open this post in threaded view
|

How to use the llvm::Linker?

yao
Hi,All
this one pass that will use the Linker
namespace {
  // Hello2 - The second implementation with getAnalysisUsage implemented.
  llvm::StringRef programNametest("");
  struct Hello2 : public ModulePass {
    static char ID; // Pass identification, replacement for typeid
    Hello2() : ModulePass(ID) {}

    virtual bool runOnModule(llvm::Module &M){
      llvm::Linker *linkertest = new llvm::Linker(programNametest,&M);
      llvm::errs() << linkertest->getModule();
      ++HelloCounter;
      errs() << "Hello: ";
      return false;
    }

    // We don't modify the program, so we preserve all analyses
    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
      AU.setPreservesAll();
    }
  };
}

char Hello2::ID = 0;
static RegisterPass<Hello2>
Y1("hello2", "Hello World Pass (with getAnalysisUsage implemented)");

But ,when i run the  pass with opt, there will be a Error:
./bin/opt: symbol lookup error: ./lib/Hello.so: undefined symbol: _ZN4llvm6Linker11LinkModulesEPNS_6ModuleES2_jPSs
by the c++filt, the function name is :
llvm::Linker::LinkModules(llvm::Module*, llvm::Module*, unsigned int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >*)
So I think, may I should  Modify the cmake, I want to know how to modify the files of  cmake, so that i can complier the pass with Linker.
Thank.




_______________________________________________
LLVM Developers mailing list
[hidden email]         http://llvm.cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
Reply | Threaded
Open this post in threaded view
|

Re: How to use the llvm::Linker?

Duncan Sands
Hi,

On 29/03/13 09:22, xiaoyaollvm wrote:

> Hi,All
> this one pass that will use the Linker
> namespace {
>    // Hello2 - The second implementation with getAnalysisUsage implemented.
>    llvm::StringRef programNametest("");
>    struct Hello2 : public ModulePass {
>      static char ID; // Pass identification, replacement for typeid
>      Hello2() : ModulePass(ID) {}
>
>      virtual bool runOnModule(llvm::Module &M){
>        llvm::Linker *linkertest = new llvm::Linker(programNametest,&M);
>        llvm::errs() << linkertest->getModule();
>        ++HelloCounter;
>        errs() << "Hello: ";
>        return false;
>      }
>
>      // We don't modify the program, so we preserve all analyses
>      virtual void getAnalysisUsage(AnalysisUsage &AU) const {
>        AU.setPreservesAll();
>      }
>    };
> }
>
> char Hello2::ID = 0;
> static RegisterPass<Hello2>
> Y1("hello2", "Hello World Pass (with getAnalysisUsage implemented)");
>
> But ,when i run the  pass with opt, there will be a Error:
> ./bin/opt: symbol lookup error: ./lib/Hello.so: undefined symbol:
> _ZN4llvm6Linker11LinkModulesEPNS_6ModuleES2_jPSs
> by the c++filt, the function name is :
> llvm::Linker::LinkModules(llvm::Module*, llvm::Module*, unsigned int,
> std::basic_string<char, std::char_traits<char>, std::allocator<char> >*)
> So I think, may I should  Modify the cmake, I want to know how to modify the
> files of  cmake, so that i can complier the pass with Linker.

since "opt" itself doesn't do any linking, it isn't linked with the linker
library (-lLLVMLinker), which is where the LinkModules code lives.  So you will
have to link your plugin with libLLVMLinker in order to get the LinkModules
code.

Ciao, Duncan.
_______________________________________________
LLVM Developers mailing list
[hidden email]         http://llvm.cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev