KMC 独自のコンパイラ修正について(exeGCC)¶
注釈
これは資料的なドキュメントです。SOLID を使用するだけならば意識する必要はありません。また、exeClang には以下の内容は当てはまりません。
SOLID ツールチェーン(exeGCC)が使用している GCC と Clang には、KMC 独自の修正が加えられています。
また、以後の説明には様々な環境変数が使用されていますが、環境変数は SOLID-IDE が自動的に設定しますので、ユーザーが設定する必要はありません。
GCC/Clang 共通の修正¶
ライセンス管理機能
PARTNER-Jet2 デバッガハードウェアをライセンス認証用ドングルキーとして使用します。GCC の本機能は GPL ソースの修正ではなく、パブリックドメインである MinGW スタートアップルーチンの修正で実現しています。ライセンス管理機能のソースコードの開示請求にはお答えできませんので、ご了承ください。
環境変数を読み込みコンパイラオプションを自動的に設定する機能
環境変数
GCCSWに指定されたオプションをargv[1]から挿入します。(環境変数EXEGCC=ONかつGCCSWが存在時のみ。)通常のコマンドラインとして指定されたオプションの方が優先(後の方に指定)されます。
KMC が独自に追加した環境変数:
- EXEGCC¶
ON の場合のみ、以下の機能が動きます。それ以外(未設定含む)の場合は何もしません。
- GCCDIR¶
exeGCC のインストールディレクトリを設定します。全ての基準となります。
- GCC_DEFAULT¶
CPU アーキテクチャ、命令セット、エンディアン、FPU の種類、VLINK の有無をエンコードしたものです。
exeGCC は上記のようなパターンの組み合わせに対応するライブラリ一式を
libディレクトリ以下にlib/$GCC_DEFAULTというディレクトリ構成で配置しています。
- GCCSW¶
GCC_DEFAULTのパターンに対応するコンパイラオプションです。
GCC が使用する環境変数のうち、exeGCC が使用しているもの:
- CPATH¶
追加のインクルードパスの設定に使用されます。
SOLID IDE が exeGCC の環境変数を設定する際に使用する環境変数:
- EXECLANG_STD_ARM_ROOTDIR¶
Added in version 5.0.
(
STD_ARMの部分は、製品ごとに異なる、必要なライセンスに相当する文字列が入ります。) この値がGCCDIRに設定されます。この変数が正しく反映されていないと、IDE は正常に動作しません。インストール後、一度サインアウトか、PC をリブートしてください。
- EXEGCC_STD_ARM_ROOTDIR¶
Removed in version 5.0: 新しい IDE を使用する場合は
EXECLANG_STD_ARM_ROOTDIRを使用してください。
GCC のみの修正¶
環境変数を読み込みコンパイラオプションを自動的に設定する機能
GCCDIR をベースに、コンパイラのインストールパス(sysroot)、使用する specs ファイル、ライブラリパスを適切に設定します。(Clang は、リンクは GCC を呼び出して丸投げする形になるので、この機能は実装されていません。また、Clang 版の libgcc に当たる compiler-rt も、libgcc と両方リンクしても大丈夫なように、重複する関数を削除もしくはリネームした特別版になっています。)
設定される内容:
--sysroot=
$GCCDIR-specs=$GCCDIR/lib/$GCC_DEFAULT/specs -L$GCCDIR/lib/$GCC_DEFAULTexeGCC 固有のインクルードパスを
-idirafterオプションでシステムインクルードディレクトリの最後に追加します。(環境変数EXEGCC=ONかつSYSROOTかGCCDIRが存在時のみ。)追加されるインクルードパス:
$GCCDIR/include$GCCDIR/include/c++(
$変数名は環境変数の値を意味します。)
Clang のみの修正¶
デフォルト TargetTriple を arm-kmc-eabi に設定。(ビルド時の CMake オプション指定で実現。)
TargetTriple の<vendor>に kmc を追加。 <vendor>が kmc 時のみ、上記の環境変数からコンパイラオプションを読み込む機能が動作。
ベアメタル(OS 無しの)環境でアドレスサニタイザ等をサポートするための修正。
SOLID 開発開始時の Clang 3.7.1 には
-asan-mapping-offset(4.0.0 以降)に相当するオプションが 存在しなかったため、-asan-shadow-offset32という独自オプションを追加したという経緯があります。
Clang がサポートしない
-mthumb-interworkオプションを無視する修正。 (コマンドライン、および GCCSW が対象。)DWARF 5 の
DW_AT_alignmentが-gdwarf-4等 DWARF 4 以下の引数を指定した時にも出力されてしまう不具合の修正。SOLID s001 時点では、PARTNER デバッガが DWARF 5(まだ規格が未制定。GCC や Clang が試験的に 実装を開始。)を未サポートだったため。
環境変数を読み込みコンパイラオプションを自動的に設定する機能
exeGCC の構成に合わせたインクルードパスを
-Iオプションで追加します。追加されるインクルードパス(追加順)
C++ 時のみ(例:
-IC:/GCC4/ARM/s001/include/c++/4.9.4/arm-kmc-eabi):$GCCDIR/$TARGET/include/c++/$GCC_VERSION$GCCDIR/$TARGET/include/c++/$GCC_VERSION/$TARGET$GCCDIR/$TARGET/include/c++/$GCC_VERSION/backward共通:
$GCCDIR/include$GCCDIR/include/c++$GCCDIR/$TARGET/include-marmオプションを無視する修正。(コマンドライン、およびGCCSWが対象)注釈
s002(Clang 6.0.0)からの修正点です
Clang は
-marmオプションをサポートしていますが、Clang 内部では-mno-thumbオプションのエイリアスとして実現されています。現在の Clang は GCC をリンカとして使用しており、-mno-thumbをGCC は未サポートなので、このオプションが渡されるとエラーになってしまう不具合の修正のため。アドレスサニタイザライブラリの互換性を保つため、
-mllvm -asan-globals-live-suppor=0オプションをデフォルトで指定する修正。注釈
s002(Clang 6.0.0)からの修正点です