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

Новости мира unix. Хотите узнать секрет вечного счастья? Откройте страницу 246.
Ответить
acolyte
Аватара пользователя
Сообщения: 4092
Зарегистрирован: 20.08.2022

#

Релиз набора компиляторов GCC 15
Дата публикации:Fri, 25 Apr 2025 22:30:13 +0300




После года разработки опубликован релиз свободного набора компиляторов GCC 15.1, первый значительный выпуск в новой ветке GCC 15.x. В соответствии со схемой нумерации выпусков, версия 15.0 использовалась в процессе разработки, а незадолго до выхода GCC 15.1 уже ответвилась ветка GCC 16.0, на базе которой будет сформирован следующий значительный релиз GCC 16.1.



Основные изменения:
  • При компиляции программ на языке C по умолчанию задействован стандарт С23 (обзор изменений) с расширениями GNU ("-std=gnu23"). Ранее по умолчанию использовался стандарт C17 - "-std=gnu17"). Изменение потенциально может привести к проблемам при сборке существующих проектов из-за включения константы nullptr, типа _BitInt(n) и ключевых слов bool, true и false, которые могут конфликтовать с заданными в приложениях одноимёнными идентификаторами.



    Реализованы возможности стандарта C23:

    Директива "#embed", предназначенная для встраивания в код бинарных ресурсов.
    Атрибут "unsequenced", сигнализирующий, что результат не зависит от порядка выполнения.
    Атрибут "reproducible", указывающий, что функция всегда возвращает один и тот же результат при одинаковых входных данных, т.е. не зависит от иных факторов.
Реализованы элементы будущего стандарта C2Y (-std=c2y и -std=gnu2y):
  • Возможность объявления переменных в операторе "if", например, "if (int x = get ()) {...}".

    Поддержка присвоения имён циклам для того, чтобы ссылаться на них в коде.

    outer: for (int i = 0; i < IK; ++ i) {
    switch (i) {
    case 1:
    break; // jumps to CONT1
    case 2:
    break outer; // jumps to CONT2
    }
    // CONT1
    }
    // CONT2




    Поддержка указания диапазонов целых значений в выражениях "case", например, "case 1 ... 10:".

    Суффиксы "i" и "j" для обозначения мнимой части в комплексных числах.
    Возможность использования операторов "++" и "--" с комплексными числами.

    Конструкция "_Generic(type, expr1, expr2, ...)" для выбора выражения на основе типа операнда.

    Поддержка обращения к байтовым массивам как к другим типам объектов, таким как структуры и объединения.

    Поддержка применения оператора "alignof" к неполным массивам (объявленным без указания размера, например, "int a[]").

    Добавлен новый синтаксис для восьмеричных, шестнадцатеричных и универсальных escape-последовательностей символов. Вместо "\u", "\x" и "\nnn" - предложены последовательности "\u{}", "\o{}" и "\x{}", в которых можно указывать произвольное число цифр.

    Встроенные функции "__builtin_stdc_rotate_left" и "__builtin_stdc_rotate_right".

    Разрешены операции с нулевой длиной на указателях NULL (например, "sizeof(*p)").

В фронтэнде для языка C++ реализованы возможности, развиваемые для будущего стандарта C++26:
  • Вариативный оператор "friend" ("friend Ts...").
    Возможность использования ключевого слова "constexpr" с разновидностью оператора "new" (placement new) для размещения объекта в заранее выделенной памяти во время компиляции.
    Вывод ошибки при удалении указателя на неполный тип.

    Объявлен устаревшим синтаксис определения вариативных параметров с многоточием без предшествующей запятой (например, когда указывается "void e(int...)" вместо "void e(int, ...)").
    Индексирование пакета параметров в шаблонах.
    Атрибуты для структурированных привязок;
    Синтаксис '= delete("причина")';

    Включение "@", "$" и "`" в базовый набор символов.

    Запрещено использование макросов для объявления модулей.

    Возможность применения структурированного связывания (structured binding) в качестве условия в операторах if и switch.
    Прекращена поддержка прямого сравнения массивов (например, "int arr1[5]; int arr2[5]; bool same = arr1 == arr2").

    Механизм "#embed" для встраивания бинарных ресурсов.

    Объявлен устаревшим шаблонный класс is_trivial.
Добавлены возможности C++23:
  • Запрет некоторых применений директивы "export" и разрешение использования "export {}".
    Поддержка продления времени жизни временных объектов в циклах "for", перебирающих диапазоны.
В библиотеке libstdc++ реализована экспериментальная поддержка модулей std и std.compat.

Использование инициализатора "{0}" для объединений в коде на C и C++ теперь не гарантирует очистку всего содержимого, а приводит к обнулению первого элемента объединения. Для очистки всего объединения следует использовать выражение "{}", определённое в спецификации C23, или указать опцию "-fzero-init-padding-bits=unions" для восстановления старого поведения.


Реализована поддержка атрибута "musttail" ([[gnu::musttail]] и [[clang::musttail]]) для гарантированных хвостовых вызовов. Атрибут применяется к выражениям return, в которых осуществляется рекурсивный вызов текущей функции, и гарантирует, что такой вызов будет использовать хвостовую рекурсию, при которой не выделяется дополнительная память в стеке (исключает риск исчерпания памяти при очень большом числе вызовов).

Реализована поддержка атрибута flag_enum ([[gnu::flag_enum]] и [[clang::flag_enum]]), применяемого к перечислениям для индикации, что содержимое используются в битовых операциях (исключает вывод предупреждения в режиме "-Wswitch").

Добавлена поддержка атрибута "counted_by", через который можно указать поле в структуре с гибким массивом, определяющим число элементов. Атрибут может использоваться для повышения эффективности проверок выхода за границу буфера.

Для функций добавлен атрибут "nonnull_if_nonzero", определяющий, что некоторые параметры функции с указателями могут принимать значение NULL, только если другой параметр равен нулю.

Разрешено использовать расширенные ассемблерные вставки "asm (....)" вне функций. В ассемблерных вставках разрешено перезаписывать память в красной зоне стека (область на вершине стека).

Компиляция кода на C++ ускорена благодаря улучшенному хэшированию шаблонов.

Добавлены новые оптимизации. Реализована поддержка векторизации циклов, в которых имеется код для преждевременного выхода (например, через вызов break или return), даже если подобные циклы манипулируют динамически выделяемыми массивами или буферами, размер которых неизвестен на этапе компиляции. При указании опции "-O2" включена векторизация некоторых легко векторизируемых циклов, для которых отсутствуют сведения о количестве итераций (tripcount).


Добавлен режим инкрементальной оптимизации на этапе связывания (LTO, Link-Time Optimization), существенно сокращающий время перекомпиляции при использовании LTO в ситуациях, когда внесены незначительные изменения в код (отредактирована одна функция). Для включения инкрементального режима предложена опция "-flto-incremental".

Улучшена компиляция очень больших входных файлов. Реализовано отслеживание номеров столбцов, превышающих 4096. Повышена точность указания местоположения ошибок и предупреждений в очень больших файлах.

Повышена наглядность отчётов при диагностике проблем. Например, обеспечено выделение места возникновения проблемы символом "⚠️", изменена компоновка вывода при ошибках в шаблонах C++, добавлены подсказки для упрощения перехода на стандарт C23, переработана цветовая схема. Добавлена возможность вывода диагностики в формате Sarif (-fdiagnostics-format=sarif-file).

Реализована библиотека libgdiagnostics, позволяющая интегрировать в свои проекты возможности GCC, связанные с оформление диагностических сообщений (например, можно задействовать средства цитирования, подсветки и подсказок по исправлению).



Добавлены предупреждения "-Wtrailing-whitespace" и "-Wleading-whitespace" для выявления остаточных пробелов в конце строк и лишних пробелов начале строк.


Добавлено предупреждение "-Wheader-guard" для информирования о проблемах в макросах защиты заголовочных файлов, предотвращающих повторное включение заголовочного файла.


Фронтэнд для языка D обновлён до версии 2.111.0.

Во фронтэнд для языка Fortran добавлена поддержка беззнаковых целых чисел.

В состав включён компилятор для языка COBOL - gcobol, поддерживающий платформы x86-64 и AArch64, и не рассчитанный на использование на 32-разрядных системах. Компилятор реализует спецификацию ISO/IEC 1989:2023 и
проходит большую часть тестов NIST CCVS/85.





Продолжена реализация стандартов OpenMP 5.0, 5.1, 5.2 и 6.0 (Open Multi-Processing), определяющих API и способы применения методов параллельного программирования на многоядерных и гибридных (CPU+GPU/DSP) системах с общей памятью и блоками векторизации (SIMD). Добавлена поддержка метадиректив и конструкций tile, unroll, interop и dispatch.
Для некоторых GPU AMD и NVIDIA добавлена поддержка унифицированной разделяемой памяти (включается через указание unified_shared_memory в директиве "requires"). Добавлена поддержка выражения "self_maps".

В бэкенд для архитектуры AArch64 добавлена поддержка платформы
MinGW (aarch64-w64-mingw32). Реализовано более 20 расширений ARM8 и улучшена поддержка расширения ACLE (Arm C Language Extensions). Внесены многочисленные улучшения в генератор кода. Добавлена поддержка CPU:
    • Apple A12 (
      apple-a12
      )
    • Apple M1 (
      apple-m1
      )
    • Apple M2 (
      apple-m2
      )
    • Apple M3 (
      apple-m3
      )
    • Arm Cortex-A520AE (
      cortex-a520ae
      )
    • Arm Cortex-A720AE (
      cortex-a720ae
      )
    • Arm Cortex-A725 (
      cortex-a725
      )
    • Arm Cortex-R82AE (
      cortex-r82ae
      )
    • Arm Cortex-X925 (
      cortex-x925
      )
    • Arm Neoverse N3 (
      neoverse-n3
      )
    • Arm Neoverse V3 (
      neoverse-v3
      )
    • Arm Neoverse V3AE (
      neoverse-v3ae
      )
    • FUJITSU-MONAKA (
      fujitsu-monaka
      )
    • NVIDIA Grace (
      grace
      )
    • NVIDIA Olympus (
      olympus
      )
    • Qualcomm Oryon-1 (
      oryon-1
      )
В бэкенде генерации кода для GPU AMD Radeon (GCN) реализована поддержка библиотеки libstdc++ и добавлена экспериментальная поддержка генерации кода для серий устройств gfx9-generic, gfx10-3-generic и gfx11-generic.


В бэкенд для архитектуры x86 добавлена поддержка расширений архитектуры набора команд Intel AVX10.2, AMX-AVX512, AMX-FP8, AMX-MOVRS, AMX-TF32, AMX-TRANSPOSE, MOVRS. Добавлена поддержка CPU Intel Diamond Rapids и Xeon Phi.


Расширены возможности бэкендов для платформ LoongArch и AVR.


Удалена поддержка целевой архитектуры nios2, применяемой в процессорах Nios II. Объявлена устаревшей и будет удалена в следующем значительном выпуске поддержка ABI ILP32 (-mabi=ilp32) в порте для AArch64.








Новость позаимствована с opennet.ru
Ссылка на оригинал: https://www.opennet.ru/opennews/art.shtml?num=63141

Жизнь за Нер'зула!

Ответить