为了开发我自己的Pass,我想编写单元测试 - 我有很多'纯'辅助方法,因此它们似乎是单元测试的理想候选者。但其中一些需要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
的来源但是对typedef和模板参数没有足够的认识(并且它们增加了我对C ++语言的非理性厌恶)。
如何填写该存根?如何在我的普通C ++代码中调用此Analysis Pass(并获取LoopInfo)?
PS:除了我需要使用的LoopInfoWrapperPass之外还有更多的传递,但我认为这种方式应该可以转移到任何Analysis Pass。
PPS:我使用googletest作为单元测试框架,使用CMake构建配置使单元测试自己的目标,并且我正在构建针对LLVM 4.0.1的二进制库的Pass out-of-tree ,如果其中任何一个在某种程度上相关。