Реліз набору компіляторів GCC 13

Після року розробки опубліковано реліз вільного набору компіляторів GCC 13.1, перший значний випуск у новій гілці GCC 13.x. Відповідно до нової схеми нумерації випусків, версія 13.0 використовувалася в процесі розробки, а незадовго до виходу GCC 13.1 вже відгалужилася гілка GCC 14.0, на базі якої буде сформовано наступний значний реліз GCC 14.1.

Основні зміни:

  • До складу GCC прийнято фронтенд для складання програм мовою програмування Modula-2. Підтримується складання коду, що відповідає діалектам PIM2, PIM3 та PIM4, а також прийнятому стандарту ISO для цієї мови.
  • До дерева вихідних текстів GCC додано фронтенд з реалізацією компілятора мови Rust, підготовленого проектом gccrs (GCC Rust). У поточному вигляді форнтенд відзначений як експериментальний та відключений за умовчанням. Після доведення фронтенду до готовності (очікується наступного випуску), штатний інструментарій GCC зможе використовуватися для компіляції програм мовою Rust без необхідності встановлення компілятора rustc, побудованого з використанням напрацювань LLVM.
  • У механізм оптимізації на етапі зв'язування (LTO) додано підтримку сервера управління роботами (jobserver), що підтримується проектом GNU make для оптимізації виконання паралельного складання кількох потоків. У GCC jobserver застосовується для розпаралелювання робіт при LTO-оптимізації в контексті всієї програми (WPA, Whole-program Analysis). Для взаємодії з jobserver за умовчанням застосовуються іменовані канали (jobserver-style = fifo).
  • У статичному аналізаторі (-fanalyzer) запропоновано 20 нових діагностичних перевірок, серед яких "-Wanalyzer-out-of-bounds", "-Wanalyzer-allocation-size", "-Wanalyzer-deref-before-check", "-Wanalyzer- infinite-recursion"-Wanalyzer-jump-through-null", "-Wanalyzer-va-list-leak".
  • Реалізовано можливість виведення діагностики у форматі SARIF, що базується на JSON. Новий формат можна використовувати для отримання результатів статичного аналізу (GCC -fanalyzer), а також для отримання інформації про попередження та помилки. Увімкнення здійснюється опцією "-fdiagnostics-format=sarif-stderr|sarif-file|json-stderr|json|json-file", де опції з "json" призводять до висновку в специфічному для GCC варіанті формату JSON.
  • Реалізовані деякі можливості, визначені в Си-стандарті C23, такі як константа nullptr для визначення нульових покажчиків, спрощення використання списків зі змінною кількістю аргументів (variadic), розширення можливостей перерахувань, атрибут noreturn, дозвіл використання constexpr та auto при визначенні об'єктів, оператори typeof typeof_unqual, нові ключові слова alignas, alignof, bool, false, static_assert, thread_local та true, дозвіл вказівки порожніх дужок при ініціалізації.
  • Реалізовано деякі можливості, визначені в стандарті C++23, такі як можливість розміщення міток в кінці складових виразів, сумісність з типом char8_t, директива препроцесора #warning, розділені (\u{}, \o{}, \x{}) і іменовані ('\N{LATIN CAPITAL LETTER A}') escape-послідовності, static operator(), static operator[], оператор рівності всередині виразів, виключення деяких обмежень використання constexpr, підтримка UTF-8 у вихідних текстах.
  • У libstdc++ покращено експериментальну підтримку стандартів C++20 і C++23, наприклад, додано підтримку заголовкового файлу та std::format, розширені можливості заголовного файлу , додані додаткові типи з плаваючою комою, реалізовані заголовні файли і .
  • Додані нові атрибути функцій для документування того, що в цілісній змінній передається файловий дескриптор: __attribute__((fd_arg(N))), __attribute__((fd_arg_read(N))) та __attribute__((fd_arg_write(N) ». Зазначені атрибути можуть бути використані в статичному аналізаторі (-fanalyzer) для виявлення некоректної роботи з файловими дескрипторами.
  • Додано новий атрибут «__attribute__((assume(EXPR)))», за допомогою якого можна повідомити компілятор, що вираз істинно і компілятор може використовувати цей факт без обчислення виразу.
  • Додано прапор "-fstrict-flex-arrays=[level]" для вибору поведінки при обробці гнучкого елемента-масиву в структурах (Flexible Array Members, масив невизначеного розміру в кінці структури, наприклад, "int b []").
  • Доданий прапор «-Wenum-int-mismatch» для виведення попереджень у разі невідповідності між типом, що перераховується, і цілим типом.
  • У фронтенді для мови Fortran повністю реалізовано підтримку фіналізації.
  • У фронтенді для мови Go додано підтримку узагальнених функцій та типів (дженериків), забезпечено сумісність із пакетами для мови Go 1.18.
  • У бекенді для архітектури AArch64 реалізована підтримка CPU Ampere-1A (ampere1a), Arm Cortex-A715 (cortex-a715), Arm Cortex-X1C (cortex-x1c), Arm Cortex-X3 (cortex-x3) та Arm Neoverse V2 (neoverse) -v2). До опції «-march=» додано підтримку аргументів «armv9.1-a», «armv9.2-a» та «armv9.3-a». Додано підтримку процесорних розширень FEAT_LRCPC, FEAT_CSSC та FEAT_LSE2.
  • У бекенд для архітектури ARM додана підтримка CPU STAR-MC1 (star-mc1), Arm Cortex-X1C (cortex-x1c) та Arm Cortex-M85 (cortex-m85).
  • У бекенд для архітектури x86 додано підтримку процесорів Intel Raptor Lake, Meteor Lake, Sierra Forest, Grand Ridge, Emerald Rapids, Granite Rapids, а також процесорів AMD Zen 4 (znver4). Реалізовано запропоновані в процесорах Intel розширення архітектури набору команд AVX-IFMA, AVX-VNNI-INT8, AVX-NE-CONVERT, CMPccXADD, AMX-FP16, PREFETCHI, RAO-INT та AMX-COMPLEX. Для мов C і C++ на системах із SSE2 надано тип __bf16.
  • У бекенді генерації коду для GPU AMD Radeon (GCN) реалізовано можливість використання прискорювачів AMD Instinct MI200 для підвищення продуктивності OpenMP/OpenACC. Покращено векторизацію за допомогою інструкцій SIMD.
  • Значно розширено можливості бекенда для платформи LoongArch.
  • У бекенді для архітектури RISC-V додано підтримку CPU T-Head's XuanTie C906 (thead-c906). Реалізовано підтримку векторних обробників, визначених у специфікації RISC-V Vector Extension Intrinsic 0.11. Додано підтримку 30 розширень специфікацій RISC-V.
  • При формуванні об'єктів, що розділяються, із зазначенням опції «-shared» припинено додавання коду запуску після додавання оточення для обчислень з плаваючою комою, якщо включені оптимізації «-Ofast», «-ffast-math» або «-funsafe-math-optimizations».
  • Підтримка формату налагодження DWARF реалізована майже у всіх конфігураціях.
  • Додано опцію «-gz=zstd» для стиснення налагоджувальної інформації з використанням алгоритму Zstandard. Припинено підтримку застарілого режиму стиснення налагоджувальної інформації «-gz=zlib-gnu».
  • Додано початкову підтримку OpenMP 5.2 (Open Multi-Processing) та продовжено реалізацію стандартів OpenMP 5.0 та 5.1, що визначають API та способи застосування методів паралельного програмування на багатоядерних та гібридних (CPU+GPU/DSP) системах із загальною пам'яттю та блоками векторизації (SIMD).
  • Припинено підтримку застарілого формату зберігання налагоджувальної інформації «STABS» (включався опціями -gstabs і -gxcoff), створеного в 1980-і роки та застосовуваного у відладчику dbx.
  • Оголошена застаріла підтримка Solaris 11.3 (код для підтримки даної платформи буде видалено в наступному випуску).

Джерело: opennet.ru

Додати коментар або відгук