28.09.2020

Релиз набора компиляторов 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.

Основные изменения:

  • Добавлен экспериментальный режим статического анализа «-fanalyzer«, который выполняет ресурсоёмкий межпроцедурный анализ путей выполнения кода и потоков данных в программе. Режим способен на этапе компиляции выявлять такие проблемы, как двойной вызов функции 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. Почти завершена реализация стандарта OpenMP 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. Добавлены новые макросы в ‹float.h›. В 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, ATmega4808 и ATmega4809.
  • Для архитектур IA-32/x86-64 добавлено новое расширение архитектуры набора команд Intel ENQCMD (-menqcmd, включает ISA-расширение AVX512BF16). Добавлена поддержка CPU Intel Cooperlake (-march=cooperlake) и Tigerlake (-march=tigerlake, включает ISA-расширения MOVDIRI, MOVDIR64B и AVX512VP2INTERSECT).
  • Объявлена устаревшей и вероятно будет удалена в будущем выпуске реализация промежуточного языка HSAIL (Heterogeneous System Architecture Intermediate Language) для гетерогенных вычислительных систем на базе архитектуры HSA.

Источник: https://www.opennet.ru/opennews/art.shtml?num=52903

Добавить комментарий