如何通过LLVM插入汇编代码?

时间:2015-10-01 15:03:35

标签: assembly clang llvm

我是LLVM的新手。我需要在每个基本块之前进行转换传递,我需要插入此指令' mov $ 0,r15'。 假设我知道如何遍历基本块,我的斗争是插入这个汇编代码。

有人可以写一些示例代码吗?或者指出一些例子?

2 个答案:

答案 0 :(得分:1)

首先,快速说明。 LLVM同时具有BasicBlockMachineBasicBlock 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。