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-> 中間言語)。

編集: @osgx、プロジェクトのステータスと処理できるプログラムの詳細については、mao の Web サイトを参照する必要があります。(ただし、自己変更コードは難しいかもしれません。)

于 2011-11-27T20:03:55.537 に答える
0

私の知る限り、x86コードを100%正しく逆アセンブルすることは不可能です。データとコードが混ざり合っているため、また可変長命令が原因です。適切に分解する唯一の方法は、その場で解釈することです。

于 2012-03-27T15:16:15.490 に答える