KMC 独自の修正について

(これは資料的なドキュメントです。SOLID を使用するだけならば意識する必要はありません。)

SOLID ツールチェーンが使用している GCC と Clang には、KMC 独自の修正が加えられています。

また、以後の説明には様々な環境変数が使用されていますが、環境変数は SOLID-IDE が自動的に設定しますので、ユーザが設定する必要はありません。

GCC/Clang 共通の修正

  • ライセンス管理機能

PARTNER-Jet2 デバッガハードウェアをライセンス認証用ドングルキーとして使用します。GCC の本機能は GPL ソースの修正ではなく、パブリックドメインである MinGW スタートアップルーチンの修正で実現しています。ライセンス管理機能のソースコードの開示請求にはお答えできませんので、ご了承ください。

  • 環境変数を読み込みコンパイラオプションを自動的に設定する機能

    • 使用する環境変数

      • 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 をリブートしてください。

    • 環境変数 GCCSW に指定されたオプションを argv[1] から挿入します。

      (環境変数 EXEGCC=ON かつ GCCSW が存在時のみ。)

      通常のコマンドラインとして指定されたオプションの方が優先(後の方に指定)されます。

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 が対象。)

  • DWARF5 の DW_AT_alignment が -gdwarf-3 等のオプション指定時にも出力されてしまう不具合の修正。

    • SOLID s001 時点では、PARTNER デバッガが DWARF5(まだ規格が未制定。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
  • 以下は s002(Clang 6.0.0)からの修正点です

    • -marm オプションを無視する修正。(コマンドライン、および GCCSW が対象。)

      Clang は marm オプションをサポートしているのですが、Clang 内部では -mno-thumb オプションの エイリアスとして実現されています。現在の Clang は GCC をリンカとして使用しており、-mno-thumb を GCC は未サポートなので、このオプションが渡されるとエラーになってしまう不具合の修正のため。

    • アドレスサニタイザライブラリの互換性を保つため、-mllvm -asan-globals-live-suppor=0 オプションをデフォルトで指定する修正。