2017-04-14 6 views
1

私は解析パスを作成しようとしています。私のコードは以下の通りです。私は.soファイル(https://www.cs.cornell.edu/~asampson/blog/llvm.html)の作成にAdrian Sampsonのアプローチを使用しています。分析パスのLLVMとAnalysisType :: IDの設定方法

  #include "llvm/Pass.h" 
     #include "llvm/IR/Function.h" 
     #include "llvm/Support/raw_ostream.h" 
     #include "llvm/IR/LegacyPassManager.h" 
     #include "llvm/Transforms/IPO/PassManagerBuilder.h" 
     #include "DataDependence.h" 
     #include "ControlDependence.h" 
     #include "llvm/IR/Module.h" 
     #include "llvm/Analysis/AliasAnalysis.h" 
     #include "llvm/Support/ErrorHandling.h" 
     #include "llvm/Analysis/PostDominators.h" 
     #include "llvm/Analysis/MemoryDependenceAnalysis.h" 
     #include "llvm/Analysis/LoopInfo.h" 
     using namespace llvm; 
     namespace { 
     struct SkeletonPass : public ModulePass { 
      static char ID; 
     SkeletonPass() : ModulePass(ID) {} 
     virtual void getAnalysisUsage(AnalysisUsage &AU) const { 
      AU.addRequired<LoopInfoWrapperPass>(); 
      AU.addRequired<DominatorTreeWrapperPass>(); 
      // AU.addPreserved<AliasAnalysis>(); 
      // AU.setPreservesCFG(); 
      // AU.addRequired<PostDominatorTree>(); 

     } 
     virtual bool runOnModule(Module &M); 
      }; 
      bool SkeletonPass::runOnModule(Module &M) { 
      for (auto mi = M.begin(); mi != M.end(); ++mi) { 
       if (mi->isDeclaration()) 
       continue; 
       // MemoryDependenceAnalysis &MDA = getAnalysis<MemoryDependenceAnalysis>(*mi); 
       PostDominatorTree &PDT = getAnalysis<PostDominatorTree>(*mi); //Error is Here 
      } 
     errs() << "Test:\n"; 
     } 
     } 
     char SkeletonPass::ID = 0; 
     static RegisterPass<SkeletonPass> X("SkeletonPass", "Hello World Pass", 
            false /* Only looks at CFG */, 
            true /* Analysis Pass */); 

エラーは、私がAnalysisType :: IDを欠けていると言っている

 In file included from /usr/local/include/llvm/Pass.h:388:0, 
        from /media/quentinmayo/storage/Research/LLVM Dev/llvm-pass-skeleton/skeleton/Skeleton.cpp:1: 
    /usr/local/include/llvm/PassAnalysisSupport.h: In instantiation of ‘AnalysisType& llvm::Pass::getAnalysis(llvm::Function&) [with AnalysisType = llvm::PostDominatorTree]’: 
    /media/quentinmayo/storage/Research/LLVM Dev/llvm-pass-skeleton/skeleton/Skeleton.cpp:34:71: required from here 
    /usr/local/include/llvm/PassAnalysisSupport.h:253:38: error: ‘ID’ is not a member of ‘llvm::PostDominatorTree’ 
     return getAnalysisID<AnalysisType>(&AnalysisType::ID, F); 
             ^
    skeleton/CMakeFiles/SkeletonPass.dir/build.make:62: recipe for target 'skeleton/CMakeFiles/SkeletonPass.dir/Skeleton.cpp.o' failed 
    make[2]: *** [skeleton/CMakeFiles/SkeletonPass.dir/Skeleton.cpp.o] Error 1 
    CMakeFiles/Makefile2:85: recipe for target 'skeleton/CMakeFiles/SkeletonPass.dir/all' failed 
    make[1]: *** [skeleton/CMakeFiles/SkeletonPass.dir/all] Error 2 
    Makefile:83: recipe for target 'all' failed 
    make: *** [all] Error 2 

の下に、私は取得していますエラーです。 AliasAnalysisポインタを別のクラスに渡して解析したいと思います。私はこのAnalysisType :: IDが何であるか混乱していますか?さらに、分析のためのパスを作成するときに、誰かがgetAnalysisUsageとgetAnalysisの関係を説明できますか?コンパイラ理論を理解することは、LLVMを扱うことに本当に役立たない。

http://llvm.org/docs/doxygen/html/classllvm_1_1Pass.html#ab78af013d3a11515403da8517f8f3d4a

答えて

1

私はクラスのメンバーgetDomTree呼び出すために必要な。

DominatorTree & DI = getAnalysis(* mi).getDomTree();

その他のアドバイス:Doxgyenページとヘッダーファイルを読みやすくする。そしてそれについては、あなたの現在のLLVMビルドのソースを見てください。

また、AliasAnalysisはAAResultsWrapperPassになりました。

関連する問題