【发布时间】: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.h 的succ_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