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

Machine Code based Control Flow Graph in LLVM

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

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

我明白了。

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

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

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

int i = 0;
for (auto &MBB : MF) {
    errs() << "Basic Block: " << i++ << "\n\n";
    for (auto &MI : MBB) {
      MI.print(errs(), true, false);
      errs() << "\n";
    }
}