KMC 独自の修正について
注釈
これは資料的なドキュメントです。SOLID を使用するだけならば意識する必要はありません。
SOLID ツールチェーンが使用している GCC と Clang には、KMC 独自の修正が加えられています。
また、以後の説明には様々な環境変数が使用されていますが、環境変数は SOLID-IDE が自動的に設定しますので、ユーザが設定する必要はありません。
GCC/Clang 共通の修正
ライセンス管理機能
PARTNER-Jet2 デバッガハードウェアをライセンス認証用ドングルキーとして使用します。GCC の本機能は GPL ソースの修正ではなく、パブリックドメインである MinGW スタートアップルーチンの修正で実現しています。ライセンス管理機能のソースコードの開示請求にはお答えできませんので、ご了承ください。
環境変数を読み込みコンパイラオプションを自動的に設定する機能
環境変数
GCCSW
に指定されたオプションをargv[1]
から挿入します。(環境変数EXEGCC
=ON
かつGCCSW
が存在時のみ。)通常のコマンドラインとして指定されたオプションの方が優先(後の方に指定)されます。
KMC が独自に追加した環境変数:
- EXEGCC
ON の場合のみ、以下の機能が動きます。それ以外(未設定含む)の場合は何もしません。
- GCCDIR
- SYSROOT
exeGCC のインストールディレクトリを設定します。全ての基準となります。
EXEGCC
=ON
の場合でも、GCCDIR
もしくはSYSROOT
(obsolete) が未設定の場合はGCCSW
の内容以外のオプションは未設定となります。
- GCC_DEFAULT
CPU アーキテクチャ、命令セット、エンディアン、FPU の種類、VLINK の有無をエンコードしたものです。
exeGCC は上記のようなパターンの組み合わせに対応するライブラリ一式を
lib
ディレクトリ以下にlib/
$GCC_DEFAULT
というディレクトリ構成で配置しています。
- GCCSW
GCC_DEFAULT
のパターンに対応するコンパイラオプションです。
GCC が使用する環境変数のうち、exeGCC が使用しているもの:
SOLID IDE が exeGCC の環境変数を設定する際に使用する環境変数:
GCC のみの修正
環境変数を読み込みコンパイラオプションを自動的に設定する機能
GCCDIR をベースに、コンパイラのインストールパス(sysroot)、使用する specs ファイル、ライブラリパスを適切に設定します。(Clang は、リンクは GCC を呼び出して丸投げする形になるので、この機能は実装されていません。また、Clang 版の libgcc に当たる compiler-rt も、libgcc と両方リンクしても大丈夫なように、重複する関数を削除もしくはリネームした特別版になっています。)
設定される内容:
--sysroot=
$GCCDIR
-specs=$GCCDIR
/lib/$GCC_DEFAULT
/specs -L$GCCDIR
/lib/$GCC_DEFAULT
exeGCC 固有のインクルードパスを
-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-3
等のオプション指定時にも出力されてしまう不具合の修正。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)からの修正点です