C++ 使用LLVM LegacyPassManager获取分析结果

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

我目前正在编写一个使用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实现的

如果可以运行分析过程并在过程上下文之外使用结果,您能给我一个提示吗