LLVM 如何检测何时生成特定的 ASM 指令序列
LLVM How to detect when a specific ASM instruction sequence is generated
我正在使用 llvm 编译我的 C 程序。我想知道是否生成了特定的汇编序列,如果生成了,它与哪个源代码行相关联。例如,我想在每次生成 push %eax
指令时记录。有什么办法可以解决这个问题吗?
以防其他人遇到类似问题。
我看的地方是LLVMs后端代码。我特别关注 X86 汇编生成。
有两个主要区域可以修改和添加测试。
ASMPrinter
class 在 lib/CodeGen/ASMPrinter/ASMPrinter.cpp
有不同的发射函数来处理函数、基本块等。通过它们。这些函数遍历每个机器指令 MI
,其中具有 getOperand()
和 getOpCode()
等函数,以根据要求检查特定指令。
每个特定的操作码和实际指令都在目标特定文件中指定,例如lib/Target/X86/X86GenInstrInfo.inc
- 以上函数依次调用目标特定子class函数。在我的例子中,它们是 X86AsmPrinter 和类似的 classes。
四处查看添加日志语句,例如
errs()<<"Opcode is "<<MI.getOpcode()<<"\n";
MI.dump();
并且您可以在 运行 llc file.bc
时看到这些错误消息
希望对您有所帮助
我正在使用 llvm 编译我的 C 程序。我想知道是否生成了特定的汇编序列,如果生成了,它与哪个源代码行相关联。例如,我想在每次生成 push %eax
指令时记录。有什么办法可以解决这个问题吗?
以防其他人遇到类似问题。
我看的地方是LLVMs后端代码。我特别关注 X86 汇编生成。
有两个主要区域可以修改和添加测试。
ASMPrinter
class 在lib/CodeGen/ASMPrinter/ASMPrinter.cpp
有不同的发射函数来处理函数、基本块等。通过它们。这些函数遍历每个机器指令MI
,其中具有getOperand()
和getOpCode()
等函数,以根据要求检查特定指令。
每个特定的操作码和实际指令都在目标特定文件中指定,例如lib/Target/X86/X86GenInstrInfo.inc
- 以上函数依次调用目标特定子class函数。在我的例子中,它们是 X86AsmPrinter 和类似的 classes。
四处查看添加日志语句,例如
errs()<<"Opcode is "<<MI.getOpcode()<<"\n";
MI.dump();
并且您可以在 运行 llc file.bc
希望对您有所帮助