C++ 使用LLVM LegacyPassManager获取分析结果
我目前正在编写一个使用LLVM的程序,但它本身并不是一个过程。为此,我想利用几个分析过程,但不是从一个过程上下文 作为一个具体的例子,我想使用C++ 使用LLVM LegacyPassManager获取分析结果,c++,llvm,analysis,C++,Llvm,Analysis,我目前正在编写一个使用LLVM的程序,但它本身并不是一个过程。为此,我想利用几个分析过程,但不是从一个过程上下文 作为一个具体的例子,我想使用RegionInfo信息RegionInfo-pass可以提供给我的信息 现在我看到LLVM有两个PassManager,一个新的和一个旧的。如果我没有弄错的话,RegionInfo(给定新的PassManager)的提取应该使用以下代码(更多更少)(): void从\u-out\u调用了\u-of-llvm(llvm::Function&f){ llvm
RegionInfo
信息RegionInfo-pass
可以提供给我的信息
现在我看到LLVM有两个PassManager,一个新的和一个旧的。如果我没有弄错的话,RegionInfo
(给定新的PassManager)的提取应该使用以下代码(更多更少)():
void从\u-out\u调用了\u-of-llvm(llvm::Function&f){
llvm::PassBuilder-pb;
llvm::功能分析管理器fam;
pb.注册功能分析(fam);
llvm::RegionInfo&ri=fam.getResult(f);
}
但是,这不起作用,因为regioninfo-pass
是一个旧密码,因此必须与旧密码管理器一起使用
就我所见,使用旧PassManager检索分析结果的唯一方法是在另一个pass中调用getAnalysis
。因此,我尝试创建一个包装器过程并调用它:
#包括
#包括
#包括
模板
课堂分析结果;
/*这将实现一个虚拟过程,用于检索请求的分析和
*将其“泄漏”到创建过程的AnalysisResult实例。
*/
模板
结构提取器:公共llvm::FunctionPass{
分析结果&结果;
std::函数分析功能;
静态字符ID;
提取器(AnalysisResult&result,std::function analysis_func):llvm::FunctionPass(ID),result(结果),analysis_func(analysis_func){}
虚拟void getAnalysisUsage(llvm::AnalysisUsage&au)常量重写{au.addRequired();}
bool runOnFunction(llvm::Function&func)重写{
P&P=getAnalysis
();
结果&res=分析函数&p;
result.result=&res;
返回false;
}
};
模板
字符提取器::ID=0;
/*这将构造遗留PassManager,从上面添加虚拟过程并运行它*/
模板
结构分析结果{
llvm::legacy::FunctionPassManager fpm;
std::函数分析功能;
结果*Result=nullptr;
分析结果(llvm::Function&func,std::Function f):fpm(func.getParent()),分析函数(f){
fpm.添加(新提取器(*此,分析功能));
fpm.doInitialization();
fpm.run(func);
}
~AnalysisResult(){fpm.doFinalization();}
Result&get_Result(){
断言(结果!=nullptr);
返回*结果;
}
};
/*这只是一个尝试模仿新PassManager接口的方便函数*/
模板
分析结果getLLVMAnalysis(llvm::Function&func,std::Function f){
//好吧,这是隐含的
返回分析结果(func,f);
}
/*getRegionInfo已重载,因此请将其作为包装器提供给
*使函数指针转换为std::function成为可能
*/
RegionInfo和伪函数(RegionInfo通过*rip){
返回rip->getRegionInfo();
}
/*使用上述所有辅助结构的实际程序函数*/
void从\u-out\u调用了\u-of-llvm(llvm::Function&f){
llvm::PassRegistry®istry=*llvm::PassRegistry::getPassRegistry();
初始化分析(注册);
AnalysisResult ar=getLLVMAnalysis(f,伪函数);
RegionInfo&ri=ar.get_result();
ri.view();//这是一个错误
}
这段代码的问题是,当我想使用分析结果时,它会出现故障。我不确定为什么会发生这种情况,但似乎分析结果会直接在fpm.run()
函数中删除。然而,替换fpm.run()
并不是一件小事(我想到了子类化),因为它是在非公共子类中用PImpl实现的
如果可以运行分析过程并在过程上下文之外使用结果,您能给我一个提示吗