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

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

8.05.20
После года разработки опубликован релиз свободного набора компиляторов 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.

OpenNet
 
Назад
Сверху Снизу