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

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

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

  • Додана підтримка формату налагодження CTF (Compact Type Format), що забезпечує компактне зберігання відомостей про Сі-типи, зв'язки між функціями і налагоджувальні символи. При вбудовуванні в ELF-об'єкти формат дозволяє використовувати таблиці символів EFL для уникнення дублювання даних.
  • Оголошено застарілою підтримку формату зберігання налагоджувальної інформації «STABS», створеного у 1980-ті роки.
  • Продовжено роботу з розширення підтримки майбутніх стандартів C2X та C++23 для мов C та C++. Наприклад, додано підтримку виразу «if consteval»; дозволено використання auto у аргументах функцій («f(auto(g()))»); дозволено використання нелітеральних змінних, goto та міток у функціях, оголошених як constexpr; додано підтримку багатовимірних індексних операторів operator[]; в if, for і switch розширено можливості блоків ініціалізації («for (using T = int; T e : v)»).
  • У стандартній бібліотеці C++ покращено підтримку експериментальних розділів стандартів C++20 і C++23. Додана підтримка std::move_only_function, , std::basic_string::resize_and_overwrite, , та std::invoke_r. Дозволено використання в constexpr-функціях std::unique_ptr, std::vector, std::basic_string, std::optional та std::variant.
  • У фронтенді для мови фортран надано повну підтримку специфікації TS 29113, що описує можливості забезпечення переносимості між кодом мовами Fortran і C.
  • Додано підтримку розширення __builtin_shufflevector(vec1, vec2, index1, index2, …), раніше доданого в Clang і що пропонує єдиний виклик для виконання загальних векторних операцій перестановки та перетасовування.
  • При використанні рівня оптимізації "-O2" за замовчуванням включено застосування векторизації (включені режими -ftree-vectorize та -fvect-cost-model=very-cheap). Модель «very-cheap» допускає векторизацію тільки якщо векторний код може повністю замінити скалярний код, що векторизується.
  • Додано режим "-ftrivial-auto-var-init", що включає явну ініціалізацію змінних у стеку для відстеження проблем і блокування вразливостей, пов'язаних з використанням неініціалізованих змінних.
  • Для мов C і C++ додана вбудована функція __builtin_dynamic_object_size для визначення розміру об'єкта, сумісна з аналогічною функцією Clang.
  • Для мов C і C++ додано підтримку атрибуту «unavailable» (наприклад, можна позначати функції, при спробі використання яких буде виводитися помилка).
  • Для мов C і C++ додано підтримку директив препроцессингу "#elifdef" і "#elifndef".
  • Доданий прапор "-Wbidi-chars" для виведення попередження у разі некоректного використання символів UTF-8, що змінюють порядок відображення двонаправленого тексту.
  • Доданий прапор "-Warray-compare" для виведення попередження при спробі порівняння двох операндів, що посилаються на масиви.
  • Продовжено реалізацію стандартів OpenMP 5.0 та 5.1 (Open Multi-Processing), що визначають API та способи застосування методів паралельного програмування на багатоядерних та гібридних (CPU+GPU/DSP) системах із загальною пам'яттю та блоками векторизації (SIMD).
  • Поліпшено реалізацію специфікації паралельного програмування OpenACC 2.6, що визначає засоби для винесення операцій (offloading) на GPU та спеціалізовані процесори, такі як NVIDIA PTX.
  • У бекенд генерації коду для архітектури x86 додано підтримку розширених інструкцій Intel AVX512-FP16 і типу _Float16.
  • Для архітектури x86 доданий захист від уразливостей у процесорах, спричинених спекулятивним виконанням інструкцій після операцій безумовного прямого переходу. Проблема виникає через попереджувальну обробку інструкцій, що йдуть у пам'яті відразу за командою переходу (SLS, Straight Line Speculation). Для включення захисту запропоновано опцію "-mharden-sls".
  • До експериментального статичного аналізатора додано визначення використання неініціалізованих змінних. Додано початкову підтримку аналізу асемблерного коду в inline-вставках. Поліпшено відстеження стану пам'яті. Переписаний код для обробки виразів switch.
  • Додано 30 нових викликів в libgccjit, бібліотеку для вбудовування генератора коду в інші процеси і використання для організації JIT-компіляції байткоду в машинний код.
  • У бекенд для генерації байткоду BPF додана підтримка механізму CO-RE (Compile Once - Run Everywhere), що дозволяє збирати код eBPF-програм для ядра Linux тільки один раз і використовувати спеціальний універсальний завантажувач, що адаптує програму, що завантажується до поточного ядра B і типів B Формат). CO-RE вирішує проблему з переносимістю скомпільованих eBPF-програм, які раніше могли використовуватися тільки в тій версії ядра, для якої були зібрані, оскільки позиція елементів структури даних змінюється від версії до версії.
  • У бекенді для архітектури RISC-V додано підтримку нових розширень архітектури набору команд zba, zbb, zbc та zbs, а також ISA-розширень для векторних та скалярних криптографічних операцій. За замовчуванням забезпечено підтримку специфікації RISC-V ISA 20191213. Додано прапор -mtune=thead-c906, що включає оптимізації для ядер T-HEAD c906.
  • У бекенд генерації коду для GPU AMD на базі мікроархітектури GCN додано підтримку типу __int128_t/integer(kind=16). Забезпечено можливість використання до 40 робочих груп на обчислювальний блок (CU) та до 16 фронтів інструкцій (wavefront, набір ниток, що паралельно виконуються SIMD Engine) на групу. Раніше було дозволено використання лише одного фронту інструкцій на CU.
  • У бекенд NVPTX, призначений для генерації коду з використанням архітектури набору команд NVIDIA PTX (Parallel Thread Execution), додано можливість використання прапорів "-march", "-mptx" та "-march-map". Реалізована підтримка PTX ISA sm_53, sm_70, sm_75 та sm_80. За промовчанням використовується архітектура sm_30.
  • У бекенд для процесорів PowerPC / PowerPC64 / RS6000 переписані реалізації вбудованих функцій. Документовані вбудовані функції __builtin_get_texasr, __builtin_get_texasru, __builtin_get_tfhar, __builtin_get_tfiar, __builtin_set_texasr, __builtin_set_texasru, __builtin_set_tfhar і __builtin_.
  • У бекенд для архітектури ARM/AArch64 додана підтримка CPU Arm Ampere-1 (-mcpu/-mtune ampere1), Arm Cortex-A510 (cortex-a510), Arm Cortex-A710 (cortex-a710) та Arm Cortex-X2 (cortex- x2). Додано підтримку нових варіантів архітектури ARMv8 для використання в опції «-march»: armv8.7-a, armv8.8-a, armv9-a. Додано реалізацію вбудованих у компілятор Сі-функцій (Intrinsics) для атомарного завантаження та збереження даних у пам'ять, засновану на використанні розширених інструкцій ARM (ls64). Додано підтримку прискорення функцій memcpy, memmove та memset за допомогою ARM-розширення mopsoption.
  • Додано новий режим перевірки "-fsanitize=shadow-call-stack" (ShadowCallStack), який поки доступний тільки для архітектури AArch64 і працює при складанні коду з опцією "-ffixed-r18". Режим забезпечує захист від перезапису адреси повернення з функції у разі переповнення буфера у стеку. Суть захисту у збереженні після передачі керування функцією адреси повернення в окремому «тіньовому» стеку та вийманні цієї адреси перед виходом з функції.

Джерело: opennet.ru

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