如何在LLVM中获取IR指令的操作码长度

时间:2017-02-25 08:57:52

标签: x86 llvm llvm-ir

我需要获得与x86架构中特定LLVM IR指令相对应的偏移量和操作码的确切长度。我相信我必须破解后端。

我假设有一种方法可以在x86后端生成操作码以转储它们的偏移量和大小。 但是,考虑到将一个IR指令优化并转换为多个操作,我不确定单个IR指令与其相应操作码之间的关系是否可维护。

我的问题是:

  • 这通常是可能的吗?
  • 如何破解后端以转储所需的信息?是否有通用的方法,或者我是否需要破解所有后端?

1 个答案:

答案 0 :(得分:1)

通常,您不能假定一个LLVM IR会映射到一个X86中。可以根据开关和相邻代码以各种奇怪的方式对IR进行重组和优化。但是,按照附带条件说,希望这会有所帮助。

您可以编写LLVM IR,将其包装在函数中并从中生成代码。例如,这是回报

define void @ lr1() {
    ret void
}

您可以使用LLVM静态编译器 llc 从其中生成x86_64指令:

llc -march=x86-64 ret.ll

它将生成x86_64指令,如下所示:

    .section    __TEXT,__text,regular,pure_instructions
    .build_version macos, 11, 0
    .globl  _lr1                            ## -- Begin function lr1
    .p2align    4, 0x90
_lr1:                                   ## @lr1
    .cfi_startproc
## %bb.0:
    retq
    .cfi_endproc
                                        ## -- End function
.subsections_via_symbols

这将告诉您很多有关IR走向X86机器代码的过程。如果您对IR本身以及IR的大小感兴趣,则需要查看使用 opt

将其序列化的位码。
opt ret.ll -o ret.bc

bc文件是二进制LLVM位代码文件,可以使用LLVM位代码解释器 lli 对其进行解释。可以使用llvm-dis将它们拆回到IR中。要获取 size llvm-size 都不起作用,但是可以使用 llvm-bcanalyzer

llvm-bcanalyzer ret.bc

如果您想黑客入侵,可以write an LLVM pass,但它不是用于后端的(这样会更容易)。您可以编写IR通行证或MIR通行证。