現在、私は ARM 全般、特に iPhone/Android ターゲットに興味があります。しかし、今後数年間で重要な役割を果たすと思われる clang についてもっと知りたいのです。
私は試した
clang -cc1 --help|grep -i list
clang -cc1 --help|grep arch|grep -v search
clang -cc1 --help|grep target
-triple <value> Specify target triple (e.g. i686-apple-darwin9)
clang には-triplet
パラメータがあることは知っていますが、そのパラメータの可能な値をすべて一覧表示するにはどうすればよいでしょうか?
クロス コンパイルに関しては、clang は gcc と大きく異なることがわかりました。GCC の世界では、または ( など、すべてに対して個別のバイナリがPLATFORM_make
必要PLATFORM_ld
ですi*86-pc-cygwin i*86-*-linux-gnu
。http://git.savannah.gnu.org/cgit/libtool.git/tree/doc/プラットフォーム)
clang の世界では、バイナリは 1 つだけです (いくつかのフォーラムで読んだとおり)。しかし、サポートされているターゲットのリストを取得するにはどうすればよいでしょうか? また、ターゲットがディストリビューション (Linux/Windows/macOS など) でサポートされていない場合、より多くのプラットフォームをサポートするターゲットを取得するにはどうすればよいでしょうか?
最新の clang を次のように SVN すると:
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
ほとんどのプラットフォームを利用できますか?
Clang はクロスコンパイルを念頭に置いて構築されたわけではないようですが、LLVM ベースなので理論的には非常にクロスフレンドリーであるはずです。
ベストアンサー1
私の知る限り、特定のclang
バイナリがサポートするアーキテクチャを一覧表示するコマンドライン オプションはなく、strings
その上で実行してもあまり役に立ちません。Clang は基本的に C から LLVM へのトランスレータであり、実際のマシン コードを生成する細かい部分を扱うのは LLVM 自体であるため、Clang が基盤となるアーキテクチャにあまり注意を払っていないのも不思議ではありません。
他の人がすでに指摘しているように、どのアーキテクチャをサポートしているかを尋ねることができますllc
。これは、これらの LLVM コンポーネントがインストールされていない可能性があるだけでなく、検索パスとパッケージング システムの気まぐれにより、バイナリllc
がclang
同じバージョンの LLVM に対応していない可能性があるため、あまり役に立ちません。
ただし、議論のために、LLVM と Clang の両方を自分でコンパイルしたか、LLVM バイナリで十分であると受け入れるとします。
llc --version
サポートされているすべてのアーキテクチャのリストが表示されます。デフォルトでは、すべてのアーキテクチャをサポートするようにコンパイルされます。ARM などの単一のアーキテクチャと考えられるものでも、通常の ARM、Thumb、AArch64 などの複数の LLVM アーキテクチャが存在する場合があります。これは主に実装の利便性のためです。異なる実行モードには、非常に異なる命令エンコーディングとセマンティクスがあるためです。- リストされている各アーキテクチャについて、
llc -march=ARCH -mattr=help
「利用可能な CPU」と「利用可能な機能」がリストされます。CPU は、通常、デフォルトの機能コレクションを設定するための便利な方法にすぎません。
しかし、ここで悪いニュースです。ClangやLLVMにはダンプできる便利なトリプルテーブルがありません。アーキテクチャ固有のバックエンドには、トリプル文字列をオブジェクトに解析するオプションがあるためですllvm::Triple
(インクルード/llvm/ADT/Triple.h言い換えれば、利用可能なすべてのトリプルをダンプするには、停止問題を解く必要があります。たとえば、llvm::ARM_MC::ParseARMTriple(...)
文字列を解析する特殊なケースです"generic"
。
しかし、結局のところ、「トリプル」は主に、Clang を GCC の代替品にするための下位互換性機能であるため、Clang または LLVM を新しいプラットフォームまたはアーキテクチャに移植するのでなければ、通常はそれほど注意を払う必要はありません。代わりに、llc -march=arm -mattr=help
さまざまな ARM 機能の出力とその膨大な配列に圧倒されることが、調査に役立つことがわかるでしょう。
研究頑張ってください!