LLVM:如果需要CallGraphWrapperPass,则Clang不会运行Pass

时间:2016-09-12 21:08:46

标签: c++ clang llvm

我为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

1 个答案:

答案 0 :(得分:0)

解决方案是将EP_EarlyAsPossible更改为EP_EnabledOnOptLevel0。