После года разработки опубликован релиз свободного набора компиляторов GCC 12.1, первый значительный выпуск в новой ветке GCC 12.x. В соответствии с новой схемой нумерации выпусков, версия 12.0 использовалась в процессе разработки, а незадолго до выхода GCC 12.1 уже ответвилась ветка GCC 13.0, на базе которой будет сформирован следующий значительный релиз GCC 13.1. 23 мая проект будет отмечать 35 лет с момента формирования первого выпуска GCC.
Основные изменения:
- Добавлена поддержка отладочного формата CTF (Compact Type Format), обеспечивающего компактное хранение сведений о Си-типах, связях между функциями и отладочных символах. При встраивании в ELF-объекты формат позволяет использовать таблицы символов EFL для избежания дублирования данных.
- Объявлена устаревшей поддержка формата хранения отладочной информации “STABS“, созданного в 1980-е годы.
- Продолжена работа по расширению поддержки будущих стандартов C2X и C++23 для языков C и C++.
- В стандартной библиотеке C++ улучшена поддержка экспериментальных разделов стандартов C++20 и C++23.
- Во фронтэнде для языка фортран предоставлена полная поддержка спецификации TS 29113, описывающей возможности по обеспечению переносимости между кодом на языках Fortran и C.
- Добавлена поддержка расширения __builtin_shufflevector(vec1, vec2, index1, index2, …), ранее добавленного в Clang и предлагающего единый вызов для выполнения общих векторных операций перестановки и перетасовки.
- При использовании уровня оптимизации “-O2” по умолчанию включено применение векторизации (включены режимы -ftree-vectorize и -fvect-cost-model=very-cheap). Модель “very-cheap” допускает векторизацию только если векторный код может полностью заменить векторизируемый скалярный код.
- Добавлен режим “-ftrivial-auto-var-init” включающий явную инициализацию переменных в стеке для отслеживания проблем и блокирования уязвимостей, связанных с использованием неинициализированных переменных.
- Для языков C и C++ добавлена встроенная функция__builtin_dynamic_object_size для определения размера объекта, совместимая с аналогичной функцией из Clang.
- В бэкенд генерации кода для архитектуры x86 добавлена поддержка инструкций AVX512-FP16 для типа _Float16.
- Для архитектуры x86 добавлена защита от уязвимостей в процессорах, вызванных спекулятивным выполнением инструкций после операций безусловного прямого перехода. Проблема возникает из-за упреждающей обработки инструкций, следующих в памяти сразу за командой перехода (SLS, Straight Line Speculation). Для включения защиты предложена опция “-mharden-sls”.
- В экспериментальный статический анализатор добавлено определение использования неинициализированных переменных.
- В бэкенд для генерации байткода BPF добавлена поддержка механизма CO-RE (Compile Once – Run Everywhere), позволяющего собирать код eBPF-программ для ядра Linux только один раз и использовать специальный универсальный загрузчик, адаптирующий загружаемую программу к текущему ядру и типам BTF (BPF Type Format). CO-RE решает проблему с переносимостью скомпилированных eBPF-программ, которые ранее могли использоваться только в той версии ядра, для которой были собраны, так как позиция элементов в структурах данных меняется от версии к версии.
- В бэкенде для архитектуры RISC-V добавлена поддержка новых расширений архитектуры набора команд zba, zbb, zbc и zbs, а также ISA-расширений для векторных и скалярных криптографических операций. По умолчанию обеспечена поддержка спецификации RISC-V ISA 20191213. Добавлен флаг -mtune=thead-c906, включающий оптимизации для ядер T-HEAD c906.
- Добавлен новый режим проверки “-fsanitize=shadow-call-stack” (ShadowCallStack), который пока доступен только для архитектуры AArch64 и работает при сборке кода с опцией “-ffixed-r18”. Режим обеспечивает защиту от перезаписи адреса возврата из функции в случае переполнения буфера в стеке. Суть защиты в сохранении после передачи управления функции адреса возврата в отдельном “теневом” стеке и извлечении данного адреса перед выходом из функции.
Release.
Ссылка here.