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

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

#

Релиз набора компиляторов LLVM 20
Дата публикации:Fri, 07 Mar 2025 15:30:41 +0300




После шести месяцев разработки доступен релиз проекта LLVM 20.1.0, развивающего инструментарий (компиляторы, оптимизаторы и генераторы кода), компилирующий программы в промежуточный биткод RISC-подобных виртуальных инструкций (низкоуровневая виртуальная машина с многоуровневой системой оптимизаций). Сгенерированный псевдокод может быть преобразован в машинный код для заданной целевой платформы или использован JIT-компилятором для формирования машинных инструкций непосредственно во время выполнения программы. На базе технологий LLVM проектом развивается компилятор Clang, поддерживающий языки программирования C, C++ и Objective-C. Начиная с прошлой ветки проект перешёл на новую схему формирования номеров версий, в соответствии с которой нулевой выпуск ("N.0") используется в процессе разработки, а первая стабильная версия снабжается номером "N.1".




Среди улучшений в Clang 20:
  • Реализованы возможности, развиваемые для будущего стандарта C2y:

    Добавлены суффиксы "i" и "j" для обозначения мнимой части в комплексных числах (ранее были доступны в расширениях GNU "-Wgnu-imaginary-constant").
    Поддержка указания диапазонов целых значений в выражениях "case", например, "case 1 ... 10:" (ранее было доступно в расширениях GNU "-Wgnu-case-range").

    Запрещено использование квалификаторов и спецификаторов хранения классов для параметров типа void (например, "const void", "static void" и "register void").

    Разрешено определение поведения объектов пустых структур и объединений (union) на усмотрение компилятора.

    Обработка квалификаторов типов функций (например, const и volatile) теперь определяется на усмотрение компилятора. В Clang подобные квалификаторы игнорируются.

    Изменена обработка неопределенного поведения, связанного с инициализацией.

Добавлены возможности, определённые в Си-стандарте C23:
  • Расширен диапазон значений, допустимых для элементов перечислений (enum) - значения теперь могут выходить за пределы типа int (быть больше INT_MAX и меньше INT_MIN).

    Расширены возможности работы с перечислениями (enum): в перечислениях разрешено явно указывать базовый тип, отличный от типа int.
В режиме совместимости с компилятором msvc разрешено указывать спецификатор "inline" в объявлениях "typedef" для типов функций.
В заголовочный файл limits.h добавлены макросы LONG_LONG_* для библиотеки bionic, применяемой в Android.

Во всех режимах для языка Си ключевое слово "__nullptr" реализовано как псевдоним к "nullptr".

Добавлены новые встроенные макросы __INT8_C, __INT16_C, __INT32_C, __INT64_C, __INTMAX_C, __UINT8_C, __UINT16_C, __UINT32_C, __UINT64_C и __UINTMAX_C.



Для C++ добавлена поддержка продления времени жизни временных объектов, созданных с помощью агрегатной инициализации, которая использует инициализаторы по умолчанию.

Для C++ добавлены встроенные функции "__builtin_elementwise_popcount", "__builtin_elementwise_fmod", "__builtin_elementwise_minimum" и "__builtin_elementwise_maximum", а также встроенный псевдоним типа "__builtin_common_type" (для повышения производительности std::common_type).


Добавлены возможности, связанные с будущим стандартом C++2с (C++26):
  • Встроенная операция "__builtin_is_virtual_base_of" для проверки является ли базовый класс виртуальным.

    Вариативный оператор "friend" ("friend Ts...").
    Возможность использования ключевого слова "constexpr" с разновидностью оператора "new" (placement new) для размещения объекта в заранее выделенной памяти во время компиляции.

    Добавлена встроенная функция "__builtin_is_within_lifetime", позволяющая проверить активность альтернативы в объединениях (union).

    Объявлен устаревшим синтаксис определения вариативных параметров с многоточием без предшествующей запятой (например, когда указывается "void e(int...)" вместо "void e(int, ...)").
Добавлены возможности, связанные со стандартом C++23:
  • Убрано ограничение на возвращение функциями с признаком "constexpr" только литеральных типов (например, помимо таких типов, как int, float и char, теперь можно работать со структурами).

    Обеспечена полная поддержка продления времени жизни временных объектов в циклах "for", использующих диапазоны.

    Определён макрос "__cpp_explicit_this_parameter" и добавлена встроенная функция "__builtin_is_implicit_lifetime" для поддержки возможности использования типов с неявным временем жизни.

    Добавлена поддержка использования в константных выражениях (constexpr) неизвестных указателей и ссылок, которые не могут быть определены на этапе компиляции.

В режиме C++20 реализован поиск на уровне модулей.


Добавлены новые флаги компилятора:
  • "-fc++-static-destructors={all,thread-local,none}" - определяет, какие переменные C++ имеют статические деструкторы.

    "-fextend-variable-liveness" - сохраняет сведения об исходных переменных для улучшения отладки кода после оптимизации.

    "-Warray-compare" - предупреждение о сравнении массивов в коде C++, не использующем стандарты C++20 и C++23. "-Warray-compare-cxx26" - выводит аналогичное предупреждение при использовании стандартов, начиная с C++26.

    "-fwrapv-pointer" - включает диалект языка, в котором определено поведение при переполнении указателя.

В утилиты clang-cl и clang-dxc добавлена опция "-fdiagnostics-color=[auto|never|always]".


Включена по умолчанию генерация уникальных тегов для анализа псевдонимов (alias) на основе типов для несовместимых указателей (TBAA), позволяющая учитывать информацию о типах для выявления ошибок, возникающих, когда несколько разных указателей ссылаются на одну и ту же память. Для возвращения старого поведения можно использовать опцию "-fno-pointer-tbaa".


Применена более агрессивная оптимизация конструкций, допускающих неопределённое поведение при работе с указателями. Например, проверка "ptr + unsigned_offset < ptr" теперь будет обработана как значение "false", а не преобразована в "(ssize_t)unsigned_offset < 0", так как
"ptr + unsigned_offset" может привести к неопределённому поведению при переполнении размера типа.

Прекращена поддержка целевых платформ RenderScript, le32 и le64. Удалена утилита
clang-rename.

Расширены средства диагностики и статического анализа, добавлены новые проверки.







Основные новшества LLVM 20:
  • Добавлен новый проход IRNormalizer, выполняющий преобразование модулей LLVM в нормальную форму, используя перегруппировку и переименование инструкций, сохраняя при этом семантику. Нормализация упрощает сравнение семантики модулей, после их обработки разными проходами LLVM.

    В число официально поддерживаемых целевых платформ принят бэкенд
    SPIR-V, реализующий возможность генерации переносимого промежуточного представления SPIR-V, совместимого с OpenCL и SYCL, и пригодного для использования при генерации шейдеров Vulkan, GLSL и HLSL. Бэкенд преподносится как альтернатива развиваемого консорциумом Khronos инструментария SPIR-V LLVM Translator.

    В бэкенд для архитектуры RISC-V добавлена поддержка процессоров Hazard3 (-mcpu=rp2350-hazard3), Syntacore SCR4/SCR5/SCR5 (-mcpu=syntacore-scr4/5-rv32/64), Sifive p470 (-mcpu=sifive-p470), TT-Ascalon D8 (-mcpu=tt-ascalon-d8), MIPS P8700 (-mcpu=sifive-p550).

    Добавлена поддержка расширений: Zvbc32e, Zvkgs, Smctr, Ssctr, Svvptc, Smdbltrp, Ssdbltrp, Sdext, Sdtrig, Sha. В разряд стабильных переведена поддержка расширений Zacas, Smmpm, Smnpm, Ssnpm, Supm и Sspm. Стабилизированы профили RVA23U64, RVA23S64, RVB23U64 и RVB23S64. Добавлена экспериментальная поддержка ассемблера для расширений Qualcomm uC Xqcicsr, Xqcisls, Xqcia, Xqciac, Xqcics, Xqcilsm, Xqcicli, Xqcicm, Xqciint, Xqcilo.


    В бэкенд для архитектуры AArch64 добавлена поддержка ассемблера и дизассемблера для архитектурных расширений Armv9.6-A. Добавлена поддержка процессора Fujitsu Monaka.

    В бэкенд AMDGPU добавлена начальная поддержка GPU GFX950. Улучшена реализация операций llvm.memcpy, llvm.memmove и llvm.memset.

    В бэкенд WebAssembly добавлен новый целевой CPU Lime1 (-mcpu=lime1). Добавлена поддержка нового стандартизированного механизма обработки исключений.


    В бэкенд x86 добавлена поддержка CPU Intel Diamond Rapids (-mcpu=diamondrapids) и расширенных инструкций AVX10.2-256, AVX10.2-512, SM4(EVEX), MOVRS, MSR_IMM.


    Улучшены бэкенды для архитектур ARM, LoongArch, MIPS и PowerPC.

    В библиотеке Libc++ продолжена реализация возможностей стандартов C++20, C++23 и C++26.

    В отладчике LLDB реализовано распараллеливание разбора разделяемых библиотек, что привело к ускорению запуска процесса отладки в среднем в два раза. На 30-60% ускорена индексация формата DWARF. Улучшена диагностика вычисления выражений.


    (lldb) p a+b
    ˄ ˄
    │ ╰─ error: use of undeclared identifier 'b'
    ╰─ error: use of undeclared identifier 'a'



    Для сборки LLVM компилятором MSVC теперь требуется как минимум версия Visual Studio 2019 16.8.


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

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

Ответить