从(非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::Function
void 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,如果有任何相关的话。