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

时间:2017-09-13 09:28:59

标签: c++ unit-testing llvm llvm-4.0

为了开发我自己的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 ,如果其中任何一个在某种程度上相关。

1 个答案:

答案 0 :(得分:1)

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

可以在CFGTest.cpp here中找到一个示例。 您需要自己创建PassManager和管道。从我对此的短暂经验来看,它适用于小型测试,但是一旦你需要更大的内容或传入/传出数据,它就会受到限制,因为LoopInfo数据在管道中只有意义(又名runOn()方法和朋友)。

否则,您可能希望选择(没有双关语)更简单的恕我直言,自己创建所需分析集的方法(仅LoopInfo的情况下的支配者),而不使用传递管理器基础结构。可以看到here的一个例子。

希望这有帮助。