【问题标题】:Machine Code based Control Flow Graph in LLVMLLVM 中基于机器代码的控制流图
【发布时间】:2018-02-06 21:28:19
【问题描述】:
LLVM 通常为其中间表示 (IR) 语言提供控制流图 (CFG)。您还可以使用little effort 获得基于源代码的高级 CFG。我想获得机器代码级别的 CFG。有没有办法得到这个?
我做了一些挖掘工作。在 LLVM 的后端代码生成阶段,有一个称为SSA-based Machine Code Optimizations 的阶段。这个阶段的信息不多。但是,我猜 LLVM 在某个中间阶段会生成基于 SSA 的机器代码。如果存在这样的阶段,那么我们可以根据该阶段的代码来制作基本块。使用这些基本块,可以在该阶段创建 CFG。任何人都可以就我必须在 LLVM 源代码树(可能在lib\CodeGen)中查找的任何信息的源文件提供任何线索吗?或者 class 会给我基于 SSA 的机器代码演练和基本块?我会很感激任何指针。
【问题讨论】:
标签:
llvm
llvm-ir
machine-code
control-flow-graph
ssa
【解决方案1】:
我想通了。
你需要为lib\Target\<target architecture>文件夹中的某个目标写MachineFunctionPass。
然后在runOnMachineFunction(MachineFunction &MF) 函数中,您可以通过调用MF.viewCFG() 函数来查看CFG(在调试模式下或在viewCFG 内部进行一些调整以使CFG 也处于发布模式)。
您可以通过MF 上的迭代器访问MachineBasicBlock 和MachineInstr。下面是一个例子:
int i = 0;
for (auto &MBB : MF) {
errs() << "Basic Block: " << i++ << "\n\n";
for (auto &MI : MBB) {
MI.print(errs(), true, false);
errs() << "\n";
}
}