【发布时间】:2015-10-01 15:03:34
【问题描述】:
我对 LLVM 很陌生。我需要进行一次转换,在每个基本块之前,我需要插入这条指令'mov $0,r15'。 假设我知道如何遍历基本块,我的困难是插入这个汇编代码。
谁能写一些示例代码?或指出一些例子?
【问题讨论】:
我对 LLVM 很陌生。我需要进行一次转换,在每个基本块之前,我需要插入这条指令'mov $0,r15'。 假设我知道如何遍历基本块,我的困难是插入这个汇编代码。
谁能写一些示例代码?或指出一些例子?
【问题讨论】:
首先,简要说明一下。 LLVM 同时拥有BasicBlocks 和MachineBasicBlocks。前者是 IR Instructions 的块。后者是一组特定于目标的MachineInstructions。你想和后者一起工作。
至于实际插入指令,使用 BuildMI 就很容易了(完全未经测试的代码——只是展示了一般原理):
TargetInstrInfo *TII = ...; // An instance of X86InstrInfo or similar
for (MachineBasicBlock *MBB = ...) {
DebugLoc dl; // Empty debugging location
BuildMI(MBB, MBB.begin(), dl, TII->get(X86::MOV64ri32),
X86::R15).addImm(0);
}
BuildMI 的文档在这里:http://llvm.org/docs/doxygen/html/namespacellvm.html#a980570dc1410d4ef53806f82028ca381
(请注意,有很多重载——检查哪一个适用于您)
这可能实际上不是您要使用的指令,在这种情况下,请在此处查找指令表:https://github.com/llvm-mirror/llvm/blob/master/lib/Target/X86/X86InstrInfo.td
这里同样有一个寄存器表:https://github.com/llvm-mirror/llvm/blob/master/lib/Target/X86/X86RegisterInfo.td
【讨论】:
使用内联汇编创建 C 源代码,使用 clang -c -emit-llvm 将其编译为 LLVM 位代码,然后运行 llc -march=cpp out.bc。这将为您生成 C++ 源代码,并调用生成输入位码文件所需的 LLVM API。
【讨论】: