Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从(非llvm)代码获取llvm::LoopInfo?_C++_Unit Testing_Llvm_Llvm 4.0 - Fatal编程技术网

C++ 从(非llvm)代码获取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>(); }

为了开发我自己的Pass,我想编写单元测试——我有很多“纯”辅助方法,所以它们似乎是单元测试的理想候选方法。但其中一些需要llvm::LoopInfo的实例作为参数

在我的(函数-)过程中,我只使用

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
数据只在管道中有意义(aka
runOn()
方法和朋友)

否则,您可能希望选择(没有双关语)更简单的IMHO方法,自己创建所需的分析集(仅在
LoopInfo
的情况下是支配者),而不使用pass manager基础结构。我们可以看到这样一个例子

希望这有帮助

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