我在llvm/lib/Transforms
中写了我的通行证,它叫createABCDPass
。我在我的通行证中添加了以下代码:
namespace llvm { FunctionPass *createABCDPass(); }
FunctionPass *llvm::createABCDPass() { return new AbcRemoval(); }
,其中AbcRemoval
为通道的类。
之后,我在lib/CodeGen/LLVMTargetMachine.cpp
中做了一个前向声明,以识别我的pass:
namespace llvm { FunctionPass *createABCDPass(); }
PM.add(createABCDPass());
然而,当我在llvm上运行make时,我得到以下错误:
llvm[2]: Linking Release executable llc (without symbols)
Undefined symbols:
"llvm::createABCDPass()", referenced from:
llvm::LLVMTargetMachine::addCommonCodeGenPasses(llvm::PassManagerBase&, llvm::CodeGenOpt::Level, bool, llvm::MCContext*&)in libLLVMCodeGen.a(LLVMTargetMachine.o)
ld: symbol(s) not found
collect2: ld returned 1 exit status
make[2]: *** [/Users/.../llvm/Release/bin/llc] Error 1
make[1]: *** [llc/.makeall] Error 2
make: *** [all] Error 1
有人知道为什么我得到这个错误吗?谢谢!
啊,我最后通过将pass模块重命名为-libLLVM_xxx来修复它。显然,您必须将其命名为libLLVM_"某些东西",以便它与LLVM中的所有其他传递一起动态运行。不知道为什么,但它有效!
您必须将您的通行证链接到llc.默认情况下,llc几乎不会从lib/Transforms
中提取任何内容,因此您的通行证将不会链接到llc.