我需要获取与 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
分解回 IR .要获得位码大小,size 和 llvm-size 都不起作用,但您可以使用 llvm-bcanalyzer。llvm-bcanalyzer ret.bc
如果你想破解,你可以 write an LLVM pass但它不会用于后端(这会使它更容易)。您可以编写 IR 通行证或 MIR 通行证。
关于x86 - 如何在 LLVM 中获取 IR 指令的操作码长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42453974/