4

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

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

我的问题是:

  • 这一般可能吗?
  • 如何破解后端转储所需的信息?有没有通用的方法可以做到这一点,还是我需要破解所有后端?
4

1 回答 1

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. 要获得位码大小,sizellvm-size都不起作用,但您可以使用llvm-bcanalyzer

llvm-bcanalyzer ret.bc

如果你想破解,你可以写一个 LLVM 通行证,但它不会用于后端(这会更容易)。您可以编写 IR 通行证或 MIR 通行证。

于 2020-11-28T16:54:11.853 回答