我是LLVM的新手。我需要在每个基本块之前进行转换传递,我需要插入此指令' mov $ 0,r15'。 假设我知道如何遍历基本块,我的斗争是插入这个汇编代码。
有人可以写一些示例代码吗?或者指出一些例子?
答案 0 :(得分:1)
首先,快速说明。 LLVM同时具有BasicBlock
和MachineBasicBlock
s。前者是IR Instruction
的块。后者是一组特定于目标的MachineInstr
。你想与后者合作。
至于实际插入指令,使用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
答案 1 :(得分:0)
使用内联汇编创建C源,使用clang -c -emit-llvm
将其编译为LLVM bitcode,然后运行llc -march=cpp out.bc
。这将产生C ++源代码,调用生成输入bitcode文件所需的LLVM API。