LLVM通常为其中间表示(IR)语言提供控制流图(CFG)。您还可以使用little effort获得基于源代码的高级CFG。我希望在机器代码级别获得CFG。有没有办法得到这个?
我做了一点挖掘。在LLVM的后端代码生成阶段,有一个名为SSA-based Machine Code Optimizations的阶段。这个阶段的信息不多。但是,我猜LLVM在某个中间阶段生成基于SSA的机器代码。如果存在这样的阶段,那么我们可以根据该阶段的代码使用Basic Blocks。使用这些基本块,可以在该阶段创建CFG。任何人都可以在源文件中提供任何线索,我必须在LLVM源代码树中查找(可能在lib\CodeGen
中)以查找有关此内容的任何信息?或者class
会给我基于SSA的机器代码演练和基本块?我很感激任何指针。
答案 0 :(得分:1)
我明白了。
您需要为lib\Target\<target architecture>
文件夹中的某个目标编写runOnMachineFunction(MachineFunction &MF)
。
然后在MF.viewCFG()
函数中,您可以通过调用viewCFG
函数来查看CFG(在调试模式下或在MachineBasicBlock
内进行一些调整以获得处于释放模式的CFG) )。
您可以通过MachineInstr
上的迭代器访问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";
}
}
。以下是一个例子:
{{1}}