【发布时间】:2023-03-24 01:14:01
【问题描述】:
我需要将 x86 汇编源代码转换为 LLVM 人类可读的 .ll 文件(又名 LLVM 汇编语言)。我怎样才能做到这一点?如果没有直接的解决方案,是否有可能在 LLVM 基础架构中以尽可能少的努力来实现?
我想,我正在寻找的解决方案应该是某种 llc 的对应物,它将 .s 文件转换回 .ll 表示形式。
【问题讨论】:
-
这个问题已经被问及回答了。由于很多东西(例如间接分支),没有直接的解决方案。你可能会发现像 llvm-qemu 和 libcpu 这样的项目对你很有用。无论如何,这个问题是stackoverflow.com/questions/6981810/…
-
谢谢。我已经看过你提到的那些项目。不幸的是,llvm-qemu 看起来已经死了。并且 libcpu 看起来像是在解析程序集而不是使用 LLVM 的基础架构(因此它在支持 x86 ISA 方面似乎不完整)。实际上,我认为我正在寻找的工具应该完成 LLVM 的 AsmPrinter 的工作,但反向将本机 ISA 指令转换为 LLVM 的 MachineInstr 或 LLVM-MC 的 MCInst.
-
那么 LLVM 的子项目 llvm-mc 呢?它有 AsmParser 类,可以吃.s 文件并基于 MCInst 类生成其表示。在这种情况下,唯一未做的部分是相对于 MCLowering 类反向返回到 LLVM 的基于 MachineInstr 的表示。
-
MachineInstr != LLVM IR。 MI 仍然是机器码。考虑例如你有“jmp [eax]”指令。你会将它转换成哪个 LLVM IR 指令?
-
例如,我会对 x86/x86_64 -> 有限制的 LLVM 转换器感兴趣,它能够反汇编有限的 x86、x86_64 指令集,但重组 hello world 和一些计算算法是合理的。
标签: assembly llvm code-translation