x86 - 如何在 LLVM 中获取 IR 指令的操作码长度

标签 x86 llvm llvm-ir code-size

我需要获取与 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/

    相关文章:

    assembly - 项目组装-如何在项目组装 "Learning Vowel Letters"代码中添加标记?

    delphi - 如何在 Delphi 汇编器中将短条件跳转与分支目标对齐与 `.align` 协调起来?

    clang - 我遇到了此错误消息 : 'regparm' is not valid on this platform

    haskell - Mac OS、LLVM 3.7 和缺少 math.h header

    LLVM 将 if/else 插入现有的基本 block

    c - 如何将C函数映射到LLVM IR?

    winapi - 如何让这两行在 cmd 控制台中的不同行上打印

    c - 从 C 访问内联汇编器中定义的数组

    macos - 如何构建 LLVM 并将其链接到 libc++?

    LLVM ir 如何导入其他模块?