LLVM中基于机器代码的控制流图

时间:2018-02-06 21:28:20

标签: llvm llvm-ir machine-code control-flow-graph ssa

LLVM通常为其中间表示(IR)语言提供控制流图(CFG)。您还可以使用little effort获得基于源代码的高级CFG。我希望在机器代码级别获得CFG。有没有办法得到这个?

我做了一点挖掘。在LLVM的后端代码生成阶段,有一个名为SSA-based Machine Code Optimizations的阶段。这个阶段的信息不多。但是,我猜LLVM在某个中间阶段生成基于SSA的机器代码。如果存在这样的阶段,那么我们可以根据该阶段的代码使用Basic Blocks。使用这些基本块,可以在该阶段创建CFG。任何人都可以在源文件中提供任何线索,我必须在LLVM源代码树中查找(可能在lib\CodeGen中)以查找有关此内容的任何信息?或者class会给我基于SSA的机器代码演练和基本块?我很感激任何指针。

1 个答案:

答案 0 :(得分:1)

我明白了。

您需要为lib\Target\<target architecture>文件夹中的某个目标编写runOnMachineFunction(MachineFunction &MF)

然后在MF.viewCFG()函数中,您可以通过调用viewCFG函数来查看CFG(在调试模式下或在MachineBasicBlock内进行一些调整以获得处于释放模式的CFG) )。

您可以通过MachineInstr上的迭代器访问MFint i = 0; for (auto &MBB : MF) { errs() << "Basic Block: " << i++ << "\n\n"; for (auto &MI : MBB) { MI.print(errs(), true, false); errs() << "\n"; } } 。以下是一个例子:

{{1}}