gpt4 book ai didi

c++ - LLVM 在 std::vector 中存储 Loop*

转载 作者:太空狗 更新时间:2023-10-29 21:19:40 24 4
gpt4 key购买 nike

我遇到了一些非常奇怪的事情——我正在编写一个 LLVM 模块 Pass。我遍历模块的所有函数,然后遍历每个非声明函数的所有循环,并将指向循环的指针存储在 std::vector 中。这是来源:

virtual bool runOnModule(Module& Mod){
std::vector<Loop*> loops;
// first gather all loop info
for(Module::iterator f = Mod.begin(), fend = Mod.end(); f != fend; ++f){
if (!(*f).isDeclaration()){
LoopInfo& LI = getAnalysis<LoopInfo>(*f);
for(LoopInfo::iterator l = LI.begin(), lend = LI.end(); l != lend; ++l){
loops.push_back(*l);
}
}
}
for (auto& l: loops) errs () << *l << " ";
}

现在,如果我运行它,我会收到运行时错误 - 它无法打印循环,不知何故我正在执行空指针取消引用或其他操作。有什么想法吗?

最佳答案

您必须确保 LoopInfo pass 在您的 pass 之前实际运行。这是一个完整的示例 - 来自 opt 的 stanalone:

class AnalyzeLoops : public FunctionPass {
public:
AnalyzeLoops()
: FunctionPass(ID) {}

void getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequired<LoopInfo>();
}

virtual bool runOnFunction(Function &F) {
LoopInfo &LI = getAnalysis<LoopInfo>();
for (LoopInfo::iterator L = LI.begin(), LE = LI.end(); L != LE; ++L) {
(*L)->dump();
}
return false;
}

static char ID;
};

此外,在创建通行证时,请执行以下操作:

  PassManager PM;
PM.add(new LoopInfo());
PM.add(new AnalyzeLoops());
PM.run(*Mod);

我怀疑要让 opt 在传递之前实际运行 LoopInfo,您也应该传递 -loops

另外,请注意我定义了 getAnalysisUsage - 如果 LoopInfo 在此之前未运行,这将使 LLVM 提示,使问题更加明显。


请注意,LoopInfo 特别是一个 FunctionPass,作为分析,它必须从另一个 FunctionPass 中使用。 LoopInfo 数据结构在不同的函数之间并不真正存在,并且由于它拥有自己的数据(那些 Loop* 对象),它们也会被销毁。

如果您真的需要 ModulePass,您可以做的一件事就是手动调用 LoopInfo,而不是作为分析。当您迭代模块中的函数时,为每个函数创建一个新的 LoopInfo 对象并使用其 runOnFunction 方法。即使在这种情况下,如果您想使用后者,您也必须确保拥有给定 Loop*LoopInfo 存在。

关于c++ - LLVM 在 std::vector 中存储 Loop*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26546332/

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