【问题标题】:How to identify different loop types in LLVM IR, such as while, for and do-while?如何识别 LLVM IR 中的不同循环类型,例如 while、for 和 do-while?
【发布时间】:2017-11-06 16:11:05
【问题描述】:

我想识别 LLVM IR 中的 while 循环,我使用 LoopInfoWrapperPass 来获取 loopInfo。

LoopInfo &LoopInfo = getAnalysis(*F).getLoopInfo();

我没有找到相关的API来区分不同的循环类型。

【问题讨论】:

  • LoopInfo &LoopInfo = getAnalysis(*F).getLoopInfo();
  • 无法在 LLVM 级别区分 while 循环和等效的 for 循环,因为它们将生成完全相同的 LLVM 代码。
  • @sepp2k 非常感谢
  • @LingyunSITU:但是从基本块名你就可以识别出什么是哪个循环了
  • 你想好怎么做了吗? LoopInfo &LoopInfo = getAnalysis(*F).getLoopInfo(); 不提供 API 来区分不同类型的循环。此外,LLVM IR 代码不包含用于区分的指标。

标签: loops llvm llvm-ir


【解决方案1】:

对于 LLVM IR,如果您查看 Loop API,就会发现相关调用,例如 getStartLoc。所以你可以做这样的事情(例如在llvm::Function pass 的runOn 方法中):

llvm::SmallVector<llvm::Loop *> workList;
auto &LI = getAnalysis<llvm::LoopInfoWrapperPass>(CurFunc).getLoopInfo();

std::for_each(LI.begin(), LI.end(), [&workList](llvm::Loop *e) { workList.push_back(e); });

for(auto *e : workList) {
      auto line = e->getStartLoc().getLine();
      auto *scope = llvm::dyn_cast<llvm::DIScope>(e->getStartLoc().getScope());
      auto filename = scope->getFilename();

      // do stuff here
    }

现在从源代码行中您可以确定它是哪种循环。

【讨论】:

    猜你喜欢
    • 2015-02-16
    • 1970-01-01
    • 2021-07-27
    • 2011-04-07
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 2015-12-20
    相关资源
    最近更新 更多