llvm后端disassembler流程

发布时间 2023-04-19 11:57:12作者: lixycc

一、注册

 在添加 \(disassembler\) 时,在 llvm/lib/Target/XXX/Disassembler/XXXDisassembler.cpp 中会通过
\(RegisterMCDisassembler()\) 将该 \(pass\) 进行注册。

二、调用

(1)在 \(XXXDisassembler.cpp\) 中的 \(getInstruction(...)\) 函数重新定义了基类 \(MCDisassembler\) 中的纯虚函数 virtual DecodeStatus getInstruction(...) const = 0;,然后在顶层的 lib/MC/MCDisassembler/Disassembler.cpp 中的 \(LLVMDisasmInstruction()\) 就会调用到派生类中实现的函数 \(getInstruction()\) 函数;
(2)在派生类的 \(getInstruction()\) 中会调用 \(decodeInstruction()\) 对每条指令的目标代码进行反汇编,\(decodeInstruction()\) 位于通过 \(TableGen\) 工具生成的 \(XXXGenDisassemblerTables.inc\) 文件中;
(3)在 \(decodeInstruction()\) 中会通过查表的方式,查询对应该目标代码的指令信息,查询的表也在 \(inc\) 文件中:\(DecoderTableXXX[]\)
(4)当上一过程中查询到该指令后,会进入 \(decodeToMCInst()\),在该函数中会调用定义在 \(XXXDisassembler.cpp\) 中的各种 \(decodeXXX()\) 函数对目标代码进行反汇编,反汇编得到的指令 \(MI\),会在顶层的 lib/MC/MCDisassembler/Disassembler.cpp 中的 \(LLVMDisasmInstruction()\) 中通过 IP->printInst(&Inst, PC, AnnotationsStr, *DC->getSubtargetInfo(), FormattedOS); 操作输出。