2011-01-08 10 views
12

x86 32ビットコードを入力してLLVMコンパイラを実行することはできますか?私はソースコードを持っていない巨大なアルゴリズムがあり、同じハードウェア上でより高速に動作させたいと思っています。最適化を使ってx86から​​x86に変換できますか?x86コードをLLVMで再コンパイルしてより高速なものにするx86

このコードは長い間実行されていますので、静的な再コンパイルを行いたいと思います。また、ランタイムプロファイルを実行してLLVMのヒントを与えることもできますが、どのブランチが可能性が高いのでしょうか。

元のコードはx86 + x87用であり、SSE/MMX/SSE2は使用していません。再コンパイル後、x86_64および/またはSSE3を使用する可能性があります。また、コードはハードウェアデコーダに対してより最適な方法で再生成されます。

ありがとうございました。

+1

これは答えではありませんが、AmigaがMC68000用にコンパイルしたコードを新しいプロセッサでより高速に動作させるために、互換性を犠牲にして最適化するプログラムがあることを覚えています。しかし、私はそのようなx86の試みがないことを知っています。 – liori

+0

IMOでは、IDAと16進線やOllydbgのようなものを使ってアセンブリをリバースエンジニアリングして、より高いレベルの言語(CまたはC++)に戻すことができます – Necrolis

+1

[RevGen](http://stackoverflow.com/questions/ 9359487/source-code-of-revgen-tool)は、x86-> LLVMトランスレータの1つです。また、x86から​​静的バイナリへのトランスレータもあります。それはQemuと修正されたMIPS TCGを使用し、IRを生成します。 – osgx

答えて

10

LLVMではこれをそのまま使用することはできません。あなたはLLVM中間表現(IR)コンバータにx86バイナリを書かなければなりません。それは非常に簡単な作業です。 x86コードが十分にシンプルであれば、IRにかなり接近しているかもしれませんが、いくつかのx86命令は直接マッピングされません。スタックポインタの操作。

編集: また、QEMUと同様のアプローチを試すこともできます。 QEMUは、PowerPCコードを実行すると、各基本ブロックが実行される前にX86コードに変換されるので、バイナリを変換します。オブジェクトファイルを基本ブロックに分割し、ブロックごとにLLVM IRを生成し、パラメータの引き渡しなどを破棄し、LLVM IRを直線LLVMに置き換える方法を考え出すことができます。

まだ大きな仕事ですが、アルゴリズムを最初から書き直す方が簡単でしょう。

この正確なプロセスは"Dynamically Translating x86 to LLVM using QEMU"

+0

同じことを行うプロジェクトはありますか? – osgx

+0

おそらくありません。 LLVMのオプティマイザが動作するには、マシンコードに十分な情報が残っていません。コードは、64ビットのために有用にベクトル化されて再コンパイルされる前に、リバースエンジニアリングされて高レベルの表現に戻されなければならず、コンパイラは推論を行うだけではそれほど優れていません。動的再コンパイルを行うx86エミュレータを使用することは可能かもしれませんが、数学をベクトル化することはできません。そのオーバーヘッドはパフォーマンスの向上を無効にします。 – user57368

+0

オーバーヘッドの場合:いくつかのコードがありますが、これは速く実行したいものです。私は、新しいコードを実行する前にオプティマイザを実行するのに1時間を費やすことができます。目標は、より遅い時間からより速いコードを得ることです。再コンパイルのプロセスは静的に1回実行されます。 – osgx

1

MAO projectに記述されているあなたは(x86ベース>中間言語)何をしたいの一部を行うようです。

編集:@osgxあなたは、プロジェクトの状況と彼らが処理できるプログラムの詳細については、maoのウェブサイトを見てみる必要があります。 (自己修正コードは難しいかもしれません。)

+1

こんにちは。 MAOとはどのような地位ですか? x86/x86_64のどの部分を処理できますか?自己修正コード(UPXパックなど)を使用することはできますか? – osgx

0

私が知っているところでは、x86コード100%を正しく逆アセンブルすることは不可能です。データとコードが混在し、可変長命令によるものです。適切に分解する唯一の方法は、その場でそれを解釈することです。

+0

自己変更コードにのみ解釈が必要です。静的コードは簡単に(任意の逆アセンブラで)逆アセンブルできます。実行時に再コンパイラが存在する場合や、動的コードを静的コードに展開することができます(私の場合、UPXが使用されているようにパックされていて、解凍可能な場合) – osgx

+0

@osgx:それは真です。例えば、非同期化技術は、逆アセンブラを容易に混乱させる可能性がある。 – molnarg

+0

これは技術的には正しいことですが、エンジニアリングの価値は100%もありません。理論的には、100%?実際には99.98%という非常に可能なことはありません...理論上の限界をいかに克服し、貴重な成果を生み出すかについては、実際には十分に文書化されています。 – TechZilla

関連する問題