我需要获取与 x86 架构中特定 LLVM IR 指令相对应的操作码的偏移量和确切长度。我相信为此我必须破解后端。
我假设在 x86 后端生成操作码时有一种方法可以转储它们的偏移量和大小。但是,考虑到一条 IR 指令到多个操作的优化和转换,我不确定单个 IR 指令与其对应的操作码之间的关系是否可维护。
我的问题是:
- 这一般可能吗?
- 如何破解后端转储所需的信息?有没有通用的方法可以做到这一点,还是我需要破解所有后端?
通常,您不能假设一块 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
. 要获得位码大小,size和llvm-size都不起作用,但您可以使用llvm-bcanalyzer。
llvm-bcanalyzer ret.bc
如果你想破解,你可以写一个 LLVM 通行证,但它不会用于后端(这会更容易)。您可以编写 IR 通行证或 MIR 通行证。