18

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

这段代码运行了很长时间,所以我想对其进行静态重新编译。此外,我可以对其进行运行时配置文件并给 LLVM 提示,哪些分支更有可能。

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

谢谢。

4

3 回答 3

13

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

编辑:您也可以考虑尝试类似于 QEMU 所做的方法。QEMU 即时翻译二进制文件,当我运行 PowerPC 代码时,每个基本块在执行之前都会被翻译成 X86 代码。您可以弄清楚如何将目标文件分解为基本块并为每个块生成 LLVM IR,丢弃东西(如参数传递等)并用直接的 LLVM IR 替换它。

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

这个确切的过程在“使用 QEMU 将 x86 动态转换为 LLVM”中进行了描述

于 2011-01-08T22:43:55.897 回答
1

MAO 项目似乎做了你想做的一部分(x86->intermediate language)。

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

于 2011-11-27T20:03:55.537 回答
0

据我所知,100% 正确反汇编 x86 代码是不可能的。由于数据和代码混合在一起,并且还由于可变长度指令。正确反汇编的唯一方法是即时解释它。

于 2012-03-27T15:16:15.490 回答