LLVM 的可选丰富反汇编输出¶
简介¶
LLVM 的默认反汇编输出是纯文本。为了让使用者能够更深入地了解指令的文本表示或重新格式化以获得更友好的显示,提供了一个可选的丰富反汇编输出。
此可选输出足以引用指令文本的各个部分。这适用于诸如反汇编器、列表文件生成器和漂亮打印器之类的客户端,这些客户端需要比原始指令和打印它们的能力更多的功能。
为了提供此功能,汇编文本用注释进行了标记。标记的语法足够简单,即使在使用者和生产者之间版本不匹配的情况下也能保持健壮。也就是说,语法通常不包含超出“此文本具有注释”的语义,因此使用者可以简单地忽略他们不理解或不关心的注释。
调用 LLVMCreateDisasm()
创建反汇编器上下文后,可以使用此调用启用可选输出
LLVMSetDisasmOptions(DC, LLVMDisassembler_Option_UseMarkup);
然后,后续对 LLVMDisasmInstruction()
的调用将返回带有标记注释的输出字符串。
指令注释¶
上下文标记¶
带注释的汇编显示将提供上下文标记,以帮助客户端更有效地实现漂亮打印器等功能。大多数标记将与目标无关,因此客户端可以在没有任何目标特定知识的情况下有效地提供良好的显示。
带注释的汇编通过正常的指令打印机,但可以选择在指令字符串的部分内容上包含上下文标记。注释是任何以“<”和“>”分隔的文本段(1)。
annotation: '<' tag-name tag-modifier-list ':' annotated-text '>'
tag-name: identifier
tag-modifier-list: comma delimited identifier list
标记名称是一个标识符,用于指示注释的类型。对于第一遍,这将非常简单,内存引用、寄存器和立即数分别具有标记名称“mem”、“reg”和“imm”。
标记修饰符列表通常是其他目标特定的上下文,例如寄存器类。
客户端应该接受并忽略他们不理解的任何标记名称或标记修饰符,允许注释变得更加丰富,而不会破坏旧的客户端。
例如,ARM 堆栈相对位置加载的可能注释可以注释为
ldr <reg gpr:r0>, <mem regoffset:[<reg gpr:sp>, <imm:#4>]>
1:对于“<”和/或“>”是合法标记的汇编方言,文字标记通过紧随其后重复字符来转义。例如,文字“<”字符在带注释的汇编字符串中输出为“<<”。
C API 细节¶
此信息的预期使用者使用 C API,因此将向反汇编器的 C API 函数添加一个新函数,以提供一个选项来生成带有注释的反汇编指令,LLVMSetDisasmOptions()
和 LLVMDisassembler_Option_UseMarkup
选项(见上文)。