我为llvm写了以下 pass 。
using namespace llvm;
namespace {
struct SkeletonPass : public FunctionPass {
static char ID;
SkeletonPass() : FunctionPass(ID) {}
void getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequired<CallGraphWrapperPass>();
AU.setPreservesAll();
}
virtual bool runOnFunction(Function &F) {
errs() << "Function: " << F.getName() << "!\n";
CallGraph &CG = getAnalysis<CallGraphWrapperPass>().getCallGraph();
return false;
}
};
}
char SkeletonPass::ID = 0;
static RegisterPass<SkeletonPass> X("skeleton", "text");
如果我用
执行此代码opt -load ./libSkeletonPass.so -skeleton test.bc > /dev/null
我得到了正确的输出。 (test.bc可以忽略不计)
根据这个伟大的blog,下一个命令
clang -Xclang -load -Xclang ./libSkeletonPass.so test.c
也应该有用,只要我们用:
替换最后一行static void registerSkeletonPass(const PassManagerBuilder &,
legacy::PassManagerBase &PM) {
PM.add(new SkeletonPass());
}
static RegisterStandardPasses
RegisterMyPass(PassManagerBuilder::EP_EarlyAsPossible,
registerSkeletonPass);
问题是clang崩溃并返回此错误:
...
clang-3.8: error: unable to execute command: Segmentation fault (core dumped)
clang-3.8: error: clang frontend command failed due to signal (use -v to see invocation)
...
如果没有所有 CallGraphWrapperPass 引用,则clang执行传递更正。
我是llvm的新手,所以我错过了什么?
系统:Linux 4.4.0(64位)
clang version :3.8.1
答案 0 :(得分:0)
解决方案是将EP_EarlyAsPossible更改为EP_EnabledOnOptLevel0。