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

7 мая 2020 года

После года разработки опубликован релиз свободного набора компиляторов 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). Добавлена поддержка CPU Intel Cooperlake (-march=cooperlake, включает ISA-расширение AVX512BF16) и Tigerlake (-march=tigerlake, включает ISA-расширения MOVDIRI, MOVDIR64B и AVX512VP2INTERSECT).
  • Объявлена устаревшей и вероятно будет удалена в будущем выпуске реализация промежуточного языка HSAIL (Heterogeneous System Architecture Intermediate Language) для гетерогенных вычислительных систем на базе архитектуры HSA.

Источники

править
 
 
Creative Commons
Эта статья содержит материалы из статьи «Релиз набора компиляторов GCC 10», опубликованной OpenNET и распространяющейся на условиях лицензии Creative Commons Attribution (CC BY) — указание автора, источник и лицензию.
 
Эта статья загружена автоматически ботом NewsBots и ещё не проверялась редакторами Викиновостей.
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.

Комментарии

Викиновости и Wikimedia Foundation не несут ответственности за любые материалы и точки зрения, находящиеся на странице и в разделе комментариев.