使用LLVM将x86代码重新编译为更快的x86代码

使用LLVM将x86代码重新编译为更快的x86代码,x86,llvm,recompile,X86,Llvm,Recompile,是否可以在输入x86 32位代码的情况下运行LLVM编译器?有一个巨大的算法,我没有源代码,我想让它在相同的硬件上运行得更快。我可以通过优化将其从x86转换回x86吗 这段代码运行了很长时间,所以我想对它进行静态重新编译。此外,我还可以对其进行运行时概要分析,并向LLVM提示哪些分支更可能 原始代码是为x86+x87编写的,没有使用SSE/MMX/SSE2。重新编译后,它有机会使用x86_64和/或SSE3。此外,代码将以更优化的方式重新生成到硬件解码器 谢谢。LLVM不能开箱即用。您必须编写一

是否可以在输入x86 32位代码的情况下运行LLVM编译器?有一个巨大的算法,我没有源代码,我想让它在相同的硬件上运行得更快。我可以通过优化将其从x86转换回x86吗

这段代码运行了很长时间,所以我想对它进行静态重新编译。此外,我还可以对其进行运行时概要分析,并向LLVM提示哪些分支更可能

原始代码是为x86+x87编写的,没有使用SSE/MMX/SSE2。重新编译后,它有机会使用x86_64和/或SSE3。此外,代码将以更优化的方式重新生成到硬件解码器


谢谢。

LLVM不能开箱即用。您必须编写一个x86二进制到LLVM中间表示(IR)转换器。这将是一项非常重要的任务。如果x86代码足够简单,它可能会非常接近IR,但某些x86指令不会直接映射,例如堆栈指针操作

编辑: 你也可以考虑尝试类似QEMU的方法。QEMU会动态地翻译二进制文件,当我运行PowerPC代码时,每个基本块在执行之前都会翻译成X86代码。您可以找出如何将对象文件分解为基本块,并为每个块生成LLVM IR,丢弃内容(如参数传递等),然后用直接的LLVM IR替换

不过,这仍然是一项艰巨的任务。从头重写算法可能更容易

这个确切的过程在

中描述,它似乎是您想要做的事情的一部分(x86->中间语言)


编辑:@osgx,您需要查看mao网站,了解项目状态以及他们可以处理哪些程序的详细信息。(但自我修改代码可能很有挑战性。)

据我所知,100%正确地分解x86代码是不可能的。因为数据和代码混合在一起,而且指令长度可变。正确反汇编的唯一方法是动态地解释它。

这不是答案,但我记得Amiga有一些程序可以“优化”为MC68000编译的代码,使其在较新的处理器上运行得更快,而代价是兼容性。但是我知道x86没有这样的尝试。IMO,您可能会有更好的时间使用像IDA&hex-ray或Ollydbg这样的东西将程序集反向工程回到更高级别的语言(C或C++)中。这是x86->LLVM转换器之一。它还具有从x86到静态二进制的转换器。它使用Qemu和修改后的MIPS TCG生成IR。还有-Dagger,用于LLVM IR。现在一个常见的关键字是“组装提升”:| |有任何项目可以这样做吗?不太可能。机器代码中没有足够的信息供LLVM的优化器使用。代码必须反向工程回到高级表示,然后才能有效地矢量化并重新编译为64位,而编译器并不擅长进行推断。您可能可以使用执行动态重新编译的x86仿真器,但它不太可能对数学进行矢量化,而且开销会抵消任何性能提升。对于开销:有一些代码,我想快速运行。在运行新代码之前,我可以花1小时运行优化器。目标是从较慢的时间中获得更快的代码。重新编译的过程是一次性静态完成的。HP有一个老项目,它对本机代码进行动态重新编译以加快速度。据我所知,没有这样的项目,但曾经有一个项目使用LLVM为QEMU()JIT编译代码,这与.Hi密切相关。毛的地位如何?它可以处理x86/x86_64的哪一部分?它能与自修改代码(例如UPX打包)一起工作吗?只有自修改代码才需要解释。静态代码可以很容易地反汇编(使用任何反汇编程序)。只有在运行时有一个重新编译程序,或者动态代码可以解包成静态代码(在我的例子中,EXE打包就像使用UPX一样,并且可以解包)的情况下,使用动态代码才有可能@osgx:这不是真的。例如,去同步技术很容易混淆反汇编程序。好吧,从技术上讲这是正确的,但没有什么值得工程设计是百分之百可能的。那么理论上,100%?永远不可能。。。在实践中,99.98%的可能性很大。。。事实上,关于如何克服理论上的局限性并产生有价值的输出,已经有了很好的记录。