2016-09-12 14 views
0

llvmに対してと書いてあります。を書きました。LLVM:CallGraphWrapperPassが必要な場合、Clangは実行されません

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 

でこのコードを実行すると、私は正しい出力を取得します。

static void registerSkeletonPass(const PassManagerBuilder &, 
         legacy::PassManagerBase &PM) { 
    PM.add(new SkeletonPass()); 
} 
static RegisterStandardPasses 
    RegisterMyPass(PassManagerBuilder::EP_EarlyAsPossible, 
       registerSkeletonPass); 

:この偉大なblogによると、次のコマンド

clang -Xclang -load -Xclang ./libSkeletonPass.so test.c 

も限り、私たちはとの最後の行を置き換えるよう、動作するはず

(test.bcを無視することができます) 問題は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)

打ち鳴らすバージョン:3.8.1

答えて

0

ソリューションはEP_EnabledOnOptLevel0にEP_EarlyAsPossibleを変更することでした。

関連する問題