从(非LLVM)代码获取llvm :: LoopInfo?

问题描述:

对于我自己的Pass的开发,我想编写单元测试 - 我有很多'纯粹'的帮助器方法,所以它们看起来是单元测试的理想候选者。但其中一些需要一个llvm :: LoopInfo实例作为参数。从(非LLVM)代码获取llvm :: LoopInfo?

在我的(功能 - )通我只是用

void getAnalysisUsage(llvm::AnalysisUsage &AU) const override { 
    AU.setPreservesCFG(); 
    AU.addRequired<llvm::LoopInfoWrapperPass>(); 
} 
... 
llvm::LoopInfo &loopInfo = getAnalysis<LoopInfoWrapperPass>(F).getLoopInfo(); 

得到这个信息对象。

在我的单元测试我目前解析我llvm::Functionvoid foo()(我想运行我的分析),从盘是这样的:

llvm::SMDiagnostic Err; 
llvm::LLVMContext Context; 
std::unique_ptr<llvm::Module> module(parseIRFile(my_bc_filename, Err, Context)); 
llvm::Function* foo = module.operator*().getFunction("foo"); 

来完成我的测试,我将不得不填写以下存根:

llvm::LoopInfo& = /*run LoopInfoWrapperPass on foo and return LoopInfo element */; 

我的第一次尝试是基于使用PassManager<Function>(页眉“LLVM/IR/PassManager.h”),AnalysisManager<Function>,类LoopInfoWrapperPass,但我无法在线找到任何用法示例LLVM 4.0和更旧的示例似乎使用了先前版本的PassManager,但我没有看到如何使用LegacyPassManager。我试图寻找PassManager的源代码,但无法充分理解typedefs和模板参数(它们增加了我对C++作为一种语言的不合理反感)。

如何填写该存根?我如何在简单的C++代码中调用此分析通道(并获取LoopInfo)?

PS:除了我需要使用的LoopInfoWrapperPass之外,还有更多的通行证,但我假设这种方式应该可以转移到任何分析通行证。

PPS:我正在使用googletest作为单元测试框架,使用CMake构建配置使得单元测试自己的目标,并且构建了LLVM 4.0二进制库中的Pass out-tree。 1,如果有任何相关的话。

我不确定您的单元测试是如何构建的,但是在LLVM源代码树中浏览是个不错的主意。

一个例子可以在CFGTest.cpphere中找到。 您需要自行创建PassManager和管道。从我在这方面的短时间经验来看,它适用于小型测试,但是一旦您需要更大的数据或传入/输出数据,它实际上是有限制的,因为LoopInfo数据只在管道内(又名runOn()方法和朋友)有意义。如果没有使用pass manager基础结构,你可能想要更简单的,恕我直言,自己创建所需分析集合的方法(在LoopInfo的情况下只有支配者)。这个例子可以看到here

希望这会有所帮助。