是否可以使用x86 32位代码的输入运行LLVM编译器?有一个庞大的算法,我没有源代码,我想让它在相同的硬件上运行得更快。我可以通过优化将它从x86转换回x86。
此代码运行很长时间,所以我想对它进行静态重新编译。此外,我可以对它进行运行时配置文件并提供LLVM提示,哪些分支更有可能。
原始代码是为x86 + x87编写的,不使用SSE / MMX / SSE2。重新编译后,它有机会使用x86_64和/或SSE3。此外,代码将以更优化的方式重新生成硬件解码器。
感谢。
答案 0 :(得分:11)
LLVM无法开箱即用。您必须将x86二进制文件写入LLVM中间表示(IR)转换器。那将是一项非常重要的任务。如果x86代码足够简单,它可能会非常接近地映射到IR,但是某些x86指令不会直接映射,例如堆栈指针操作。
编辑: 您也可以考虑尝试类似于QEMU的方法。 QEMU在运行时翻译二进制文件,当我运行PowerPC代码时,每个基本块在执行之前都会被转换为X86代码。您可以弄清楚如何将目标文件分解为基本块并为每个块生成LLVM IR,丢弃内容(如参数传递等)并用直接LLVM IR替换它。
但是,仍然是一项大工作。可能更容易从头开始重写算法。 中描述了这个确切的过程答案 1 :(得分:1)
MAO project似乎是您想要的一部分(x86->中间语言)。
编辑:@ osgx,您需要查看mao网站上的项目状态以及他们可以处理的程序的详细信息。 (但自修改代码可能具有挑战性。)
答案 2 :(得分:0)
据我所知,100%正确反汇编x86代码是不可能的。由于数据和代码是混合的,并且也是由于可变长度指令。正确拆解的唯一方法是动态解释它。