我需要获得与x86架构中特定LLVM IR指令相对应的偏移量和操作码的确切长度。我相信我必须破解后端。
我假设有一种方法可以在x86后端生成操作码以转储它们的偏移量和大小。 但是,考虑到将一个IR指令优化并转换为多个操作,我不确定单个IR指令与其相应操作码之间的关系是否可维护。
我的问题是:
答案 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通行证。