GCC コード生成バックエンド
このバックエンドとコンパイラーの統合を壊す可能性のある変更を見つけやすくするため、CI では GCC コード生成バックエンドを使ってコンパイラーのテストスイートの一部を実行しています。
GCC コード生成バックエンド全般についてバグや問題に遭遇した場合は、遠慮なく
rustc_codegen_gcc リポジトリで issue を開いてください。
なお、このバックエンドは現在 x86_64-unknown-linux-gnu ターゲットのみをサポートしています。
GCC バックエンドの CI エラーに遭遇した場合
CI の x86_64-gnu-gcc ジョブで GCC コード生成バックエンドを使って実行されたテストに関連するエラーに遭遇した場合は、
次のコマンドを使用して、CI で起きることを再現しながら、GCC バックエンドを使って UI テストをローカルで実行できます。
./x test tests/ui \
--set 'rust.codegen-backends = ["llvm", "gcc"]' \
--set 'rust.debug-assertions = false' \
--test-codegen-backend gcc
CI で別のテストスイートが失敗した場合は、tests/ui の部分を変更する必要があります。
CI ジョブ全体をローカルで再現するには、cargo run --manifest-path src/ci/citool/Cargo.toml run-local x86_64-gnu-gcc を実行できます。
詳細については、Docker によるテストを参照してください。
GCC ジョブが失敗した場合はどうすればよいですか?
GCC ジョブのテストが失敗し、その失敗が GCC バックエンドによって引き起こされた可能性があるように見える場合は、@rust-lang/wg-gcc-backend を使用して cg-gcc ワーキンググループに ping できます。
GCC バックエンドで失敗するコンパイラーテストの修正が自明でない場合は、//@ ignore-backends: gcc compiletest ディレクティブを使用して、cg_gcc で実行されるときにそのテストを無視できます。
ビルドするコード生成バックエンドの選択
rust.codegen-backends = [...] bootstrap オプションは、どのコード生成バックエンドがビルドされ、生成される rustc の sysroot に含まれるかに影響します。
GCC コード生成バックエンドを使用するには、bootstrap.toml のこの配列に "gcc" を含める必要があります。
rust.codegen-backends = ["llvm", "gcc"]
bootstrap.toml ファイルを変更したくない場合は、代わりに x
コマンドを --set 'rust.codegen-backends=["llvm", "gcc"]' とともに実行できます。
例:
./x build --set 'rust.codegen-backends=["llvm", "gcc"]'
codegen-backends 配列の最初のバックエンドによって、ビルドされた rustc の
デフォルトバックエンドとして使用されるバックエンドが決まります。
これにより、stage 1 標準ライブラリ(または stage 2 以降でビルドされるもの)をコンパイルするために使用されるバックエンドも決まります。
したがって、デフォルトで GCC バックエンドを使用する rustc を生成するには、この配列の最初の要素として "gcc" を置くことができます。
./x build --set 'rust.codegen-backends=["gcc"]' library
テストで使用するコード生成バックエンドの選択
テスト用の Rust プログラムをビルドするために GCC コード生成バックエンドを使用してコンパイラーテストを実行するには、
--test-codegen-backend フラグを使用できます。
./x test tests/ui --test-codegen-backend gcc
これが機能するためには、テスト対象のコンパイラーの sysroot ディレクトリで GCC コード生成バックエンドが利用可能である必要があることに注意してください。
CI から GCC をダウンロードする
gcc.download-ci-gcc bootstrap オプションは、GCC(GCC コード生成バックエンドの依存関係)が CI からダウンロードされるか、ローカルでビルドされるかを制御します。
デフォルト値は true で、GCC ソースにローカルの変更がなく、指定されたホストターゲットが CI で利用可能な場合は、CI から GCC をダウンロードします。
独自の GCC を提供する
独自の libgccjit.so ファイルを提供したい場合があります。
そのような場合の 1 つは、GCC がマルチターゲットコンパイラーではないため、rustc を別のターゲット向けにクロスコンパイルしたい場合です。
このユースケースをサポートするために、gcc.libgccjit-libs-dir bootstrap オプションがあります。
このオプションは gcc.download-ci-gcc を上書きします。つまり、bootstrap によって libgccjit.so がダウンロードされたりローカルでビルドされたりすることはありません。
このディレクトリのディレクトリ構造は <host>/<target>/libgccjit.so です。たとえば、次のようになります。
.
├── m68k-unknown-linux-gnu
│ └── m68k-unknown-linux-gnu
│ └── libgccjit.so
└── x86_64-unknown-linux-gnu
├── m68k-unknown-linux-gnu
│ └── libgccjit.so
└── x86_64-unknown-linux-gnu
└── libgccjit.so
バックエンド自体のテストの実行
GCC コード生成バックエンドを使用してコンパイラーのテストスイートを実行することに加えて、バックエンド自体のテストスイートも実行できます。
現在は、次のコマンドを使用して実行できます。
./x test rustc_codegen_gcc
これが機能するためには、バックエンドが有効化されている必要があります。