付録A バージョン 11.0 の変更点

以下のセクションでは、Red Hat Developer Toolset 11.0 で導入された機能および互換性の変更点を説明します。リストは完全ではなく、更新されます。

A.1. GCC の変更点

Red Hat Developer Toolset 11.0 は、GCC 11.2 とともに配布されてい ます。

以下の機能は、Red Hat Developer Toolset の以前のリリース以降に追加または変更されています。

一般的な改善

  • GCCは、DWARF バージョン 5のデバッグフォーマットをデフォルトで使用するようになりました。
  • 診断で表示される列番号は、デフォルトでは実際の列番号を表し、複数列の文字を尊重します。
  • 直線コードベクタライザは、機能全体を考慮してベクタリングを行います。
  • 同じ変数を比較する一連の条件式は、それぞれに比較式が含まれていれば、switchステートメントに変換することができます。
  • プロシージャー間の最適化の改善:

    • fipa-modrefオプションで制御される新しいIPA-modrefパスは、関数呼び出しの副作用を追跡し、ポイントツー分析の精度を向上させます。
    • fipa-icfオプションで制御される同一コードのフォールディングパスが大幅に改善され、統一された関数の数が増え、コンパイル時のメモリ使用量が削減されました。
  • リンクタイム最適化の改善:

    • リンク時のメモリ割り当てを改善し、ピークのメモリ使用量を削減しました。
  • IDEで新しいGCC_EXTRA_DIAGNOSTIC_OUTPUT環境変数を使用すると、ビルドフラグを調整することなく、機械的に読める「修正のヒント」を要求することができます。
  • -fanalyzerオプションで実行されるスタティックアナライザーが大幅に改善され、多数のバグフィックスと機能強化が行われました。
  • CVE-2021-42574 を軽減するために、RHSA-2021:4669 アドバイザリーのリリースで、新しい警告が GCC に追加されました。この新しい -Wbidirectional=[none|unpaired|any] 警告は、危険な双方向(BiDi)Unicode 文字について警告し、3 つのレベルがあります。

    • -Wbidirectional=unpaired (デフォルト)は、誤って終了した BiDi コンテキストについて警告します。
    • -Wbidirectional=none は警告をオフにします。
    • -Wbidirectional=any は、BiDi 文字の使用を警告します。

言語固有の改善

C ファミリー

  • C および C++ コンパイラは、OpenMP 5.0 仕様の OpenMP コンストラクトおよびアロケータルーチンにおいて、非矩形のループネストをサポートしています。
  • 属性:

    • 新しいno_stack_protector属性は、スタック保護(-fstack-protector)をかけてはいけない関数を示します。
    • 改良されたmalloc属性は、アロケータとデアロケータのAPIペアを識別するために使用することができます。
  • 新しい警告:

    • -Wsizeof-array-div-Wallオプションで有効)は、2つのsizeof演算子の除算について、最初の演算子が配列に適用され、除算値が配列要素のサイズと一致しない場合に警告を発します。
    • -Wstringop-overreadは、デフォルトで有効になっており、引数として渡された配列の最後を超えて読み取ろうとする文字列関数の呼び出しについて警告します。
  • 警告の強化:

    • -Wfree-nonheap-objectは、動的メモリ割り当て関数から返されていないポインタを使用した割り当て解除関数の呼び出しのインスタンスをより多く検出します。
    • -Wmaybe-uninitializedは、初期化されていないメモリへのポインタや参照が、const-qualified引数を取る関数に渡すことを診断します。
    • -Wuninitializedは、初期化されていない動的に割り当てられたメモリからの読み取りを検出します。

C

  • -std=c2xおよび-std=gnu2xオプションにより、ISO C規格の次期C2X改訂版の新機能がサポートされています。以下に例を示します。

    • 標準属性がサポートされています。
    • __has_c_attributeプリプロセッサ演算子がサポートされています。
    • ラベルは、宣言の前や複合ステートメントの最後に表示されることがあります。

C++

  • デフォルトのモードは-std=gnu++17に変更されます。
  • C++ライブラリのlibstdc++では、C++17のサポートが改善されました。
  • C++20の新機能がいくつか実装されています。なお、C++20のサポートは実験的なものです。

    各機能の詳細については、「C++20 Language Features」を参照してください。

  • C++フロントエンドは、今後予定されているC++23ドラフト機能の一部を実験的にサポートしています。
  • 新しい警告:

    • -Wctad-maybe-unsupported はデフォルトでは無効で、控除ガイドのない型でクラステンプレート引数の控除を行うことについて警告します。
    • -Wrange-loop-constructは、-Wallで有効になり、範囲ベースのforループが不必要でリソース効率の悪いコピーを作成している場合に警告を発します。
    • -Wmismatched-new-delete-Wall で有効になり、不一致な形式の new 演算子や他の不一致な割り当て関数から返されたポインタを持つ delete 演算子の呼び出しについて警告します。
    • -Wvexing-parseはデフォルトで有効になっており、最も厄介な構文解析ルールを警告します。つまり、宣言が変数定義のように見えても、C++言語では関数宣言として解釈される必要がある場合です。

アーキテクチャー固有の改善

64 ビット ARM アーキテクチャー

  • Armv8-Rアーキテクチャは、-march=armv8-rオプションでサポートされています。
  • GCCは、加算、減算、乗算、および複素数の累積と減算を行う演算を自動ベクトル化することができます。

AMD アーキテクチャーおよび Intel 64 ビットアーキテクチャー

  • Sapphire Rapids、Alder Lake、および Rocket Lakeのインテル製CPUに対応しています。
  • Intel AVX-VNNI の新しい ISA 拡張サポートが追加されました。-mavxvnniコンパイラスイッチは、AVX-VNNI の組込みを制御します。
  • znver3コアを搭載したAMD CPUは、新たな-march=znver3オプションによりサポートされます。
  • x86-64 psABIサプリメントで定義されている3つのマイクロアーキテクチャレベルは、新しい-march=x86-64-v2-march=x86-64-v3、および -march=x86-64-v4オプションでサポートされています。