C++ 从(非llvm)代码获取llvm::LoopInfo?
为了开发我自己的Pass,我想编写单元测试——我有很多“纯”辅助方法,所以它们似乎是单元测试的理想候选方法。但其中一些需要llvm::LoopInfo的实例作为参数 在我的(函数-)过程中,我只使用C++ 从(非llvm)代码获取llvm::LoopInfo?,c++,unit-testing,llvm,llvm-4.0,C++,Unit Testing,Llvm,Llvm 4.0,为了开发我自己的Pass,我想编写单元测试——我有很多“纯”辅助方法,所以它们似乎是单元测试的理想候选方法。但其中一些需要llvm::LoopInfo的实例作为参数 在我的(函数-)过程中,我只使用 void getAnalysisUsage(llvm::AnalysisUsage &AU) const override { AU.setPreservesCFG(); AU.addRequired<llvm::LoopInfoWrapperPass>(); }
void getAnalysisUsage(llvm::AnalysisUsage &AU) const override {
AU.setPreservesCFG();
AU.addRequired<llvm::LoopInfoWrapperPass>();
}
...
llvm::LoopInfo &loopInfo = getAnalysis<LoopInfoWrapperPass>(F).getLoopInfo();
为了完成我的测试,我必须填写以下存根:
llvm::LoopInfo& = /*run LoopInfoWrapperPass on foo and return LoopInfo element */;
我的第一次尝试是基于使用PassManager
(标题为“llvm/IR/PassManager.h”)、AnalysisManager
,以及类LoopInfoWrapperPass
,但我在llvm 4.0上找不到任何在线使用的示例,而以前的示例似乎使用的是早期版本的PassManager,我没有看到如何使用LegacyPassManager
。我试图查看<代码>密码管理器>代码源,但不能充分理解Type和Debug参数(它们增加了我对C++语言的非理性厌恶)。
如何填写存根?我如何调用我的C++代码中的分析传递(和获取LoopFipe)?<强> < /P>
PS:除了LoopInfoWrapperPass之外,我还需要使用更多的过程,但我假设这种方法应该可以转移到任何分析过程中
PPS:我使用googletest作为单元测试框架,使用CMake构建配置,使单元测试成为自己的目标,并且我正在针对LLVM 4.0.1的二进制libs构建我的树外传递,如果其中任何一个与此相关的话。我不确定您的单元测试是如何构建的,但是在LLVM源代码树中四处查看是一个好主意 一个例子可以在
CFGTest.cpp
中找到。
您需要自己创建PassManager
和管道。从我在这方面的短期经验来看,它适用于小型测试,但一旦您需要任何更大的数据或传入/传出数据,它就会受到限制,因为LoopInfo
数据只在管道中有意义(akarunOn()
方法和朋友)
否则,您可能希望选择(没有双关语)更简单的IMHO方法,自己创建所需的分析集(仅在LoopInfo
的情况下是支配者),而不使用pass manager基础结构。我们可以看到这样一个例子
希望这有帮助
llvm::LoopInfo& = /*run LoopInfoWrapperPass on foo and return LoopInfo element */;