Clang と GCC の相違点
Clang コンパイラのオプションは GCC とほぼ共通なので、異なる部分のみを解説します。Clang コンパイラはオプションによって、コンパイラドライバ、コンパイラ、アセンブラの役割を果たすという構造になっているので、単一の exe になっています。(C の場合は clang.exe、C++ の場合は clang++.exe となります。)また、SOLID ツールチェーンの設定では、リンク時には gcc.exe あるいは g++.exe を呼び出してリンクを行います。
pragma, attribute
pragma や attribute は基本的にそれぞれのコンパイラに固有のものとなります。できるだけ使用しないようにしてください。特に
#pragma GCC ...
の形式のプラグマは GCC のみ、#pragma clang ...
の形式のプラグマは Clang のみとなります。よく使われる例
GCC で、最適化オフの範囲指定
#pragma GCC optimize("O0")
は、 Clang では#pragma clang optimize off
となります。Clang(6.0.0 時点)は
__attribute__((optimize("O3")))
や#pragma clang optimize ("-O3")
のような、関数単位や範囲指定の最適化指定はできません。 (#pragma clang optimize XXX
では、最適化のon
かoff
の指定のみ可能です。on
を指定した場合でも、最適化オプションが指定されていない場合は、最適化は行われません。)
gstabs, gstabs+
stabs, stabs+ 形式のデバッグ情報は未サポートです。
mthumb-interwork
このオプションは Clang には存在しないので、Clang にパッチを当て、無視するようにしています。Clang では常に ARM/Thumb interworking が有効なコードが生成されます。
marm
Clang にこのオプションを渡すと、内部で -mno-thumb と解釈されます。SOLID ツールチェーンの Clang は GCC をリンカとして使用しているため、この(GCC が未サポートの)-mno-thumb オプションが GCC に渡されてしまうとリンクエラーになるため、Clang にパッチを当て、無視するようにしています。(s002 以降)
specs= file
Clang には specs ファイルが存在しないので無視されます。