【问题标题】:How to insert assembly code via LLVM?如何通过 LLVM 插入汇编代码?
【发布时间】:2015-10-01 15:03:34
【问题描述】:

我对 LLVM 很陌生。我需要进行一次转换,在每个基本块之前,我需要插入这条指令'mov $0,r15'。 假设我知道如何遍历基本块,我的困难是插入这个汇编代码。

谁能写一些示例代码?或指出一些例子?

【问题讨论】:

    标签: assembly clang llvm


    【解决方案1】:

    首先,简要说明一下。 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

    【讨论】:

      【解决方案2】:

      使用内联汇编创建 C 源代码,使用 clang -c -emit-llvm 将其编译为 LLVM 位代码,然后运行 ​​llc -march=cpp out.bc。这将为您生成 C++ 源代码,并调用生成输入位码文件所需的 LLVM API。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-21
        • 1970-01-01
        • 2010-12-06
        • 2022-10-15
        • 2012-01-26
        • 1970-01-01
        • 2022-01-21
        • 2016-03-21
        相关资源
        最近更新 更多