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

Після року розробки опубліковано реліз вільного набору компіляторів GCC 10.1, перший значний випуск у новій гілці GCC 10.x Відповідно до новою схемою нумерації випусків, версія 10.0 використовувалася у процесі розробки, а незадовго до виходу GCC 10.1 вже відгалужилася гілка GCC 11.0, на базі якої буде сформовано наступний значний реліз GCC 11.1.

GCC 10.1 примітний реалізацією багатьох нововведень мови C++, що розвиваються для стандарту C++20, поліпшеннями пов'язаними з майбутнім стандартом мови Сі (C2x), новими оптимізаціями в бекендах компілятора та експериментальною підтримкою режиму статичного аналізу. Крім того, під час підготовки нової гілки проектом виконано переклад репозиторію з SVN на Git.

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

  • доданий експериментальний режим статичного аналізу «-фаналізатор«, який виконує ресурсомісткий міжпроцедурний аналіз шляхів виконання коду та потоків даних у програмі. Режим здатний на етапі компіляції виявляти такі проблеми, як подвійний виклик функції free() для однієї області пам'яті, витоку файлових дескрипторів, розіменування та передачу нульових покажчиків, звернення до звільнених блоків пам'яті, використання неініціалізованих значень тощо. Застосування нового режиму для OpenSSL-коду вже дозволило виявити небезпечну вразливість.
  • Поліпшено міжпроцедурні оптимізації. Прохід IPA-SRA (міжпроцедурна скалярна заміна загальних значень) перероблений для роботи під час зв'язування і окрім іншого тепер видаляє значення, що не використовуються, і повертаються. У режимі оптимізації "-O2" включена опція "-finline-functions", яка переналаштована на користь отримання більш компактного коду, ніж на користь продуктивності виконання. Прискорено роботу евристики inline-розгортання функцій. Евристика inline-розгортання та клонування функцій тепер може використовувати інформацію про діапазон значень для передбачення ефективності окремих перетворень. Для З++ підвищено точність аналізу псевдонімів з урахуванням типів.
  • Розширено оптимізацію на етапі зв'язування (LTO). Доданий новий файл, що виконується lto-dump для скидання інформації про об'єктні файли з байткодом LTO. У паралельно виконуваних проходах LTO забезпечено автоматичне визначення числа завдань, що одночасно запускаються make і, якщо їх не вдалося визначити, використання в якості фактора розпаралелювання відомостей про кількість ядер CPU. Додано можливість стиснення байткоду LTO за допомогою алгоритму zstd.
  • Поліпшено механізм оптимізації на основі результатів профілювання коду (PGO - Profile-guided optimization), який генерує більш оптимальний код на основі аналізу особливостей виконання коду. Поліпшено супровід профілю в процесі компіляції та поділу «гарячого»/«холодного» коду. Через опцію «-fprofile-values» тепер можна відстежувати до 4 значень профілю, наприклад, для непрямих дзвінків та надання більш точної інформації про профіль.
  • Для мов C, C++ та Fortran реалізовано специфікацію паралельного програмування OpenACC 2.6, що визначає засоби для винесення операцій (offloading) на GPU та спеціалізовані процесори, такі як NVIDIA PTX. Майже завершено реалізацію стандарту Відкрийте MP 5.0 (Open Multi-Processing), що визначає API та способи застосування методів паралельного програмування на багатоядерних та гібридних (CPU+GPU/DSP) системах із загальною пам'яттю та блоками векторизації (SIMD). Додані такі можливості як умовні вирази lastprivate, директиви scan та loop, вирази order та use_device_addr. Для OpenMP та OpenACC додано підтримку винесення операцій (offloading) на GPU AMD Radeon (GCN) четвертого (Fiji) та п'ятого поколінь (VEGA 10/VEGA 20).
  • Для мов сімейства Сі додана функція «access» для опису доступу функції до об'єктів, переданих за посиланням або вказівником, і для зв'язку таких об'єктів з цілими аргументами, що містять відомості про розмір об'єктів. Для роботи разом з «access» реалізований атрибут «type» для виявлення некоректного доступу з функцій користувача, наприклад, при записі значень в область поза межами масиву. Також доданий атрибут symver для прив'язки символів в ELF-файлі до певних номерів версій.
  • Додано нові попередження:
    • -Wstring-compare (включається при -Wextra) - попереджає про наявність виразів, в яких нуль порівнюється з результатом виклику функцій strcmp і strncmp, еквівалентному константі через те, що довжина одного аргументу більше ніж розмір масиву в другому аргументі .
    • -Wzero-length-bounds (включається при -Warray-bounds) - попереджає про доступ до елементів масивів нульової довжини, що може призвести до перезапису інших даних.
    • Розширено попередження "-Warray-bounds", "-Wformat-overflow", "-Wrestrict", "-Wreturn-local-addr" і "-Wstringop-overflow", в яких розширено кількість ситуацій, що обробляються, виходу за допустимі межі.
  • Реалізовано можливість прямої вказівки розширених символів в ідентифікаторах, використовуючи поточне кодування (за замовчуванням UTF-8), а не нотацію UCN (\uNNNN або \UNNNNNNNN). Наприклад:

    static const int π = 3;
    int get_naïve_pi() {
    return π;
    }

  • Для мови Сі реалізована порція нових можливостей, що розвиваються в рамках стандарту C2X (включається через вказівку -std=c2x і -std=gnu2x): з'явилася підтримка синтаксису «[[]]» для визначення атрибутів як С++ (наприклад, [[gnu ::const]], [[deprecated]], [[fallthrough]] та [[maybe_unused]] Додана підтримка синтаксису u8» для визначення констант із символами в UTF-8.
    Додані нові макроси до . У strftime додані підстановки %OB і %Ob.

  • За умовчанням для Сі застосовано режим "-fno-common", що дозволяє підвищити ефективність доступу до глобальних змінних на деяких платформах.
  • Для C++ реалізовано близько 16 змін та нововведень, що розвиваються у стандарті C++20. У тому числі додано ключове слово "constinit"
    та реалізовано підтримку розширення шаблонів «концепції«. Концепції дозволяють визначити набір вимог до параметрів шаблону, які під час компіляції обмежують набір аргументів, які можуть бути прийняті як параметри шаблону. Концепції можна застосовувати для того, щоб уникнути логічних невідповідностей між властивостями типів даних, що використовуються всередині шаблону, та властивостями типів даних вхідних параметрів.

  • У G++ забезпечено виявлення невизначеного поведінки, викликаного зміною об'єктів-констант через constexpr. Знижено споживання пам'яті компілятором при обчисленні constexpr. Додано нові попередження "-Wmismatched-tags" та "-Wredundant-tags".
  • Запропоновано нові опції командного рядка:
    • "-fallocation-dce" для видалення зайвих пар операторів "new" і "delete".
    • -fprofile-partial-training для відключення оптимізації за розміром для коду, для якого не виконаний навчальний прогін.
    • -fprofile-reproducible для управління рівнем відтворюваності профілю.
    • -fprofile-prefix-path для визначення базового каталогу збірки з вихідних текстів, що використовується при роздільній генерації профілів (для -fprofile-generate=profile_dir і -fprofile-use=profile_dir).
  • У тексті попереджень для цих опцій забезпечено показ гіперпосилань, що дозволяють перейти до документації по цих опціях. Підстановка URL керується за допомогою опції "-fdiagnostics-urls".
  • Доданий оператор препроцесора__has_builtin«який можна використовувати для перевірки наявності вбудованих функцій.
  • Додано нову вбудовану функцію «__builtin_roundeven» з реалізацією визначеної в специфікації ISO/IEC TS 18661 функції округлення, схожої на «round», але частини, що округляє, більше 0.5 вгору (до більшого значення), менше 0.5 — вниз (до нуля), а рівної 0.5. - Відштовхуючись від парності передостанньої цифри.
  • Для архітектури AArch64 додано підтримку розширення SVE2 та покращено підтримку SVE (Scalable Vector Extension), у тому числі додано підтримку вбудованих функцій та типів SVE ACLE, забезпечено застосування векторизації. Розширено підтримку LSE (Large System Extensions) та TME (Transactional Memory Extension). Додано нові інструкції, запропоновані в Armv8.5-A та Armv8.6-A, включаючи інструкції для генерації випадкових чисел, округлення, прив'язки тегів до пам'яті,
    bfloat16 та множення матриць. Додана підтримка процесорів
    Arm Cortex-A77,
    Arm Cortex-A76AE,
    Arm Cortex-A65,
    Arm Cortex-A65AE,
    Arm Cortex-A34 та
    Marvell ThunderX3.

  • Для ARM32 додано підтримку ABI FDPIC (64-розрядні покажчики на функції). Перероблено та оптимізовано обробку 64-розрядних цілих операцій. Додана підтримка CPU
    Arm Cortex-A77,
    Arm Cortex-A76AE та
    Arm Cortex-M35P. Розширено підтримку інструкцій ACLE для обробки даних, включаючи 32-розрядні SIMD, 16-бітове множення, арифметику з фіксацією мінімально та максимально можливих значень та інші засоби для оптимізації алгоритмів DSP. Додано експериментальну підтримку інструкцій ACLE CDE (Custom Datapath Extension).

  • Значно покращено генерацію коду та векторизацію в бекенді для GPU AMD на базі мікроархітектури GCN.
  • Для архітектури AVR додано підтримку XMEGA-подібних пристроїв
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808, ATmega809 ATmega1608, ATmega1609, ATmega3208 та ATmega3209.

  • Для архітектури IA-32/x86-64 додано нове розширення архітектури набору команд Intel ENQCMD (-menqcmd). Додана підтримка CPU Intel Cooperlake (-march=cooperlake, включає ISA-розширення AVX512BF16) та Tigerlake (-march=tigerlake, включає ISA-розширення MOVDIRI, MOVDIR64B та AVX512VP2INTERSECT).
  • Оголошена застарілою і, ймовірно, буде видалена в майбутньому випуску реалізація проміжної мови HSAIL (Heterogeneous System Architecture Intermediate Language) для гетерогенних обчислювальних систем на базі архітектури HSA.

Джерело: opennet.ru

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