検討中(将来)のライブラリ仕様変更(ARM)
GCC サポートの廃止
ただし、異なるツールチェーン 2 つをサポートしているというのは SOLID のセールスポイントの一つなので、本当に GCC を廃止するかどうかは慎重に検討中です。仮に次のバージョンのツールチェーン(未定)で GCC が廃止されたとしても、exeGCC のサポートは引き続き継続する可能性が高いと思われます。
弊社のツールチェーンに Clang の採用を検討した当初(2014 年ごろ)は、特に組み込み向けプログラミングではまだ実績が少なく、コンパイラ以外のリンカやライブラリのサポートも不十分だったため、あくまでもメインは GCC でした。結果として 2 つのコンパイラを長年サポートすることとなり、これは SOLID のコード品質の向上に貢献してきました。
この 10 年で LLVM/Clang は十分に成熟して GCC/Binutils と対等以上の存在となりました。特に LLVM 17(2023)以降 lld リンカの GNU ld 互換性が十分実用的になりました。ARM 社を始めとする大手ベンダーの提供するツールチェーンも Clang ベースのものが増えてきています。さらにサニタイザなど、SOLID が提供する高度なデバッグ機能の多くが Clang 限定となっていて、GCC の必要性は低下しつつあるのが現状です。
現在、次期ツールチェーンとして exeClang という、GCC/Binutils に一切依存しないツールチェーンを開発中です。これはコンパイラに LLVM/Clang、リンカに LLVM lld、(Binutils に相当する)バイナリユーティリティに LLVM tools、(libgcc に相当する)ランタイムライブラリに LLVM compiler-rt、(libstdc++、libsupc++ に相当する)C++ 標準ライブラリに LLVM libc++、libc++abi、libunwind を使用します。
以下はおそらく exeClang に切り替わった後の仕様変更となります。
以下はより標準的なツールチェーンの設定に近づけることを意図しています。
-fsigned-char
を指定して char 型を signed char として扱うのを廃止。(現状でも-fsigned-char
を指定しなくても動作することは確認済みです。)付属の GCC specs ファイルが文字コードを cp932 に設定(
-finput-charset=cp932
,-fexec-charset=cp932
)するのを廃止。(現状でも Clang は UTF-8 のみサポートです。)
以下は今よりも強力な最適化を可能にするための変更です。
math.h
で C99 のmath_errhandling
(およびfenv.h
でFE_INVALID
,FE_OVERFLOW
,FE_DIVBYZERO
)をサポートし、この値を常にMATH_ERREXCEPT
に規定することで数学関数がerrno
を変更しないように規定して-fno-math-errno
を常に有効可能にする。FreeBSD(musl libc)などは既にこの仕様になっています。全てのライブラリを
-flto
オプションを付けてビルドする。これにより、従来はコンパイル単位(同じファイル)内に関数の実装が存在しなければできなかったインライン展開などが、ビルド済みのライブラリ関数でも可能になります。ただし LTO は GCC と Clang で互換性が無く、バージョン間の互換性も無いので、これまでの exeGCC のように 2 つのコンパイラと複数バージョンの Clang をサポートする、ということはできなくなります。
以下は ARM のみの検討項目となります。
RunFastMode の FTZ モードと DN モードを無効。
これはライブラリのビルド設定ではなく、exeGCC 付属のスタートアップルーチンの設定変更です。SOLID は自前のスタートアップルーチンを使用するため無関係となります。