LLVM 如何检测何时生成特定的 ASM 指令序列

LLVM How to detect when a specific ASM instruction sequence is generated

我正在使用 llvm 编译我的 C 程序。我想知道是否生成了特定的汇编序列,如果生成了,它与哪个源代码行相关联。例如,我想在每次生成 push %eax 指令时记录。有什么办法可以解决这个问题吗?

以防其他人遇到类似问题。

我看的地方是LLVMs后端代码。我特别关注 X86 汇编生成。

有两个主要区域可以修改和添加测试。

  1. ASMPrinter class 在 lib/CodeGen/ASMPrinter/ASMPrinter.cpp 有不同的发射函数来处理函数、基本块等。通过它们。这些函数遍历每个机器指令 MI,其中具有 getOperand()getOpCode() 等函数,以根据要求检查特定指令。

每个特定的操作码和实际指令都在目标特定文件中指定,例如lib/Target/X86/X86GenInstrInfo.inc

  1. 以上函数依次调用目标特定子class函数。在我的例子中,它们是 X86AsmPrinter 和类似的 classes。

四处查看添加日志语句,例如

errs()<<"Opcode is "<<MI.getOpcode()<<"\n";
MI.dump();

并且您可以在 运行 llc file.bc

时看到这些错误消息

希望对您有所帮助