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