从另一遍内加载clang遍

时间:2019-11-28 15:25:42

标签: clang llvm llvm-clang

我有两个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?

1 个答案:

答案 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中的变化。