【问题标题】:How can I get the opcode length of an IR instruction in LLVM如何在 LLVM 中获取 IR 指令的操作码长度
【发布时间】:2017-02-25 08:57:52
【问题描述】:

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

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

我的问题是:

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

【问题讨论】:

  • 正如您所暗示的,IR 指令与降低到目标特定指令之间没有单一的关系,因此您不能这样做。

标签: x86 llvm llvm-ir code-size


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

llvm-bcanalyzer ret.bc

如果你想破解,你可以write an LLVM pass 但它不适合后端(这会更容易)。您可以编写 IR 通行证或 MIR 通行证。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    • 2014-12-28
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多