我有两个LLVM通道,一个通道需要另一个的输出。所以在PassB中,我有:
void DiscoPoP::getAnalysisUsage(AnalysisUsage &Info) const{
Info.addRequired<PassA>();
}
我尝试将以下代码段添加到PassB,但是运行clang -Xclang -load -Xclang LLVMPassB.so
时出现错误:未定义符号:_ZN18PassA2IDE
static RegisterStandardPasses PassLoader(
PassManagerBuilder::EP_EarlyAsPossible,
[](const PassManagerBuilder &Builder,
legacy::PassManagerBase &PM) { PM.add(new PassA()); });
如果我也用clang加载PassA,它会起作用:clang -Xclang -load -Xclang LLVMPassA.so -Xclang -load -Xclang LLVMPassB.so
但是,如果需要从PassB手动加载它,似乎显得多余。是否可以通过编程方式从PassB加载PassA?
答案 0 :(得分:0)
我收到一个错误:未定义的符号:_ZN18PassA2IDE
因为通行不可见PassA。
如果我也用clang加载PassA,它可以正常工作:clang -Xclang -load -Xclang LLVMPassA.so -Xclang -load -Xclang LLVMPassB.so
符合预期。
但是,如果需要通过PassB,则必须手动加载它似乎是多余的。
只有在提供passB作为标志时,才有一种让clang知道PassA
的方法。除非我们作为标志传递,否则clang无法知道LLVMPassA.so
的位置。
是否可以通过编程方式从PassB加载PassA?
如果您修改LLVM源代码并将两遍密码都放在此处,则可以完成此操作。在LLVM通道管理器中注册通道很简单。参见https://reviews.llvm.org/D50658(冷轧过程),具体说明lib/Transforms/IPO/PassManagerBuilder.cpp
和功能createHotColdSplittingPass
中的变化。