The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

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

02.03.2026 12:15 (MSK)

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

Среди улучшений в Clang 22:

  • Добавлена поддержка токенов выделения памяти (Allocation Token) для маркировки уникальным идентификатором операций выделения памяти, осуществляемых при помощи таких функций, как malloc. Идентификаторы дают возможность структурировать информацию в куче (heap), упростить выявление утечек в памяти и реализовать группировку объектов на основе назначения или характера изменений (например, разделять "горячие" или "холодные" данные). Для включения следует использовать флаг "-fsanitize=alloc-token".
  • Возможности, связанные с языком С:
    • Реализован черновик спецификации, определяющей механизм отложенного выполнения "defer", дающий возможность выполнить действия в момент выхода из текущей области видимости. Для включения поддержи "defer" добавлен флаг "-fdefer-ts".
    • Добавлена встроенная функция __builtin_stack_address(), повторяющая аналогичную функцию в GCC. Функция возвращает адрес в стеке, разделяющий область стека текущей функции, вызвавшей __builtin_stack_address(), и в последующем вызываемыми функциями.
  • Возможности, развиваемые для будущего стандарта C2y:
    • Добавлена поддержка именованных циклов, позволяющих присваивать имена циклам и оператору switch, которые можно указывать в операторах break и continue для явного определения цикла, из которого производится выход.
      
         outer:
         for (int i = 0; i < IK; ++ i) {
           for (int j = 0; j < JK; ++ j) {
              continue;       // переход к CONT1
              continue outer; // переход к CONT2
              // CONT1
           }
           // CONT2
         }
      
    • Расширена и включена в стандарт реализация встроенного макроса "__COUNTER__", предназначенного для генерации уникальных имён идентификаторов. Выставлен лимит в 2147483647 вызовов данного макроса, после превышения которого будет выведена ошибка.
    • Убран вывод предупреждения (-Wstatic-in-inline) при использовании статических функций или переменных внутри функций, объявленных как "extern inline".
  • Возможности, определённые в Си-стандарте C23:
    • В заголовочный файл float.h добавлена поддержка макросов FLT_SNAN, DBL_SNAN и LDBL_SNAN, реализующих сигнальные (вызывающие исключение при использовании в арифметических операциях) значения NaN для типов float, double и long double.
    • Исправлена ошибка, из-за которой разные неименованные типы обрабатывались как совместимые в пределах одной единицы трансляции, если у них совпадали поля.
    • Флаг "-MG", используемый для игнорирования отсутствия заголовочных файлов при сканировании зависимостей, распространён на директивы "#embed" и теперь подавляет вывод ошибки "file not found" при отсутствии файла, указанного в директиве "#embed".
  • Возможности, связанные с С++:
    • Добавлена развиваемая в спецификации C++2с (C++26) возможность использования структурированных привязок (structured binding) в контексте "constexpr", т.е. ссылки на константные выражения теперь сами могут быть константными выражениями. Поддержка реализована для массивов и простых структур (кортежи пока не поддерживаются).
      
         constexpr int arr[] = {1, 2};
         constexpr auto [x, y] = arr; 
      
    • В соответствии с требованием стандарта C++20 обеспечено преобразование ограничений (constraints) в стандартную форму перед проверкой их выполнения, что позволяет выдавать более точные диагностические сообщения и правильно обрабатывать ошибки подстановки в аргументах шаблона, используемых только в concept-ids.
    • Добавлено семейство встроенных функций "__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship", позволяющих узнать, были ли операторы сравнения "<", ">", "<=" и ">=" синтезированы из оператора "<=>".
    • Параметр "-Wincompatible-pointer-types" переведён на вывод ошибки вместо предупреждения. Для возвращения старого поведения следует использовать опцию "-Wno-error=incompatible-pointer-types".
  • Добавлены встроенные функции __builtin_bswapg, __builtin_elementwise_ldexp, __builtin_elementwise_fshl, __builtin_elementwise_fshr, __builtin_elementwise_minnumnum, __builtin_elementwise_maxnumnum, __builtin_masked_load, __builtin_masked_expand_load, __builtin_masked_store, __builtin_masked_compress_store, __builtin_masked_gather, __builtin_masked_scatter и __builtin_dedup_pack. Например, builtin_dedup_pack позволяет удалить дубликаты из списка типов:
    
       using MyTypeList = TypeList<__builtin_dedup_pack<int, double, int, char, double>...>;
       // результирующий тип будет TypeList<int, double, char>
    
  • При отладке неопределённого поведения через UBSan (-fsanitize=undefined -fsanitize-trap=undefined) обеспечено добавление в генерируемую отладочную информацию сведений о причинах ошибок. Для задания уровня детализации информации об ошибках добавлен флаг "-fsanitize-debug-trap-reasons", который может принимать значение "basic" для общих описаний (например, "Integer addition overflowed") и "detailed" для включения развёрнутой информации (например, "signed integer addition overflow in 'a + b'").
  • Добавлены новые флаги компилятора:
    • "-f[no-]sanitize-debug-trap-reasons" для управления встраиванием причин возникновения исключений (trap) в отладочную информацию при компиляции в режиме "-fsanitize-trap".
    • "-fsanitize=alloc-token", "-falloc-token-max", "-fsanitize-alloc-token-fast-abi" и "-fsanitize-alloc-token-extended" для управления токенами выделения памяти.
    • "-fmatrix-memory-layout" для управления размещением в памяти матричных типов (например, column-major - по столбцам, row-major - по строкам).
  • Для функций реализован атрибут "malloc_span", похожий на атрибут malloc, но применяемый к функциям, возвращающим span-подобные структуры, содержащие указатель и поле с размером или указателем на конец блока.
  • Добавлен атрибут "modular_format" для динамического выбора необходимой статически связываемой реализации функции printf во время компоновки.
  • Расширены средства диагностики и статического анализа, добавлены новые проверки (несколько десятков улучшений, связанных с диагностикой).
  • В бэкенд для архитектуры X86 добавлены дополнительные встроенные функции (Intrinsics) для расширений SSE, AVX и AVX512. Добавлены режимы сборки для CPU Intel на базе микроархитектур Wildcat Lake (-march=wildcatlake) и Nova Lake (-march=novalake).
  • В бэкенд для архитектуры AArch64 добавлена поддержка процессоров Ampere Computing Ampere1C (ampere1c), Arm C1-Nano (c1-nano), Arm C1-Pro (c1-pro), Arm C1-Premium (c1-premium) и Arm C1-Ultra (c1-ultra). Добавлены дополнительные встроенные функции для инструкций FCVTZ[US], FCVTN[US], FCVTM[US], FCVTP[US], FCVTA[US]. Стабилизирована поддержка FMV (Function Multi-Versioning). Пользователям предоставлена возможность переопределения приоритета различных версий функций.
  • Добавлена поддержка архитектуры LoongArch32 (LA32R, LA32S).
  • Улучшены бэкенды для архитектур ARM, AMDGPU, RISC-V, LoongArch64, MIPS, WebAssembly и PowerPC.


  1. Главная ссылка к новости (https://discourse.llvm.org/t/l...)
  2. OpenNews: LLVM ввёл правила применения AI-инструментов. Curl и Node.js ограничат выплаты за уязвимости из-за AI
  3. OpenNews: Релиз набора компиляторов LLVM 21
  4. OpenNews: В Clang намерены добавить режим усиленной безопасности
  5. OpenNews: На базе Clang для языка Си реализован режим проверки границ буферов
  6. OpenNews: Релиз набора компиляторов GCC 15
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/64898-llvm
Ключевые слова: llvm, clang
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (41) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.4, Карлос Сношайтилис (ok), 12:27, 02/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > Возможности, связанные с языком С: Реализован черновик спецификации, определяющей механизм отложенного выполнения "defer"

    Если вы не идёте к RAII, RAII идёт к вам

     
     
  • 2.34, Аноним (34), 14:42, 02/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Давно пора. Только вот зачем они сделали эту фичу как control block, а не как декларацию с полноценными лямбда-функциями, мне не понятно. Так придётся колхозить замыкания, если надо захватывать значения переменных на этапе defer, что часто бывает нужно. И теперь даже если потом добавят лямбды, с текущим defer они не совместимы. В общем, подложили лишние грабли и себе, и C++.
     
     
  • 3.48, Сладкая булочка (?), 15:36, 02/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    > Давно пора.

    Давно уже есть в gcc и используется (например, в коде systemd). Надо просто стандартизовать.

     
  • 2.47, Сладкая булочка (?), 15:35, 02/03/2026 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Если вы не идёте к RAII, RAII идёт к вам

    Только defer - это не RAII.

     

  • 1.5, Аноним (5), 12:35, 02/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • –5 +/
    Какой ещё ARM? Только ASML, только x64!
     
     
  • 2.11, Аноним (11), 13:15, 02/03/2026 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Чего ?
    ARM это архитектура, а ASML делают литографы, которые потом покупает например TSMC и производит процессоры для Qualcomm или Apple.
    p.s.:
    - https://cdn.videocardz.com/1/2026/02/QUALCOMM-SNAPDRAGON-X2-ELITE-TEST-5.jpg
    - https://cdn.videocardz.com/1/2026/02/QUALCOMM-SNAPDRAGON-X2-ELITE-TEST-1.jpg
     

  • 1.6, Аноним (6), 12:46, 02/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Как ставить-то?
     
     
  • 2.9, dannyD (?), 13:12, 02/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    В генту уже доступен.
     
     
  • 3.29, злой_ой (?), 14:22, 02/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    как всегда машина времени:

    $ cat /usr/ports/devel/llvm22/Makefile | grep ^DISTVERSION
    DISTVERSION= 22.1.0
    $ ls -la /usr/ports/devel/llvm22/Makefile
    -rw-r--r--  1 root wheel 25902 26 Feb 21:47 /usr/ports/devel/llvm22/Makefile
    $ ls -la /usr/ports/devel/llvm22/distinfo
    -rw-r--r--  1 root wheel 180 26 Feb 21:47 /usr/ports/devel/llvm22/distinfo

     
     
  • 4.40, Аноним (40), 15:02, 02/03/2026 Скрыто ботом-модератором     [к модератору]
  • +/
     
  • 4.42, Аноним (42), 15:08, 02/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Ты портопомойку сравниваешь с main tree. Не надо так.
     
  • 2.24, Аноним (42), 14:08, 02/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Не спеши, может, компиляцию хрома опять сломали. Раст, опять же, к осени ждать только.
     

  • 1.7, Аноним (7), 12:57, 02/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • –4 +/
    >поддержка именованных циклов

    у раста подсмотрели)
    https://doc.rust-lang.org/std/keyword.break.html

     
     
  • 2.10, Аноним (10), 13:13, 02/03/2026 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Технологии языков прошлого века, когда родителей раста ещё не было в планах.
     
     
  • 3.15, нах.. (?), 13:43, 02/03/2026 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Но подсмотрели то у Раста)
     
     
  • 4.27, Аноним (34), 14:20, 02/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    На самом деле, эти идеи далеко не новы и обсуждались задолго до Раста. И у конкретно этого решения с метками есть свои минусы и противники, как и у альтернатив. Поэтому долго не стандартизировали. Видимо, просто плюнули и решили, что что-то - лучше, чем ничего.
     
  • 4.30, злой_ой (?), 14:27, 02/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    подсмотрели метки? у раста?

    man perlsyn
    /LABEL

    уже и не вспомнить, с каких пор там оно.

     
  • 4.38, Vindex (?), 15:00, 02/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Эта фишка была в D ещё задолго до появления Rust
     

  • 1.8, Аноним (-), 12:58, 02/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    > Добавлена поддержка именованных циклов, позволяющих присваивать имена циклам и оператору switch, которые можно указывать в операторах break и continue для явного определения цикла, из которого производится выход.

    Что только не придумают, лишь бы goto не использовать.

     
  • 1.12, Сусанин (?), 13:28, 02/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > Добавлена поддержка именованных циклов, позволяющих присваивать имена циклам...

    Наконец-то сподобились перетащить это из Perl, в котором это уже десятки лет есть ровно с таким же синтаксисом.

     
     
  • 2.16, windowlicker (?), 13:44, 02/03/2026 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Из Раста же
     
     
  • 3.18, Аноним (18), 13:59, 02/03/2026 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Из чего? Это которые в разноцветных шапочках и из ямайки? Они тут причем?
     
  • 3.22, Аноним (22), 14:06, 02/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Из Фортрана же
     
  • 2.21, Аноним (21), 14:02, 02/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    GOTO ещё не перетащили?
     
     
  • 3.25, Аноним (-), 14:10, 02/03/2026 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > GOTO ещё не перетащили?

    Пф. зачем перетаскивать технологию устаревщую на десятилетия?
    Это же пример убогого овнокода дидов.


     
     
  • 4.39, Аноним (34), 15:00, 02/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Эта "устаревшая" технология с успехом решает все задачи на неё возложенные. И кстати, в конкретно этом случае с именованными циклами, польза последних по сравнению с имеющимся goto довольно сомнительна. Наверно, сделали для альтернативно одаренных с фобией goto.
     

  • 1.14, Аноним (14), 13:40, 02/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Заголовок "Релиз набора компиляторов LLVM 22"
    Портянка "Среди улучшений в Clang 22"

    Так а в LLVM что-то изменили?

     
     
  • 2.17, Аноним (17), 13:45, 02/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Во-первых, clang - часть llvm, поэтому то что изменили в clang то изменили в llvm. Во-вторых, читай новость целиком.
     

  • 1.20, Аноним (20), 14:00, 02/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    привет, goto, давно не виделись
     
  • 1.23, Аноним (23), 14:08, 02/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Это ж любимая С++ная программа всех любителей раста.
     
  • 1.26, Аноним (26), 14:10, 02/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > операторы сравнения "<", ">", "<=" и ">=" синтезированы из оператора "<=>"

    а это вообще что? как? куда? а главное — зачем?

     
     
  • 2.31, Аноним (34), 14:31, 02/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Это позволяет определить, сгенерирован ли оператор компилятором на основе operator<=> (фича C++20) или определён пользователем.

    https://godbolt.org/z/YcG1jTv8Y

    "Зачем" - не знаю, но видимо есть какие-то случаи, когда это может пригодиться.

     

  • 1.33, Аноним (33), 14:38, 02/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    обязательно было вот это Г делать явным?

    outer:
       for (int i = 0; i < IK; ++ i) {
         for (int j = 0; j < JK; ++ j) {
            continue;       // переход к CONT1
            continue outer; // переход к CONT2
            // CONT1
         }
         // CONT2
       }

    В пхп давно оно неявное, достаточно указать номер уровня вложенности continue 2;

     
     
  • 2.35, Аноним (34), 14:46, 02/03/2026 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Ну да, а потом иди считай, куда твой break или continue на самом деле переходит. Заняться нечем?

    С метками тоже переходит не туда, где метка (и это косяк этого решения), но по крайней мере визуально видно о каком цикле речь. К тому же, метку можно назвать как угодно.

     
     
  • 3.41, Аноним (33), 15:06, 02/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    > Заняться нечем?

    заняться не чем именно тем, кто мешает понятие меток с уровнем вложенности блочных операторов.

    > Ну да, а потом иди считай, куда твой break или continue на самом деле переходит.

    А что, ты не должен после добавления нового уровня вложенности пересмотреть все свои условия для break и continue операторов? Или навалял и забыл? И ни на что не должно влиять ваше добавление? Добавил один уровень, ну вот какое значение стоит перед твоим continue, так к нему добавь +1, в чем проблема подсчета? А лучше бы пример привел бы, когда необходим именно именованный блок при добавления нового уровня вложенности.

    > С метками тоже переходит не туда, где метка (и это косяк этого решения), но по крайней мере визуально видно о каком цикле речь.

    всегда за всякими

        } // тут конец цикла
      } // вот тут конец условия а
    } // ставили коментари

    так же и с break и continue можно, не вижу проблемы.

    continue 3; // for i
    continue 2; // for j
    continue 1; // for k

    > К тому же, метку можно назвать как угодно.

    если существует механизм меток и оператор безусловного перехода, тогда оператор цикла является избыточным.

     
  • 2.36, Аноним (36), 14:49, 02/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Явное лучше неявного. Полностью одобряю подход авторов.
     
     
  • 3.43, Аноним (33), 15:10, 02/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    > Явное лучше неявного.

    Согласен, а зачем тогда избыточность в виде оператора цикла, кода есть механизм меток и оператор безусловного перехода. Явное лучше, но почему-то "компилятор умнее". Умному компилятору явно указывать уровень вложенности нет необходимости. Сделали для людей это? Не смешите мои тапочки - Си сделан для людей :))))

     

  • 1.37, Аноним (37), 14:58, 02/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    50+ лет фанаты сишечки рассказывать что "ненужОн ваш RAII!" и без defer обойдемся!
    А тут хоба - в драфт стандарта принял))
     
     
  • 2.44, Аноним (42), 15:10, 02/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Ну это не RAII всё же. Его запретили везде не просто так.
     
     
  • 3.45, 12yoexpert (ok), 15:22, 02/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    о, у вас уже и RAII запретили
     
  • 2.46, 12yoexpert (ok), 15:24, 02/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    RAII это corruption, как раст, превращает straightforward обработку ошибок в какой-то бесполезный ад из костылей
    но гуманитариям после курсов или совкового универа этого не понять, их удел - макдональдс или аутсорс
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2026 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру