念のため: LLVM ビットコードはクロスプラットフォームですか? つまり、生成された IR (".bc") ファイルは、さまざまなプラットフォームで配布および解釈/JIT できますか?
もしそうなら、Clang はどのように C++ をプラットフォームに依存しないコードに変換しますか? C++ 言語自体では、実際にコンパイルする前に、ターゲット プラットフォームを決定するためのプリプロセッサが使用されます。
念のため: LLVM ビットコードはクロスプラットフォームですか? つまり、生成された IR (".bc") ファイルは、さまざまなプラットフォームで配布および解釈/JIT できますか?
もしそうなら、Clang はどのように C++ をプラットフォームに依存しないコードに変換しますか? C++ 言語自体では、実際にコンパイルする前に、ターゲット プラットフォームを決定するためのプリプロセッサが使用されます。
LLVM IR can be cross-platform, with the obvious exceptions others have listed. However, that does not mean Clang generates cross-platform code. As you note, the preprocessor is almost universally used to only pass parts of the code to the C/C++ compiler, depending on the platform. Even when this is not done in user code, many system headers include a bit or two that's platform-specific, such as typedef
s. For example, if you compile C code using size_t
to LLVM IR on a platform where size_t
is 32 bit, the LLVM IR now uses i32
for that, and there's no way in hell you can reverse engineer that to fix it.
Google's Portable Native Client project (thanks @willglynn for the link), if I understand it correctly, achieves portability by fixing the ABI for all target platforms. So in that sense, it doesn't solve the aforementioned issues: The LLVM IR is not portable to platform with a different ABI. The only reason this is more portable is that the clients provide a layer which matches the PNaCl ABI to the actual ABI. In other words, PNaCl code isn't portable to many platforms, the "PNaCl VM" is.
So, bottom line: If you're very careful, you can use LLVM IR across multiple platforms, but not without doing significant additional work (which Clang doesn't do) to abstract over the ABI differences.
IRファイルが与えられた場合、それがターゲットにコンパイルできることを確認できますか?
特定のファイルにはプラットフォームに依存しないものがあるため、任意のIRファイルが常にクロスプラットフォームであると想定することはできません。最も注目すべき例は、IRに実際のアセンブラシーケンス(モジュールレベルまたはインラインアセンブリセグメントを介して)を含めることができることですが、他の例もあります。たとえば、ターゲット固有の組み込み関数の使用や、一部のターゲットでのみサポートされる呼び出し規約などです。
すべてのターゲットでコンパイルされることが保証されているIRファイルを生成できますか?
わかりませんが、特にインラインアセンブリ、呼び出し規約、型の必須/優先ABIなどを指定しない場合は、可能だと思います。ただし、コンパイラが実行する最適化に影響を与える可能性があります。