LLVM中动态加载的分析过程和分析组的最少代码

LLVM中动态加载的分析过程和分析组的最少代码,llvm,Llvm,如果我从LLVM外部构建一个库,那么定义并正确“注册”一个分析组和该组的一部分的过程的最小代码是什么?如果通过取决于先前分析的结果,结果会是什么样子 关于的文档包含了关于在不同场景中应该做什么的信息,但是它分布在许多部分,其中一些内容似乎与最新LLVM的源代码和注释相矛盾。我正在寻找所需文件的完整源代码,就像他们提供的基本Hello World通行证一样。我能够解决这个问题。这是您需要的代码 在标题中: class MyAnalysis { public: static char ID

如果我从LLVM外部构建一个库,那么定义并正确“注册”一个分析组和该组的一部分的过程的最小代码是什么?如果通过取决于先前分析的结果,结果会是什么样子


关于的文档包含了关于在不同场景中应该做什么的信息,但是它分布在许多部分,其中一些内容似乎与最新LLVM的源代码和注释相矛盾。我正在寻找所需文件的完整源代码,就像他们提供的基本Hello World通行证一样。

我能够解决这个问题。这是您需要的代码

在标题中:

class MyAnalysis {
 public:
    static char ID;
    MyAnalysis();
    ~MyAnalysis();
}
资料来源:

struct MyPass : public llvm::ImmutablePass, public MyAnalysis {
    static char ID;
       MyPass() : llvm::ImmutablePass(ID) {
    }

    /// getAdjustedAnalysisPointer - This method is used when a pass implements
    /// an analysis interface through multiple inheritance.
    virtual void *getAdjustedAnalysisPointer(AnalysisID PI) {
      if (PI == &MyAnalysis::ID)
        return (MyAnalysis*)this;
      return this;
    }
};

struct UsingPass : public FunctionPass {
    static char ID;
    UsingPass() : FunctionPass(ID) {}

    void getAnalysisUsage(AnalysisUsage &AU) const {
     AU.addRequired<MyAnalysis>();
    }
    virtual bool runOnFunction(Function &F) {
    MyAnalysis& info =getAnalysis<MyAnalysis>();
        ...
        //use the analysis here
        ...
    }
}

char MyAnalysis::ID = 0;
static llvm::RegisterAnalysisGroup<MyAnalysis> P("My Super Awesome Analysis");

char MyPass::ID = 0;
static llvm::RegisterPass<MyPass> X("my-pass", "My pass which provides MyAnalysis", true, true);

//This is the line that is necessary, but for some reason is never mentioned in the 
//llvm source or documentation. This adds MyPass to the analysis group MyAnalysis. 
//Note that the "true" arguemnt to the macro makes MyPass the default implementation.
//Omit it to register other passes.
static llvm::RegisterAnalysisGroup<MyAnalysis,true> Y(X);


char UsingPass::ID = 0;
static RegisterPass<UsingPass> X("using-pass", "Some other pass that uses MyAnalysis", true, true);
struct MyPass:public llvm::ImmutablePass,public MyAnalysis{
静态字符ID;
MyPass():llvm::ImmutablePass(ID){
}
///getAdjustedAnalysisPointer-此方法在执行过程时使用
///通过多重继承的分析接口。
虚拟无效*getAdjustedAnalysisPointer(分析ID PI){
if(PI==&MyAnalysis::ID)
返回(MyAnalysis*)此;
归还这个;
}
};
使用pass的结构:公共函数pass{
静态字符ID;
UsingPass():FunctionPass(ID){}
void getAnalysisUsage(AnalysisUsage&AU)const{
AU.addRequired();
}
虚拟布尔运行函数(函数&F){
MyAnalysis&info=getAnalysis();
...
//在这里使用分析
...
}
}
char MyAnalysis::ID=0;
静态llvm::RegisterAnalysisGroup P(“我的超级棒分析”);
char MyPass::ID=0;
静态llvm::RegisterPass X(“我的通行证”,“提供我的分析的我的通行证”,true,true);
//这一行是必要的,但由于某些原因,本手册中从未提及
//llvm源代码或文档。这会将MyPass添加到分析组MyAnalysis。
//请注意,宏的“true”参数使MyPass成为默认实现。
//忽略它以注册其他通行证。
静态llvm::RegisterAnalysisGroup Y(X);
charusingpass::ID=0;
静态寄存器类X(“使用过程”,“使用MyAnalysis的其他过程”,true,true);

更清楚地说,当我尝试按照编写LLVM过程文档中给出的说明进行操作时,出现了一个错误,即“两个具有相同参数的过程……试图注册”