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

После года разработки опубликован релиз свободного набора компиляторов GCC 8.1, первый значительный выпуск в новой ветке GCC 8.x. В соответствии с новой схемой нумерации выпусков, версия 8.0 использовалась в процессе разработки, а незадолго до выхода GCC 8.1 уже ответвилась ветка GCC 9.0, на базе которой будет сформирован следующий значительный релиз GCC 9.1.

GCC 8.1 примечателен реализацией некоторых возможностей будущего стандарта C++20 (кодовое название C++2a), существенным расширением средств диагностики, значительным улучшением PGO-оптимизаций (Profile-guided optimization), включением в режиме «-O3» новых оптимизаций выполнения циклов, обеспечением поддержки SVE (Scalable Vector Extension) для архитектуры AArch64.

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

  • Добавлена экспериментальная поддержка части будущего стандарта C++2a. Для включения поддержки C++2a следует использовать опции «-std=c++2a» и «-std=gnu++2a»;
  • В libstdc++ добавлены следующие возможности стандартов C++17 и C++2a: std::filesystem, std::char_traits, std::to_chars и std::from_chars, std::to_address и std::endian. Добавлена поддержка расширений математических функций __gnu_cxx::airy_ai и __gnu_cxx::airy_bi;
  • Существенно улучшен механизм оптимизации на основе результатов профилирования кода (PGO — Profile-guided optimization), который генерирует более оптимальный код на основе анализа особенностей выполнения кода. На системах x86/x86_64 тело функции теперь разделяется на горячие и холодные регионы выполнения, данный режим оптимизации (-freorder-blocks-and-partition) по умолчанию применяется начиная с уровня «-O2»;
  • В системе оптимизации на этапе связывания (LTO) представлен новый способ подстановки отладочной информации в формате DWARF, что упрощает отладку оптимизированного кода;
  • Добавлены новые оптимизации циклов: «-floop-unroll-and-jam» (раскрутка внешнего цикла и слияние копий внутреннего цикла) и «-floop-interchange» (обмен циклами во вложенном цикле для улучшения локализации данных). Улучшена работа оптимизации «-ftree-loop-distribution» (расщепление тела вложенного цикла на несколько циклов). Включены по умолчанию при выборе режима «-O3» оптимизации «-ftree-loop-distribution», «-floop-unroll-and-jam» и «-floop-interchange». Полностью переработан режим оптимизации «-floop-nest-optimize». Для тонкого управления оптимизациями раскрутки цикла добавлена новая pragma «unroll»;
  • Улучшены межпроцедурные оптимизации: переработаны собираемые в процессе выполнения оценочные метрики, которые теперь более реалистично отражают ситуации, для которых можно использовать inline-развёртывание или клонирование;
  • Добавлена опция «-fcf-protection=[full|branch|return|none]», позволяющая повысить защищённость собираемого приложения благодаря выполнению проверок целевых адресов в инструкциях передачи потока выполнения (например, при косвенных вызовах функций, возврате из функций и косвенных jump-переходов);
  • Добавлена опция «-fstack-clash-protection», при указании которой компилятор подставляет проверочные вызовы (probe) при каждом статическом или динамическом выделении места для стека, которые позволяют выявлять факты переполнения стека и блокировать методы атак, связанные с пробросом потока выполнения через guard-страницы защиты стека;
  • В детекторе неопределенного поведения (Undefined Behavior Sanitizer), выявляющего ситуации, когда поведение программы становится неопределенным (зависит от реализации компилятора) из-за ошибки программиста, предложены две новые опции: «-fsanitize=builtin» для диагностики некорректных аргументов вызовов __builtin_clz или __builtin_ctz, и «-fsanitize=pointer-overflow» для проверки
    появления недопустимых значений указателей;
  • В Address Sanitizer добавлены режимы «-fsanitize=pointer-compare» и «-fsanitize=pointer-subtract», выводящие предупреждение о выполнении операций вычитания или сравнения над указателями, которые ссылаются на разные объекты в памяти;
  • Значительно расширены средства диагностики, обеспечено более точное определение местоположения проблем в коде и представлены подсказки по устранению проблем. Например, в случает пропущенных скобок ‘}’ и ‘)’ компилятор теперь указывает на место возможного пропуска. В случае обращения к приватным полям класса или структуры, выдаётся подсказка по использовании функции-обёртки для получения поля. Показывается когда можно использовать static_cast, const_cast и reinterpret_cast. Не подходящие друг другу типы шаблонов выделяются цветом или могут быть визуализированы (-fdiagnostics-show-template-tree) в иерархическом виде;
  • В компиляторы C и C++ добавлены новые предупреждения: «-Wmultistatement-macros» (небезопасное раскрытие макроса), «-Wstringop-truncation» (при усечении строки, копируемой через strncat, strncpy и stpncpy), «-Wif-not-aligned» (некорректное определение объектов с атрибутом warn_if_not_aligned), «-Wmissing-attributes» (пропущены атрибуты при определении функции), «-Wpacked-not-aligned» (struct или union определены с атрибутом packed и выравниванием больше 1), «-Wcast-function-type» (некорректное приведение типа для указателя на функцию), «-Wsizeof-pointer-div», «-Wcast-align=strict», «-Wclass-memaccess». В режимах «-Warray-bounds», «-Wformat-overflow» и «-Wformat-truncation» расширено число распознаваемых ситуаций выхода за границы массивов и переполнений буфера;
  • Включена по умолчанию опция «-gcolumn-info», при которой в отладочную информацию DWARF добавляются не только имя файла и номер строки, но и данные о столбце;
  • Поддержка развиваемого компанией Google языка программирования Go обновлена до версии 1.10.1. Сборщик мусора переведён на работу в параллельном режиме. Как и раньше, значения в стеке сканируются консервативно, но значения в куче сканируется точно.
  • Для ахритектуры ARM64 (AArch64) добавлена поддержка механизма SVE (Scalable Vector Extension), предоставляющего расширенные инструкции для векторной обработки данных, дополняющие набор NEON средствами для ускорения операций векторизации для научных вычислений;
  • Добавлена поддержка архитектур ARM: Armv8-R (-march=armv8-r), Armv8.3-A (-march=armv8.3-a) и Armv8.4-A (-march=armv8.4-a) и процессоров Arm Cortex-A75 (cortex-a75), Arm Cortex-A55 (cortex-a55), Arm Cortex-A55/Cortex-A75 DynamIQ big.LITTLE (cortex-a75.cortex-a55) и
    Arm Cortex-R52 для Armv8-R (cortex-r52);

  • Добавлена поддержка процессоров Intel Cannonlake (-march=cannonlake) c расширениями AVX512VBMI, AVX512IFMA и SHA ISA, Intel Icelake (-march=icelake) c расширениями AVX512VNNI, GFNI, VAES, AVX512VBMI2, VPCLMULQDQ, AVX512BITALG, RDPID и AVX512VPOPCNTDQ ISA;
  • Для систем x86 добавлена поддержка расширения CET
    (Intel Control-flow Enforcement Technology) активируемого при помощи опций «-mibt», «-mshstk» и «-mcet»;

  • Удалена поддержка устаревшего формата отладочной информации SDB/coff, опция «-gcoff» больше не поддерживается;
  • Удалена поддержка расширений Cilk+ и MPX для языков C и C++, с реализацией предложенной компанией Intel методики параллельного программирования и механизма защиты памяти.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.