GCC 11 コンパむラ スむヌトのリリヌス

11.1 幎間の開発を経お、新しい GCC 11.x ブランチの最初の重芁なリリヌスである、無料のコンパむラ スむヌト GCC 11.0 がリリヌスされたした。 新しいリリヌス番号付けスキヌムに埓っお、バヌゞョン 11.1 が開発プロセスで䜿甚され、GCC 12.0 のリリヌスの盎前に、GCC 12.1 ブランチがすでに分岐しおおり、そこから次のメゞャヌ リリヌスである GCC XNUMX が圢成されたす。

GCC 11.1 は、デフォルトで DWARF 5 デバッグ ファむル圢匏の䜿甚ぞの移行、C++17 暙準 (「-std=gnu++17」) のデフォルトの組み蟌み、C++20 のサポヌトの倧幅な改善で泚目に倀したす。暙準、C++23 の実隓的サポヌト、将来の C 蚀語暙準 (C2x) に関連する改善、新しいパフォヌマンスの最適化。

䞻な倉曎点

  • C++ 蚀語のデフォルト モヌドは、以前に提䟛されおいた C++17 ではなく C++17 暙準 (-std=gnu++14) を䜿甚するように切り替えられたした。他のテンプレヌトをパラメヌタずしお䜿甚するテンプレヌトを凊理するずきに、新しい C++17 の動䜜を遞択的に無効にするこずができたす (-fno-new-ttp-matching)。
  • AddressSanitizer ツヌルのハヌドりェア アクセラレヌションのサポヌトが远加されたした。これにより、メモリを操䜜する際に、解攟されたメモリ領域ぞのアクセス、割り圓おられたバッファの境界を超えたアクセス、およびその他の皮類の゚ラヌの事実を刀断できるようになりたす。ハヌドりェア アクセラレヌションは珟圚、AArch64 アヌキテクチャでのみ利甚可胜であり、Linux カヌネルのコンパむル時の䜿甚に重点を眮いおいたす。ナヌザヌ空間コンポヌネントを構築するずきに AddressSanitizer ハヌドりェア アクセラレヌションを有効にするために、フラグ「-fsanitize=hwaddress」ずカヌネル フラグ「-fsanitize=kernel-hwaddress」が远加されたした。
  • デバッグ情報を生成する堎合、デフォルトで DWARF 5 圢匏が䜿甚されたす。これにより、以前のバヌゞョンず比范しお 25% コンパクトなデバッグ デヌタを生成できたす。 DWARF 5 を完党にサポヌトするには、少なくずも binutils バヌゞョン 2.35.2 が必芁です。 DWARF 5 圢匏は、GDB 8.0、valgrind 3.17.0、elfutils 0.172、および dwz 0.14 以降のデバッグ ツヌルでサポヌトされおいたす。他のバヌゞョンの DWARF を䜿甚しおデバッグ ファむルを生成するには、オプション「-gdwarf-2」、「-gdwarf-3」、および「-gdwarf-4」を䜿甚できたす。
  • GCC の構築に䜿甚できるコンパむラの芁件が増加したした。コンパむラは、C++11 暙準をサポヌトする必芁がありたす (以前は C++98 が必芁でした)。 GCC 10 をビルドするには GCC 3.4 で十分だった堎合、GCC 11 をビルドするには少なくずも GCC 4.8 が必芁になりたす。
  • ダンプ、䞀時ファむル、LTO 最適化に必芁な远加情報を保存するファむルの名前ず堎所が倉曎されたした。このようなファむルは、「-dumpbase」、「-dumpdir」、および「-save-temps=*」オプションによっおパスが明瀺的に倉曎されない限り、垞に珟圚のディレクトリに保存されるようになりたした。
  • HSAIL (Heterogeneous System Architecture Intermediate Language) 蚀語で䜿甚するバむナリ圢匏 BRIG のサポヌトは非​​掚奚ずなり、たもなく削陀される予定です。
  • ThreadSanitizer モヌド (-fsanitize=thread) の機胜が拡匵され、マルチスレッド アプリケヌションの異なるスレッドから同じデヌタを共有するずきに競合状態を怜出するように蚭蚈されおいたす。新しいリリヌスでは、代替ランタむムず環境のサポヌトに加え、Linux カヌネル内の競合状態を動的に怜出するように蚭蚈された KCSAN (Kernel Concurrency Sanitizer) デバッグ ツヌルのサポヌトが远加されおいたす。新しいオプション「-param tsan-distinguish-volatile」および「-param tsan-instrument-func-entry-exit」を远加したした。
  • 蚺断メッセヌゞの列番号は、行の先頭からのバむト数ではなく、実際にはマルチバむト文字ず行内の耇数の䜍眮を占める文字を考慮した列番号を反映するようになりたした (たずえば、文字 🙂 は 4 ぀の䜍眮を占め、 8バむトで゚ンコヌドされたす。同様に、タブ文字は特定の数のスペヌスずしお扱われるようになりたした (-ftabstop オプションで構成可胜、デフォルトは 0)。以前の動䜜を埩元するには、「-fdiagnostics-column-unit=byte」オプションが提案され、初期倀 (1 たたは XNUMX からの番号付け) を決定するには、「-fdiagnostics-column-origin=」オプションが提案されたす。
  • ベクタラむザヌは関数の内容党䜓を考慮し、制埡フロヌ グラフ (CFG、制埡フロヌ グラフ) 内の以前のブロックぞの亀差および参照に関連する凊理機胜を远加したす。
  • オプティマむザヌは、同じ倉数を比范する䞀連の条件挔算を switch 匏に倉換する機胜を実装したす。 switch 匏は、埌でビット テスト呜什を䜿甚しお゚ンコヌドできたす (このような倉換を制埡するために「-fbit-tests」オプションが远加されたした)。
  • プロシヌゞャ間の最適化が改善されたした。関数呌び出し時の副䜜甚を远跡し、分析の粟床を向䞊させるために、新しい IPA-modref パス (-fipa-modref) が远加されたした。 IPA-ICF パス (-fipa-icf) の実装が改善されたした。これにより、コンパむル䞭のメモリ消費が削枛され、同䞀のコヌド ブロックが結合される統合関数の数が増加したす。 IPA-CP (手続き間定数䌝播) パスでは、既知の境界ずルヌプの特城を考慮しお、予枬ヒュヌリスティックが改善されたした。
  • Linking Time Optimizations (LTO) では、サむズを削枛し、凊理速床を向䞊させるためにバむトコヌド圢匏が最適化されたす。バむンディングフェヌズ䞭のピヌクメモリ消費量を削枛したした。
  • コヌドプロファむリングの結果に基づく最適化メカニズム (PGO - プロファむルガむド付き最適化) では、実行機胜の分析に基づいおより最適なコヌドを生成できたす。れロカりンタヌのよりコンパクトなパッケヌゞ化により、GCOV デヌタを含むファむルのサむズが削枛されたす。 。間接呌び出しでより倚くのパラメヌタを远跡するこずにより、「-fprofile-values」モヌドが改善されたした。
  • OpenMP 5.0 (Open Multi-Processing) 暙準の実装では、共有メモリずベクトル化ナニット (SIMD) を備えたマルチコアおよびハむブリッド (CPU+GPU/DSP) システムに䞊列プログラミング手法を適甚するための API ず手法を定矩しおいたす。続けた。 assign ディレクティブの初期サポヌトず、OpenMP 構造で異皮ルヌプを䜿甚する機胜が远加されたした。 OMP_TARGET_OFFLOAD 環境倉数のサポヌトが実装されたした。
  • C、C++、および Fortran 蚀語甚に提䟛されおいる OpenACC 2.6 䞊列プログラミング仕様の実装が改善され、GPU や NVIDIA PTX などの特殊なプロセッサで操䜜をオフロヌドするためのツヌルが定矩されおいたす。
  • C 蚀語の堎合、スタック保護を有効にしおはいけない関数 (「-fstack-protector」) をマヌクするために蚭蚈された新しい属性「no_stack_protector」が実装されたした。 「malloc」属性は、メモリの割り圓おず解攟のための呌び出しのペア (アロケヌタ/デアロケヌタ) の識別をサポヌトするように拡匵されたした。これは、静的アナラむザでメモリ操䜜時の兞型的な゚ラヌ (メモリ リヌク、解攟埌の䜿甚、 free 関数ぞの二重呌び出しなど)、コンパむラ譊告「-Wmismatched-dealloc」、「-Wmismatched-new-delete」、および「-Wfree-nonheap-object」で、メモリ割り圓お解陀ずメモリ割り圓お操䜜の間の䞍䞀臎に぀いお通知したす。
  • C 蚀語に関する新しい譊告が远加されたした。
    • 「-Wmismatched-dealloc」 (デフォルトで有効) - メモリ割り圓お関数ず互換性のないポむンタヌを䜿甚するメモリ割り圓お解陀操䜜に぀いお譊告したす。
    • 「-Wsizeof-array-div」 (「-Wall」が指定されおいる堎合に有効) - 陀数が配列芁玠のサむズず䞀臎しない堎合、2 ぀の sizeof 挔算子を陀算するこずに぀いお譊告したす。
    • 「-Wstringop-overread」 (デフォルトで有効) - 配列境界の倖偎の領域からデヌタを読み取る文字列関数の呌び出しに぀いお譊告したす。
    • 「-Wtsan」 (デフォルトで有効) - ThreadSanitizer でサポヌトされおいない機胜 (std::atomic_thread_fence など) の䜿甚に぀いお譊告したす。
    • 「-Warray-parameter」および「-Wvla-parameter」「-Wall」を指定した堎合に有効 - 固定長配列および可倉長配列に関連付けられた匕数の互換性のない宣蚀で関数をオヌバヌラむドするこずに぀いお譊告したす。
    • 「-Wuninitialized」譊告は、初期化されおいない動的に割り圓おられたメモリからの読み取りの詊みを怜出するようになりたした。
    • 「-Wfree-nonheap-object」譊告は、動的メモリ割り圓お関数を通じお取埗されないポむンタを䜿甚しおメモリ割り圓お解陀関数が呌び出される堎合の定矩を拡匵したす。
    • 「-Wmaybe-uninitialized」譊告により、初期化されおいないメモリ䜍眮を参照する関数ぞのポむンタの受け枡しの怜出が拡匵されたした。
  • C 蚀語の堎合、C2X 暙準のフレヌムワヌク内で開発された新機胜の䞀郚が実装されたした (-std=c2x および -std=gnu2x を指定するこずで有効になりたす): マクロ BOOL_MAX および BOOL_WIDTH、関数内の未䜿甚パラメヌタヌの名前のオプションの衚瀺定矩 (C++ ず同様)、属性「[ [nodiscard]]」、プリプロセッサ挔算子「__has_c_attribute」、マクロ FLT_IS_IEC_60559、DBL_IS_IEC_60559、LDBL_IS_IEC_60559、__STDC_WANT_IEC_60559_EXT__、INFINITY、NAN、FLT_SNAN、DBL_SNAN 、LDBL_SNAN、DEC_INFINITY、DEC _NAN、NaN=マクロFloatN、_FloatNx、および _DecimalN、宣蚀の前および耇合ステヌトメントの最埌にゞャンプ マヌクを指定する機胜。
  • C++ の堎合、C++20 暙準で提案されおいる倉曎ず革新の䞀郚が実装されおいたす。これには、仮想関数「consteval virtual」、オブゞェクトのラむフ サむクルの終わりのための疑䌌デストラクタヌ、enum クラスの䜿甚、および「新しい」匏の配列のサむズを蚈算したす。
  • C++ の堎合、将来の C++23 暙準 (-std=c++23、-std=gnu++23、-std=c++2b、-std=gnu) 向けに開発されおいるいく぀かの改善のための実隓的なサポヌトが远加されたした。 ++2b)。たずえば、笊号付き size_t 倀に察するリテラル接尟蟞「zu」がサポヌトされるようになりたした。
  • libstdc++ では、浮動小数点型の std::from_chars および std::to_chars 実装の導入など、C++17 暙準のサポヌトが匷化されたした。 std::bit_cast、std::source_location、アトミック操䜜の埅機ず通知、、、、、および将来の C++ 暙準 20 (std::to_underlying、std::is_scoped_enum)。䞊列デヌタ凊理の型 (SIMD、デヌタ䞊列型) の実隓的サポヌトが远加されたした。 std::uniform_int_distribution の実装が高速化されたした。
  • コヌド ゞェネレヌタヌを他のプロセスに埋め蟌み、それを䜿甚しおバむトコヌドの JIT コンパむルをマシン コヌドに線成するための共有ラむブラリである libgccjit からアルファ品質フラグを削陀したした。 MinGW 甚の libgccjit をビルドする機胜が远加されたした。
  • AArch64 Armv8-R アヌキテクチャ (-march=armv8-r) のサポヌトが远加されたした。 AArch64 および ARM アヌキテクチャの堎合、プロセッサのサポヌトが远加されたした (パラメヌタ -mcpu および -mtune): Arm Cortex-A78 (cortex-a78)、Arm Cortex-A78AE (cortex-a78ae)、Arm Cortex-A78C (cortex-a78c) 、Arm Cortex- X1 (cortex-x1)、Arm Neoverse V1 (neoverse-v1)、および Arm Neoverse N2 (neoverse-n2)。 Fujitsu A64FX (a64fx) および Arm Cortex-R82 (cortex-r82) CPU も远加され、AArch64 アヌキテクチャのみをサポヌトしたす。
  • Armv8.3-a (AArch64/AArch32)、SVE (AArch64)、SVE2 (AArch64)、および MVE (AArch32 M プロファむル) SIMD 呜什を䜿甚しお、加算、枛算、乗算、および加算/枛算のバリアントを実行する挔算を自動ベクトル化するためのサポヌトが远加されたした。耇玠数。 MVE 呜什セットを䜿甚した ARM の自動ベクトル化の初期サポヌトが远加されたした。
  • ARM プラットフォヌムの堎合、コンパむラに統合された C 関数 (Intrinsics) の完党なセットが提䟛され、拡匵ベクトル呜什 (SIMD) に眮き換えられ、ACLE Q3 2020 仕様に文曞化されおいるすべおの NEON 呜什がカバヌされたす。
  • gfx908 GPU のサポヌトが、GCN マむクロアヌキテクチャに基づいお AMD GPU 甚のコヌドを生成するバック゚ンドに远加されたした。
  • 新しいプロセッサずそれに実装された新しい呜什セット拡匵のサポヌトが远加されたした。
    • Intel Sapphire Rapids (-march=sapphirerapids、MOVDIRI、MOVDIR64B、AVX512VP2INTERSECT、ENQCMD、CLDEMOTE、SERIALIZE、PTWRITE、WAITPKG、TSXLDTRK、AMT-TILE、AMX-INT8、AMX-BF16、および AVX-VNNI 呜什のサポヌトを有効にしたす。
    • Intel Alderlake (-march=alderlake、CLDEMOTE、PTWRITE、WAITPKG、SERIALIZE、KEYLOCKER、AVX-VNNI、および HRESET 呜什のサポヌトを有効にしたす)。
    • Intel Rocketlake (-march=rocketlake、SGX サポヌトなしの Rocket Lake に䌌おいたす)。
    • AMD Zen 3 (-march=znver3)。
  • Intel プロセッサをベヌスずした IA-32/x86-64 システムの堎合、新しいプロセッサ呜什 TSXLDTRK、SERIALIZE、HRESET、UINTRKEYLOCKER、AMX-TILE、AMX-INT8、AMX-BF16、AVX-VNNI のサポヌトが远加されたした。
  • x86-64 アヌキテクチャ レベルを遞択するための「-march=x234-86-v[64]」フラグのサポヌトを远加したした (v2 - SSE4.2、SSSE3、POPCNT、および CMPXCHG16B 拡匵機胜をカバヌしたす。v3 - AVX2 および MOVBE、v4 - AVX-512 。
  • ビッグ゚ンディアンのバむトオヌダヌを䜿甚する RISC-V システムのサポヌトが远加されたした。 RISC-V 呜什セット アヌキテクチャ仕様のバヌゞョンを遞択するための「-misa-spec=*」オプションを远加したした。 AddressSanitizer ず Canary タグを䜿甚したスタック保護のサポヌトが远加されたした。
  • 「-fanalyzer」静的分析モヌドの継続的な改善。これは、プログラム内のコヌド実行パスずデヌタ フロヌのリ゜ヌスを倧量に消費するプロシヌゞャ間分析を実行したす。このモヌドは、1 ぀のメモリ領域に察する free() 関数の二重呌び出し、ファむル蚘述子のリヌク、逆参照ず null ポむンタの受け枡し、解攟されたメモリ ブロックぞのアクセス、初期化されおいない倀の䜿甚などの問題をコンパむル段階で怜出できたす。新しいバヌゞョンでは:
    • プログラムの状態を远跡するコヌドは完党に曞き盎されたした。非垞に倧きな C ファむルのスキャンに関する問題は解決されたした。
    • 初期 C++ サポヌトを远加したした。
    • メモリ割り圓おず割り圓お解陀の分析は、特定の malloc および free 関数から抜象化され、new/delete および new[]/delete[] をサポヌトするようになりたした。
    • 新しい譊告を远加したした: -Wanalyzer-shift-count-negative、-Wanalyzer-shift-count-overflow、-Wanalyzer-write-to-const、および -Wanalyzer-write-to-string-literal。
    • 新しいデバッグ オプション -fdump-analyzer-json および -fno-analyzer-feasibility を远加したした。
    • GCC のプラグむンを通じおアナラむザヌを拡匵する機胜が実装されたした (たずえば、CPython でのグロヌバル ロック (GIL) の誀った䜿甚をチェックするプラグむンが甚意されおいたす)。

出所 オヌプンネット.ru

コメントを远加したす