【问题标题】:LLVM traverse CFGLLVM 遍历 CFG
【发布时间】:2013-03-15 13:12:45
【问题描述】:

我想在函数的 CFG 上应用 DFS 遍历算法。因此,我需要 CFG 的内部表示。我需要定向边缘并发现MachineBasicBlock::const_succ_iterator。有没有办法通过使用FunctionPass 而不是MachineFunctionPass 来获得具有定向边缘的CFG?我想要这个的原因是我在使用MachineFunctionPass 时遇到问题。到目前为止,我已经编写了几个复杂的通行证,但我无法运行 MachineFunctionPass 通行证。

我发现:“MachineFunctionPass 是 LLVM 代码生成器的一部分,它在程序中每个 LLVM 函数的机器相关表示上执行。代码生成器通道由 TargetMachine::addPassesToEmitFile 和类似的专门注册和初始化例程,因此它们通常不能从 opt 或 bugpoint 命令运行。”...那么我如何运行MachineFunctionPass

当我尝试使用 opt 一个简单的 MachineFunctionPass 运行时,出现错误:

Pass 'mycfg' is not initialized.
Verify if there is a pass dependency cycle.
Required Passes:
opt: PassManager.cpp:638: void llvm::PMTopLevelManager::schedulePass(llvm::Pass*): Assertion `PI && "Expected required passes to be initialized"' failed.

所以我必须初始化通行证。但是在我的所有其他通行证中,我没有进行任何初始化,也不想使用INITIALIZE_PASS,因为我必须重新编译保持通行证注册的llvm文件......有没有办法继续使用static RegisterPass MachineFunctionPass ?我提到如果我更改为FunctionPass,我没有问题,所以确实可能是一个opt问题。

我已经开始了 CallGraph 的另一个通道。我正在有效地使用CallGraph &CG = getAnalysis<CallGraph>();。这是获得CFG-s的类似方式吗?到目前为止我发现的是来自CFG.hsucc_iterator/succ_begin/succ_end,但我认为我仍然必须以某种方式获得CFG 分析。

提前谢谢你!

【问题讨论】:

  • MachineBasicBlock 与 IR 有什么关系?除了 succ_iterator 或 pred_iterator 之外,您还需要什么? IR 已经是 CFG。
  • 好的。那我可以直接申请succ_iterator吗?我不需要以某种方式获得 CFG 分析,CFG 的内部表示?如果它已经存在,我会尝试使用它并更新我的问题(我在尝试这种方法时遇到了一些问题)。
  • 不,您不需要单独的分析通道即可获得 CFG。有用于获取 DominatorTree、DominanceFrontier 等的专用通行证,但 CFG 在设计上已经存在。如果您想了解如何迭代 CFG 的示例,请查看 DominanceFrontier.cpp
  • 感谢 DominanceFrontier.cpp 示例!

标签: llvm


【解决方案1】:

我认为您可能混淆了一些术语。每个函数中的基本块已经安排在一种 CFG 中,LLVM 为您提供了遍历它的工具。例如,请参阅my answer to this question

MachineFunction 生活在不同的层次上,除非你正在做一些非常特别的事情,否则这不是你应该操作的层次。它太低级了,也太针对特定目标了。有一些级别的概述here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多