The OpenNET Project / Index page

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

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

27.08.2025 18:02

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

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

  • Возможности, связанные с С++:
    • По аналогии с GCC реализована возможность использования константных выражений в ассемблерных вставках, определяемых директивой "asm":
      
          int foo() {
            asm((std::string_view("nop")) ::: (std::string_view("memory")));
          }
      
    • Добавлены расширенные варианты выражений "new" и "delete", поддерживающие аргумент "std::type_identity<T>", через который можно указать информацию о типе объекта, для которого выделяется или освобождается память.
    • Добавлена возможность вычисления на этапе компиляции (в контексте константного выражения) лямбда-функций, захватывающих структурированные привязки (structured binding) .
  • Возможности, связанные с будущим стандартом C++2с (C++26):
    • В структурированные привязки добавлена возможность использования синтаксиса "..." для указания пакетов (pack), захватывающих оставшееся число элементов из присваиваемой последовательности.
      
         auto [x,y,z] = f();       // в переменные  x, y, z будут записаны  три элемента, возвращённые f().
         auto [...xs] = f();       // в пакет xs будут записаны все элементы, возвращённые f().
         auto [x, ...rest] = f();  // В x будет записан первый элемент, а в rest - остальные.
         auto [x, y, ...rest] = f(); // В x будет записан первый элемент, в y - второй, а в rest - третий.
         auto [x, ...rest, z] = f();  // в x - первый, в rest - второй, в z - третий.
      
    • Добавлена поддержка "тривиальной перемещаемости" типов (Trivial Relocatability), позволяющей оптимизировать перемещения объектов заданного типа через их клонирование в памяти без вызова конструкторов или деструкторов. Для классов реализованы свойства memberwise_trivially_relocatable и memberwise_replaceable, а для низкоуровневого перемещения одного или нескольких объектов добавлены функции trivially_relocate_at и trivially_relocate.
    • Появилась возможность применения структурированного связывания (structured binding) в качестве условия в операторах "if" и "switch".
    • Реализована поддержка прикрепления функции main() к глобальному модулю и определения функции main() в именованных модулях.
  • Возможности, развиваемые для будущего стандарта C2y:
    • Устранено неопределённое поведение при использовании выражений с типом void в некоторых контекстах, например, "(void)(void)1;".
    • Разрешено не завершать файл с исходным кодом символом новой строки.
    • Добавлены новые префиксы для восьмеричных литералов - "0o" и "0O", а также восьмеричные и шестнадцатеричные escape-последовательности "\o{...}" и "\x{...}". Поддержка восьмеричных литералов 0xxx объявлена устаревшей. Например, "0o123" и "\o{123}" вместо "0123".
    • Добавлен оператор "_Countof" для определения количества элементов в массиве. Также добавлен заголовочный файл stdcountof.h, определяющий вариант макроса "countof", реализованный через "_Countof".
  • Возможности, определённые в Си-стандарте C23:
    • Разрешено переопределять tag‑типы (struct, union, enum) в пределах одного блока трансляции, если повторные определения структурно эквивалентны (то же число членов, одинаковые типы и имена тегов).
    • Упрощено использование списков с переменным числом аргументов (variadic). Разрешено использовать одиночный вариативный параметр в имени типа.
    • Добавлена совместимая с GCC встроенная функция "__builtin_c23_va_start()", улучшающая поведение диагностики для макроса va_start() в режиме C23.
  • В режиме совместимости с компилятором MSVC разрешено использование спецификатора inline при объявлении типа функции через typedef, например, "typedef int inline Foo(int);"
  • Разрешено использовать квалификатор "restrict" для типов массивов с элементами-указателями.
  • Новые предупреждения компилятора:
    • "-Wdefault-const-init-var" и "-Wdefault-const-init-field" - выявление помеченных признаком const переменных и полей, определённых без явной инициализации.
    • "-Wimplicit-void-ptr-cast" - диагностика неявного преобразования из типа "void*" в другой тип указателя.
    • "-Wc++-keyword" - выявление использования ключевых слов "C++" в качестве идентификаторов в "C".
    • "-Wc++-hidden-decl" - выявление использования типов тегов, видимых в "C", но не видимых в "C++" из-за ограничения области видимости.
      
         struct S {
           struct T {
             int x;
           } t;
         };
         struct T t; // предупреждение, так как корректно в Си, но некорректно в C++
      
    • "-Wimplicit-int-enum-cast" - выявление неявных преобразований в С-коде из целочисленных типов в тип перечислений, несовместимых с "C++".
    • "-Wtentative-definition-compat" - диагностика повторяющихся определений в "C", несовместимых с "C++" (например, "int i;int i;").
    • "-Wunterminated-string-initialization" и "-Wc++-unterminated-string-initialization" - выявление операций инициализации строковых литералов, в которых не вмещается разделитель с нулевым кодом. Для пометки полей и переменных в коде на Си, не требующих финального нулевого символа, добавлен атрибут "nonstring".
      
         char buf1[3] = "foo"; // предупреждение
         char buf2[3] = "fo\0";  // всё Ok.
      
    • "-Wjump-misses-init" - диагностика перехода через goto или switch/case, пропускающего инициализацию локальной переменной.
    • "-Wundef-true" - предупреждает об использовании значения "true" в препроцессоре C без определения.
    • "-Wnrvo" - диагностика пропущенных NRVO (Named Return Value Optimization).
  • Новые флаги компилятора:
    • "-fprofile-continuous" - включение непрерывной синхронизации профиля в файл.
    • "-ftime-report-json" - вывод сведений о времени компиляции в формате JSON.
    • "-ignore-pch" - отключение предкомпилированных заголовков.
    • "-fthinlto-distributor" и "-Xthinlto-distributor" - для применения DTLTO (Integrated Distributed ThinLTO).
    • "-static-libclosure" - для статического связывания runtime расширения Blocks на платформе Windows.
  • Расширены средства диагностики и статического анализа, добавлены новые проверки (более сотни улучшений, связанных с диагностикой).
  • Улучшены бэкенды для архитектур ARM, Aarch64, AMDGPU, x86, RISC-V, LoongArch, MIPS и PowerPC. В бэкенд для RISC-V добавлена экспериментальная поддержка ассемблера для расширений Qualcomm uC, Andes и SiFive.


  1. Главная ссылка к новости (https://discourse.llvm.org/t/l...)
  2. OpenNews: Релиз набора компиляторов LLVM 20
  3. OpenNews: Представлен бэкенд TPDE-LLVM, работающий в 10-20 раз быстрее LLVM в режиме без оптимизации
  4. OpenNews: Опубликованы результаты аудита безопасности кодовой базы LLVM
  5. OpenNews: Проект LLVM меняет схему нумерации версий
  6. OpenNews: Релиз набора компиляторов GCC 15
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/63783-llvm
Ключевые слова: llvm, clang
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (25) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Голдер и Рита (?), 19:06, 27/08/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > (void)(void)1;

    Кто, где и зачем так пишут?🤔😶‍🌫️

     
     
  • 2.3, Аноним (3), 19:41, 27/08/2025 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > Устранено неопределённое поведение при (void)(void)1;

    Кто и зачем так пишут стандарты, что шаг вправо-влево приводит к UB?

     
     
  • 3.8, Аноним (8), 20:16, 27/08/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    >Кто

    Тебе ФИО нужно?
    >зачем

    Ну потому что эти люди живут в реальности, где UB - это проблема программиста. Но с тех пор много воды утекло и мир живет в реальности, где UB - это проблема языка.

     
  • 2.4, Аноним (3), 19:41, 27/08/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Устранено неопределённое поведение при (void)(void)1;

    Кто и зачем так пишут стандарты, что шаг вправо-влево приводит к UB?

     
  • 2.11, A.Stahl (ok), 20:36, 27/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > (void)(void)1;

    А что это значит? Я не могу распарсить это выражение.

     
     
  • 3.16, DasKolbass (?), 20:47, 27/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    В новости же сказано, что компилятор тоже не понимает для чего это, поэтому неопределённое поведение.
     
     
  • 4.27, Аноним (8), 21:24, 27/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Это не так работает. UB - это "слишком сложно, непонятно что делать, нужны доп. сведения". А то что в новости - это "хз че это, Васян, фиг разберешься, давай напишем что UB, фиг кто разберется".
     

  • 1.2, Голдер и Рита (?), 19:09, 27/08/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +4 +/
    А вообще, замечательная новость, мы рады, что C/C++ не стоят на месте. 🥰😘🤗
     
     
  • 2.14, DasKolbass (?), 20:44, 27/08/2025 [^] [^^] [^^^] [ответить]  
  • –5 +/
    Чему радоваться? Вот если бы это в нашей стране делали компиляторы и языки, то можно было порадоваться
     
     
  • 3.38, Аноним (38), 23:52, 27/08/2025 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Так делают, 1С, Глагол, ДРАКОН вот только зачем они нужны остальному миру?
     

  • 1.5, ista011 (?), 19:42, 27/08/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    В Clang 8 внедрили часть стандарта C++ касающуюся модулей. С тех пор уже 13 релизов никак не доделали эту поддержку. Зато бегут реализовывать ещё не одобренный C++26.
     
     
  • 2.10, 12yoexpert (ok), 20:35, 27/08/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    майки модули высрали - пусть сами и реализуют
     
     
  • 3.24, ista011 (?), 21:17, 27/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    У них то в компиляторе как раз таки реализовано на 100%. А фича реально интересная и удобная. Насколько знаю GCC потихоньку идёт чтобы всё доделать, но там очень медленно. Про движение со стороны CLang не в курсе.
     
     
  • 4.28, DasKolbass (?), 21:33, 27/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    А чем интересная и удобная? Наоборот, это противоестесственно для C++, потому что он не является языком модульного программирования. Организация исходного текста в C++ - блочная, и C++ никогда не откажется от этого, а попытка совместить блочную и модульную архитектуру ведёт к усложнению и неразберихе.
     
     
  • 5.30, Аноним (30), 22:30, 27/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Идея в том, чтобы избавиться от сишного наследия, которое уже плохо проявляет себя в крупных проектах. Опять же, время сборки ядра Линукса как пример, и все эти бесконечные header-only библиотеки. Быть может, через двадцать лет люди вовсе не будут знать, что такое хедеры. И это хорошо.
     
     
  • 6.32, Аноним (32), 22:50, 27/08/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Опять же, время сборки ядра Линукса как пример, и все эти бесконечные header-only библиотеки.

    Э... А как же разделы для экспорта. Насколько я понимаю ничто не мешает делать то же самое использую модули. Модули - только сахар не решающие не одну проблему.

     
  • 6.33, Аноним (33), 22:59, 27/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Это типа как в Паскале, да? Уже не первый раз встречаю такую штуку, когда кто то что то хейтит, а потом вдруг оказывается, что он не прав.
     
     
  • 7.34, Аноним (34), 23:40, 27/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    А разве Паскаль за модули хейтят? В первую очередь, за некраткость begin-end'ов.
     
     
  • 8.39, Аноним (39), 00:29, 28/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    И это проблема у сишников, которые пишут пятикаскадные семиэтажные шаблонные шаб... текст свёрнут, показать
     

  • 1.13, DasKolbass (?), 20:40, 27/08/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    "Разрешено не завершать файл с исходным кодом символом новой строки" -

    А что, раньше было такое жёсткое требование? Зачем?

     
     
  • 2.18, _kp (ok), 20:54, 27/08/2025 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Не жесткое требоване, но при опечатках в #inclue файлах можно было долго искать место с ошибкой, причем найти в весьма неожиданном файле.
     
     
  • 3.26, DasKolbass (?), 21:23, 27/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Было бы лучше если бы компилятор после каждого include-включения сам добавлял перевод строки
     
  • 2.29, Аноним (29), 22:29, 27/08/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Вот flex обычно сегфолтится, если в конце файла нет новой строки.
     
     
  • 3.40, Аноним (39), 00:30, 28/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    вся суть сишников в одной фразе :)
     

  • 1.31, Аноним (33), 22:41, 27/08/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Я нуб. Подскажите, куда копать, чтобы сделать код на gcc с extended asm и всякими другими расширениями совместимым с clang? Extended asm поддерживается? Мб есть какой-то заголовочный файл, где расширения gcc типа __attribute__((packed)) объявляются как какие-то константы. Нашел кстати недоработку в extended asm. Было бы прикольно, если бы можно было вставить сегментный регистр переменной в памяти. Полезно, когда у тебя стек не flat и следовательно есть разница, в каком регистре хранится указатель.
     

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



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

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