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 が使用しているもの:

    COMPILER_PATH

    $GCCDIR\bin が固定で設定されます。

    これを設定しない場合、cc1(コンパイラ本体)や as(アセンブラ)等の実行ファイルが正しく見つかりません。

    CPATH

    追加のインクルードパスの設定に使用されます。

    SOLID IDE が exeGCC の環境変数を設定する際に使用する環境変数:

    EXEGCC_STD_ARM_ROOTDIR

    (STD_ARM の部分は、インストーラごとに異なる、必要なライセンスに相当する文字列が入ります。) この値が GCCDIR に設定されます。

    この変数が正しく反映されていないと、IDE は正常に動作しません。インストール後、一度サインアウトか、PC をリブートしてください。

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 かつ SYSROOTGCCDIR が存在時のみ。)

    追加されるインクルードパス:

    $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)からの修正点です