2013-01-10 4 views
12

ちょうど確かめてください:LLVMビットコードはプラットフォーム間でクロスですか?私は、生成されたIR( ".bc")ファイルをさまざまなプラットフォーム上で分散して解釈/ JITできますか?LLVMのビットコードクロスプラットフォーム

もしそうなら、ClangはC++をどのようにしてプラットフォーム独立コードに変換しますか? C++言語自体では、ターゲットプラットフォームを決定するためのプリプロセッサは、実際にコンパイルされる前に使用されます。 IRファイルを考えると

+0

オブジェクトが完全に自己完結している場合は、別のプラットフォームで解釈される可能性があります。しかし、ABIは異なるので、システムの残りの部分を使用するのは苦労します。 –

+0

私は、http://llvm.org/docs/LangRef.htmlが完全に独立したプラットフォームであると仮定します。 「システムの残りの部分を使っている時」とはどういう意味ですか? – Tim

+1

@Tim - コードはOSコールを使用しますか?彼らはどのように移植可能ですか? –

答えて

17

LLVM IRは、クロスプラットフォームにすることができますが、他にも明白な例外があります。しかし、それはClangがクロスプラットフォームコードを生成することを意味するものではありません。注意しておきますが、プリプロセッサは、プラットフォームに応じて、C/C++コンパイラにコードの一部を渡すだけに一般的に使用されています。これがユーザーコードで行われていない場合でも、多くのシステムヘッダーには、typedefなどのプラットフォーム固有のビットが1つまたは2つ含まれています。例えば、size_tが32ビットのプラットフォームでLLVM IRにsize_tを使用してCコードをコンパイルすると、LLVM IRはこれにi32を使用します。地獄ではそれをリバースエンジニアリングして修正する方法はありません。

GoogleのPortable Native Clientプロジェクト(リンクに感謝@willglynn)が正しく理解されていれば、すべてのターゲットプラットフォームでABIを修正することで移植性が実現します。つまり、LLVM IRは異なるABIを持つプラットフォームには移植できません。これがより移植性の高い唯一の理由は、クライアントがPNaCl ABIと実際のABIを一致させるレイヤーを提供することです。言い換えれば、PNaClコードは多くのプラットフォームに移植可能ではなく、 "PNaCl VM"があります。

だから、一番下の行:あなたは非常に慎重になら、あなたはなく、ABIの違いの上に抽象的に(クランは行いません)重要な追加作業を行わずに、複数のプラットフォーム間でLLVM IRを使用することができます。

9

は、私はそれが私の目標にコンパイルできたことを確認することができますか?

プラットフォームに依存しない可能性のあるファイルがあるため、任意のIRファイルが常にクロスプラットフォームとなることを前提としています。最も注目すべき例は、IRが実際のアセンブラシーケンス(module-levelまたはinlineアセンブリセグメントを介して)を含むことができますが、他の例があります。ターゲット固有の組み込み関数や呼び出し規約を使用することがあります。これらの組み込み関数は、一部のターゲットでのみサポートされています。

すべてのターゲットでコンパイルが保証されたIRファイルを生成できますか?

私はよく分かりませんが、特にインラインアセンブリ、呼び出し規則、型の必須/優先ABIなどを指定しないと、可能です。コンパイラが実行する最適化に影響する可能性があります。