После года разработки опубликован (https://gcc.gnu.org/ml/gcc-announce/2018/msg00001.html) релиз свободного набора компиляторов GCC 8.1 (https://gcc.gnu.org/gcc-8), первый значительный выпуск в новой ветке GCC 8.x. В соответствии с новой схемой (https://gcc.gnu.org/develop.html#num_scheme) нумерации выпусков, версия 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.
Основные изменения (https://gcc.gnu.org/gcc-8/changes.html):
- Добавлена экспериментальная поддержка части (https://gcc.gnu.org/projects/cxx-status.html#cxx2a) будущего стандарта 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 (https://ru.wikipedia.org/wiki/Profile-guided_optimization) - 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". Для тонкого управления оптимизациями раскрутки цикла (https://ru.wikipedia.org/wiki/%D0%A0%D0%... добавлена новая 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++ добавлены новые предупреждения (https://gcc.gnu.org/onlinedocs/gcc-8.1.0/gcc/Warning-Options...: "-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"
- Включена по умолчанию опция "-gcolumn-info", при которой в отладочную информацию DWARF добавляются не только имя файла и номер строки, но и данные о столбце;
- Поддержка развиваемого компанией Google языка программирования Go обновлена до версии 1.10.1. Сборщик мусора переведён на работу в параллельном режиме. Как и раньше, значения в стеке сканируются консервативно, но значения в куче сканируется точно.
- Для ахритектуры ARM64 (AArch64) добавлена поддержка механизма SVE (https://community.arm.com/processors/b/blog/posts/technology... 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+ (https://www.opennet.ru/opennews/art.shtml?num=31517) и MPX (https://ru.wikipedia.org/wiki/Intel_MPX) для языков C и C++, с реализацией предложенной компанией Intel методики параллельного программирования и механизма защиты памяти.
URL: https://gcc.gnu.org/ml/gcc-announce/2018/msg00001.html
Новость: https://www.opennet.ru/opennews/art.shtml?num=48535