2

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

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

4

1 回答 1

1

我想到了。

您需要为文件夹MachineFunctionPass中的某个目标编写内容。lib\Target\<target architecture>

然后在runOnMachineFunction(MachineFunction &MF)函数中,您可以通过调用函数来查看 CFG MF.viewCFG()(在调试模式下或在内部进行一些调整viewCFG以获得发布模式下的 CFG)。

您可以通过迭代器访问MachineBasicBlockMachineInstr通过MF. 下面是一个例子:

int i = 0;
for (auto &MBB : MF) {
    errs() << "Basic Block: " << i++ << "\n\n";
    for (auto &MI : MBB) {
      MI.print(errs(), true, false);
      errs() << "\n";
    }
}
于 2018-02-13T21:43:33.103 回答