assembly - LLVM 中的 getOpcode 是什么?

标签 assembly llvm code-generation opcode

LLVM 代码生成器部分的 MCInstrDescMachineInstr 类中的函数 getOpcode() 返回什么?我无法与机器的实际操作码联系起来。

例如,对于 x86 中的 RET 指令,getOpcode() 函数返回 2515。然而,x86 中真正的操作码是 C3(十进制的 195)。

有什么关系?

最佳答案

MCInstrDesc 和 MachineInstr 上的 getOpcode() 成员函数返回枚举值,该值标识 X86InstrInfo.td 中的操作码。该指令代表。在其他后端中,编号对应于该后端的指令信息,通常是一个名为 [BACKEND]InstrInfo.td 的文件。

您可以找到在许多 X86 后端 channel 中使用的示例,例如 X86ExpandPseudo.cpp 中的以下代码处理尾调用返回。

switch (MI.getOpcode()) {
default:
  return false;
case X86::TCRETURNdi:
case X86::TCRETURNdicc:
case X86::TCRETURNri:
case X86::TCRETURNmi:
case X86::TCRETURNdi64:
case X86::TCRETURNdi64cc:
case X86::TCRETURNri64:
case X86::TCRETURNmi64: {
  /* ... */
}
/* ... */
}

关于assembly - LLVM 中的 getOpcode 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48894012/

相关文章:

python - 导入错误: No module named 'llvmlite.llvmpy.ee'

.net - 可以更改数据库架构的最佳方法?

scala - 在 Shapeless 中,我可以为非 case 类提供 `LabelledGeneric` 的实例,以启用类型类实例的自动派生吗?

java - 有没有办法让 IDEA 生成的 GUI 代码可见?

linux - 基于用户输入的汇编调用子程序

c - 需要弄清楚以下内联汇编代码的含义

assembly - 在长模式下更改 GDT 并更新 CS

assembly - 有什么方法可以编写 Intel CPU 直接核对核通信代码吗?

LLVM IR alloca 指令

c++ - 一切都不稳定