gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:08:15 25 4
gpt4 key购买 nike

为了开发我自己的通行证,我想编写单元测试 - 我有很多“纯”辅助方法,因此它们似乎是单元测试的理想候选者。但其中一些需要 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");

要完成我的测试,我必须填写以下 stub :

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

我的第一次尝试是基于使用 PassManager<Function> (在 header “llvm/IR/PassManager.h”中),AnalysisManager<Function> , 和类 LoopInfoWrapperPass ,但我无法在网上找到 LLVM 4.0 的任何示例用法 - 较旧的示例似乎使用的是以前版本的 PassManager,而且我没有看到如何使用 LegacyPassManager .我试图查看 PassManager 的来源但无法充分理解 typedef 和模板参数(它们增加了我对 C++ 作为一种语言的非理性厌恶)。

我该如何填写那个 stub ?如何在我的纯 C++ 代码中调用此 Analysis Pass(并获取 LoopInfo)?

PS:除了 LoopInfoWrapperPass,我还需要使用更多的 channel ,但我假设这种方式应该可以转移到任何分析 channel 。

PPS:我正在使用 googletest 作为单元测试框架,使用 CMake 构建配置使单元测试自己的目标,并且我正在针对 LLVM 4.0.1 的二进制库构建我的 Pass out-of-tree ,如果其中任何一个在某种程度上是相关的。

最佳答案

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

可以在 CFGTest.cpp 中找到一个示例 here .您需要自己创建 PassManager 和管道。根据我在这方面的短暂经验,它适用于小型测试,但是一旦您需要更大的东西或将数据传入/传出,它就会真正受到限制,因为 LoopInfo 数据仅在管道内有意义(又名 runOn() 方法和 friend )。

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

希望这对您有所帮助。

关于c++ - 从(非 LLVM)代码获取 llvm::LoopInfo?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46193765/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com