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

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

GCC 9.1 примітний стабілізацією підтримки стандарту C++17, продовженням реалізації можливостей майбутнього стандарту C++20 (кодова назва C++2a), включенням до складу фронтенду для мови D, частковим забезпеченням підтримки OpenMP 5.0 майже повною підтримкою OpenACC 2.5 збільшенням масштабованості міжпроцедурних оптимізації та оптимізації на етапі зв'язування, розширенням засобів діагностики та додаванням нових попереджень, бекендами для OpenRISC, C-SKY V2 та AMD GCN GPU .

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

  • Додано підтримку мови програмування D. В основний склад GCC включені фронтенд з компілятором GDC (Gnu D Compiler) та runtime-бібліотеки (libphobos), які дозволяють використовувати штатний GCC для складання програм мовою програмування D. Процес включення підтримки мови D у GCC почався ще у 2011 році, але затягнувся через необхідність приведення коду до відповідності вимогам GCC та проблем з передачею прав на інтелектуальну власність компанії Digital Mars, що розвиває мову програмування D;
  • Внесено покращення в генератор коду. Наприклад, реалізовано застосування різних стратегій розкриття виразів Switch (jump table, bit test, decision tree) залежно від ситуацій. Додано можливість трансформації лінійних функцій, що включають вираз Switch, з використанням оптимізації "-ftree-switch-conversion" (наприклад, набір умов виду "case 2: how = 205; break; case 3: how = 305; break;" буде перетворено в "100 * how + 5";
  • Поліпшено міжпроцедурні оптимізації. Налаштування inline-розгортання адаптовані для сучасних кодових баз на C++ та розширені новими параметрами max-inline-insns-small, max-inline-insns-size, uninlined-function-insns, uninlined-function-time, uninlined-thunk-insns та uninlined -thunk-time. Підвищено точність та агресивність поділу «холодного» та «гарячого» коду. Покращена масабуемість для дуже великих одиниць трансляції (наприклад, при застосуванні оптимізації на етапі зв'язування великих програм);
  • Поліпшено механізм оптимізації на основі результатів профілювання коду (PGO - Profile-guided optimization), який генерує більш оптимальний код на основі аналізу особливостей виконання коду. Зведена опція «-fprofile-використання» тепер включає режими оптимізації «-fversion-loops-for-strides», «-floop-interchange», «-floop-unroll-and-jam» та «-ftree-loop-distribution». Видалено включення до файлів гістограм зі лічильниками, що дозволило скоротити розмір файлів з профілями (гістограми тепер генеруються на льоту під час оптимізації під час зв'язування);
  • Розширено оптимізацію на етапі зв'язування (LTO). Забезпечено спрощення типів перед генерацією результату, що дозволило суттєво скоротити розмір об'єктних файлів LTO, зменшити споживання пам'яті на етапі зв'язування та покращити розпаралелювання операцій. Число розділів (param lto-partitions) збільшено з 32 до 128, що підвищило ефективність роботи на системах з великим числом потоків в CPU. Для керування числом процесів оптимізатора додано параметр
    «param lto-max-streaming-parallelism»;

    У результаті порівняно з GCC 8.3 внесені в GCC 9 оптимізації дозволили приблизно на 5% скоротити час компіляції Firefox 66 та LibreOffice 6.2.3. Обсяг об'єктних файлів знизився на 7%. Час зв'язування на 8-ядерному CPU зменшився на 11%. Послідовна стадія оптимізації на етапі зв'язування тепер виконується на 28% швидше та споживає на 20% менше пам'яті. Споживання пам'яті кожного оброблювача стадії LTO, що розпаралелюється, знизилося на 30%;

  • Для мов C, C++ і Fortran реалізовано більшу частину специфікації паралельного програмування OpenACC 2.5, Що визначає засоби для винесення операцій (offloading) на GPU та спеціалізовані процесори, такі як NVIDIA PTX;
  • Для С та С++ реалізовано часткову підтримку стандарту Відкрийте MP 5.0 (Open Multi-Processing), що визначає API та способи застосування методів паралельного програмування для мов Сі, Сі++ та Фортран на багатоядерних та гібридних (CPU+GPU/DSP) системах із загальною пам'яттю та блоками векторизації (SIMD);
  • Для мови Сі додано нові попередження: «-Waddress-of-packed-member» (Невирівняне значення покажчика на упакований елемент структури або об'єднання) та
    «-Wabsolute-value» (при зверненні до функцій обчислення абсолютного значення, якщо для зазначеного аргументу є більш підходяща функція, наприклад замість abs(3.14) слід використовувати fabs(3.14)). Для C++ додано нові попередження: "-Wdeprecated-copy",
    "-Winit-list-lifetime", "-Wredundant-move", "-Wpessimizing-move" та "-Wclass-conversion". Розширено багато раніше доступних попереджень;

  • Додано експериментальну підтримку частини майбутнього стандарту мови Сі, що розвивається під кодовим ім'ям C2x. Для включення підтримки C2x слід використовувати опції "-std=c2x" та "-std=gnu2x" (для включення розширень GNU). Стандарт поки що на ранній стадії розвитку, тому з його можливостей підтримується лише вираз _Static_assert з одним аргументом (_Static_assert з двома аргументами стандартизовано C11);
  • Оголошено стабільною підтримкою стандарту C++17. У фронтенді мовні можливості C++17 реалізовані повністю, а libstdc++ визначені у стандарті бібліотечні функції близькі до реалізації;
  • Продовжено реалізація елементів майбутнього стандарту C++2a Наприклад, додано можливість включення діапазонів при ініціалізації, реалізовано розширення для лямбда-виразів, додано підтримку порожніх членів структур даних та атрибутів likely/unlikely, забезпечено можливість виклику віртуальних функцій в умовних виразах тощо.
    Для включення підтримки C++2a слід використовувати опції "-std=c++2a" та "-std=gnu++2a". У libstdc++ для C++2a додані заголовні файли bit і version, типажі std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible та std::type_identity, функції std: , std::bind_front,
    std::visit, std::is_constant_evaluated та std::assume_aligned, додана підтримка типу char8_t, реалізована можливість перевірки префікса та суфікса рядків (starts_with, ends_with);

  • Додано підтримку нових процесорів ARM
    Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE та Neoverse N1. Додана підтримка інструкцій, що з'явилися в Armv8.3-A, для роботи з комплексними числами, генерації псевдовипадкових чисел (rng) і тегування пам'яті (memtag), а також інструкцій для блокування атак, пов'язаних зі спекулятивним виконанням та роботою блоку передбачення переходів. Для архітектури AArch64 додано режим захисту від перетину стека та купи ("-fstack-clash-protection"). Для використання особливостей архітектури Armv8.5-A додано опцію «-march=armv8.5-a»

  • До складу включено бекенд для генерації коду для GPU AMD на базі мікроархітектури GCN. Реалізація поки обмежена компіляцією однопотокових додатків (підтримка винесення багатопотокових обчислень через OpenMP і OpenACC буде запропонована пізніше) та підтримкою GPU Fiji та Vega 10;
  • Додано новий бекенд для процесорів OpenRISC;
  • Доданий бекенд для процесорів C-SKY V2, що випускаються однойменною китайською компанією для різних споживчих пристроїв;
  • У всіх опціях командного рядка, що оперують байтовими значеннями, забезпечено підтримку суфіксів kb, KiB, MB, MiB, GB і GiB;
  • Реалізовано опція «-flive-patching=[inline-only-static|inline-clone]», що дозволяє досягти безпечної компіляції для систем гарячого накладання патчів (live-patching) за рахунок багаторівневого керування застосуванням міжпроцедурних (IPA) оптимізації;
  • Додано опцію «-completion» для тонкого керування автодоповненням опцій при використанні bash;
  • У засобах діагностики забезпечено відображення уривків вихідних текстів із зазначенням номера рядка та з наочною позначкою супутньої інформації, такої як типи операндів. Для відключення виведення номерів рядків та міток передбачені опції «-fno-diagnostics-show-line-numbers» та «-fno-diagnostics-show-labels»;

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

  • Розширено інструменти для діагностики помилок у коді на C++, покращено читання відомостей про причини помилок та підсвічування проблемних параметрів;

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

  • Додано опцію «-fdiagnostics-format=json», що дозволяє формувати діагностичний висновок у машиночитаному форматі (JSON);
  • Додано нові опції профілювання "-fprofile-filter-files" та "-fprofile-exclude-files" для вибору оброблюваних файлів з вихідними текстами;
  • В AddressSanitizer забезпечена генерація більш компактного коду перевірок для автоматичних змінних, що дозволило знизити споживання пам'яті виконуваним виконуваним файлом;
  • Покращено виведення в режимі «-fopt-info»(Деталізація інформації про додані оптимізації). Додані нові префікси "optimized" і "missed", крім раніше доступного префікса "note". Додано висновок відомостей про прийняття рішення щодо inline-розгортання та векторизації циклів;
  • Додано опцію "-fsave-optimization-record", при вказівці якої GCC зберігає файл SRCFILE.opt-record.json.gz з описом рішень щодо застосування тих чи інших оптимізації. Від режиму «-fopt-info» нова опція відрізняється включенням додаткових метаданих, таких як інформація про профіль та inline-ланцюжки;
  • Додано опції «-fipa-stack-alignment» та «-fipa-reference-addressable» для керування при міжпроцедурних оптимізаціях вирівнюванням стека та застосуванням режимів адресації (тільки запис або точно читання) для статичних змінних;
  • Подано нові вбудовані функції для керування прив'язкою атрибутів, а також поведінкою, пов'язаною з передбаченням переходів та спекулятивним виконанням інструкцій: «__builtin_has_attribute«,«__builtin_expect_with_probability» та «__builtin_speculation_safe_value«. Для функцій, змінних та типів додано новий атрибут скопіювати;
  • Для мови Fortran реалізовано повноцінну підтримку асинхронного введення/виводу;
  • Оголошена застарілою і буде видалена у наступному значному випуску підтримка платформ Solaris 10 (*-*-solaris2.10) та Cell/BE (Cell Broadband Engine SPU). Припинено підтримку архітектур Armv2, Armv3, Armv5 та Armv5E. Припинено підтримку розширення Intel MPX (Memory Protection Extensions).

Джерело: opennet.ru

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