LINUX.ORG.RU

LLVM 23

 , , , ,

LLVM 23

0

3

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

Начиная с ветки 18.x проект перешёл на новую схему формирования номеров версий, в соответствии с которой нулевой выпуск («N.0») используется в процессе разработки, а первая стабильная версия снабжается номером «N.1». Код проекта распространяется под лицензией Apache 2.0.

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

  • Добавлена поддержка OpenCL C 3.1 (-cl-std=CL3.1).
  • Возможности, связанные с языком С:
    • Реализованы функции циклического битового сдвига stdc_rotate_left_{uc,us,ui,ul,ull} и stdc_rotate_right_{uc,us,ui,ul,ull}, а также функции изменения порядка следования элементов массива в памяти __builtin_stdc_memreverse8, stdc_memreverse8 и stdc_memreverse8u{8,16,32,64}, определённые в заголовочном файле stdbit.h для будущего стандарта C2y.
    • Разрешено обращаться к элементам структур через оператор . внутри константных выражений (constexpr).
    • В функциях форматирования строк, таких как printf и scanf, реализована поддержка появившихся в стандарте C23 модификаторов размера: %wN для типа intN_t, %wfN для типа int_fastN_t, %H для типа _Decimal32, %D для типа _Decimal64 и %DD для типа _Decimal128.
  • Возможности, связанные с С++:
    • Во встроенной функции __is_trivially_equality_comparable реализована поддержка сравнения перечислений (enum).
    • Во всех режимах C++ разрешено использование ключевого слова auto для автоматического вывода типов параметров функций.
    • Добавлены флаги -std=c++2d и -std=gnu++2d для тестирования возможностей, развиваемых для стандарта, который выйдет после C++26.
    • Добавлена поддержка дополнительных именованных универсальных escape-символов.
    • Появившаяся в спецификации C++26 возможность использования структурированных привязок (structured binding) в контексте constexpr и constinit расширена поддержкой кортежеподобных структур (ранее поддерживались массивы и простые структуры).
    • Добавлена частичная поддержка утверждённого в стандарте C++26 оператора «template for» для перебора элементов на этапе компиляции в стиле обычного цикла. При выполнении template for тело цикла раскрывается для каждого элемента и каждая итерация обрабатывается в отдельной области видимости, в которой элемент последовательности, по которой итерируется цикл, является константой для каждой итерации и может участвовать в константных выражениях (constexpr). В контексте рефлексии template for может применяться для обхода свойств классов или перечислений.
    • Частично реализовано декорирование имён (Itanium mangling, создание уникальных имён символов для компоновщика), используемых для доступа к элементам пакета параметров по индексу.
    • Добавлена поддержка предложенного в стандарте C++20 синтаксиса для более эффективного определения зависимостей между модулями.
    • Арифметические операции с указателями после приведения производных и базовых типов теперь определяются как неопределённое поведение, что позволяет применять оптимизацию на основе девиртуализации вызовов.
    • Разрешено явно специализировать или создавать экземпляры operator() для generic-лямбд.
    • В операторах преобразования типов разрешено не указывать ключевое слово typename перед именем шаблона.
    • Разрешено объявлять специализации членов класса в области видимости класса.
    • В структурированных привязках (structured binding) для инициализаторов, возвращающих временные значения (prvalue), задействованы не ссылочные типы.
  • Добавлены встроенные функции __builtin_stdc_rotate_left, __builtin_stdc_rotate_right, __builtin_bitreverseg, __builtin_elementwise_clmul, __builtin_elementwise_pext, __builtin_elementwise_pdep, __builtin_stdc_leading_zeros, __builtin_stdc_leading_ones, __builtin_stdc_trailing_zeros, __builtin_stdc_trailing_ones, __builtin_stdc_first_leading_zero, __builtin_stdc_first_leading_one, __builtin_stdc_first_trailing_zero, __builtin_stdc_first_trailing_one, __builtin_stdc_count_zeros, __builtin_stdc_count_ones, __builtin_stdc_has_single_bit, __builtin_stdc_bit_width, __builtin_stdc_bit_floor, __builtin_stdc_bit_ceil.
  • Добавлены функции stdbit.h, применимые в константных выражениях (constexpr):
    • stdc_leading_zeros_{uc,us,ui,ul,ull}, stdc_leading_ones_{uc,us,ui,ul,ull},
    • stdc_trailing_zeros_{uc,us,ui,ul,ull}, stdc_trailing_ones_{uc,us,ui,ul,ull},
    • stdc_first_leading_zero_{uc,us,ui,ul,ull}, stdc_first_leading_one_{uc,us,ui,ul,ull}, stdc_first_trailing_zero_{uc,us,ui,ul,ull}, stdc_first_trailing_one_{uc,us,ui,ul,ull},
    • stdc_count_zeros_{uc,us,ui,ul,ull}, stdc_count_ones_{uc,us,ui,ul,ull},
    • stdc_has_single_bit\_{uc,us,ui,ul,ull},
    • stdc_bit_width_{uc,us,ui,ul,ull}, stdc_bit_floor_{uc,us,ui,ul,ull}, stdc_bit_ceil_{uc,us,ui,ul,ull}.
  • В большинство встроенных функций __atomic_ добавлена поддержка значений с плавающей запятой и указателей.
  • Добавлен заголовочный файл endian.h, включающий POSIX-функции для манипуляции порядком следования байт.
  • Поддерживаемая версия Unicode обновлена с 15.1 до 18.0.
  • В инструментарий для Linux и Windows добавлена поддержка механизма multilib, включаемого через флаг -fmultilib-flag и позволяющего использовать отдельные версии библиотек и заголовочных файлов для разных архитектур.
  • Добавлены новые флаги компилятора:
    • -fms-anonymous-structs / -fno-ms-anonymous-structs — включение/выключение поддержки расширений Microsoft для анонимных структур.
    • --precompile-reduced-bmi — генерация сокращённого BMI (Binary Module Interface) для импортируемого модуля.
    • -fdiagnostics-show-inlining-chain — показ информации об inline-развёртывании при диагностике при помощи атрибутов [[gnu::warning]] и [[gnu::error]].
    • -fcrash-diagnostics-tar — создание tar-архива с файлами для воспроизведения аварийного завершения для упрощения диагностики сбоев в компиляторе.
    • -fwin-cfg-mechanis — выбор режима защиты CFG (Control Flow Guard) для платформы Windows (automatic, dispatch и check).
    • -fstrict-bool — обработка загружаемых из памяти однобайтовых булевых значений только как 0 и 1.
  • Добавлены атрибуты:
    • stack_protector_ignore — выборочное отключение проверки безопасности локальных переменных внутри функции.
    • [[clang::no\_outline]] — запрещает оптимизатору разделать код помеченной функции.
    • __attribute__((overflow_behavior)) — определяет поведение (wrap или trap) при переполнении чисел разных типов.
    • __attribute__((__personality__(...))) — назначение функции для раскрутки стека при возникновении исключений.
  • Расширены средства диагностики и статического анализа, добавлены новые проверки (несколько десятков улучшений, связанных с диагностикой).
  • В бэкенд для архитектуры X86 добавлена поддержка процессоров AMD на базе микроархитектуры Zen 6 (-march=znver6). Добавлена поддержка расширения набора команд AVX512BMM и реализованы встроенные функции на его основе.
  • В бэкенд для архитектуры AArch64 добавлена поддержка процессоров Arm AGI CPU (armagicpu), Hisilicon hip12 (hip12) и NVIDIA Rigel (rigel).
  • В бэкенде AMDGPU реализована начальная поддержка GPU GFX1310 на базе архитектуры RDNA 5. Добавлены встроенные функции __builtin_amdgcn_processor_is и __builtin_amdgcn_is_invocable.
  • Улучшены бэкенды для архитектур ARM, RISC-V, LoongArch64, MIPS, SystemZ, WebAssembly и PowerPC.
  • В компоновщике LLD реализовано распараллеливание загрузки входных файлов и маркировки секций для сокращения времени связывания крупных проектов.

>>> Источник: OpenNET

★★★★★

Проверено: cetjs2 ()

эта штука и в эмбдид пытается просочиться, правда на костылях, я так понял, ибо ему gcc таки нужен там…

Код проекта распространяется под лицензией Apache 2.0.

Это ↑ вообще там не нужно…

Sm0ke85
()
Последнее исправление: Sm0ke85 (всего исправлений: 2)

в OpenMP появился offload для Intel - llvm-runtimes/openmp-spirv64-intel

Sylvia ★★★★★
()

В инструментарий для Linux и Windows добавлена поддержка механизма multilib, включаемого через флаг -fmultilib-flag и позволяющего использовать отдельные версии библиотек и заголовочных файлов для разных архитектур.

Мне кажется, что как-то поздно они это добавили. Но, хорошо, что всë же добавили.

PunkPerson ★★
()
Ответ на: комментарий от Beewek

Ну так вот мне и не понятны эти тенденции… Смысла особого не вижу подвязываться на то, что завтра может начать денег стоить…

Sm0ke85
()
Ответ на: комментарий от Sm0ke85

Смысла особого не вижу подвязываться на то, что завтра может начать денег стоить…

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

Loki13 ★★★★★
()
Ответ на: комментарий от Loki13

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

А если к тому времени форкать ее будет бесполезно, например, ввиду того, что ее каким-то образом завяжут на аутентификацию и подтяжку каких-то ресурсов со стороннего сервиса, а также на использование разномастных проприетарных блобов?

ЗЫ напомню, что уже сегодня для сборки линукса нужен раст

Sm0ke85
()
Последнее исправление: Sm0ke85 (всего исправлений: 1)
Ответ на: комментарий от Sm0ke85

ЗЫ напомню, что уже сегодня для сборки линукса нужен раст

И как можем видеть, ничем GPL не помог. Внесут, например, crates.io в блокировки или в санкционные списки, и не сможешь и ядро собрать, хоть оно и GPL.

Я это к тому, что лицензия тут очень второстепенна. Так-то и лицензию могут поменять в будущем, что не раз уже случалось.

Loki13 ★★★★★
()
Ответ на: комментарий от Loki13

И как можем видеть, ничем GPL не помог.

Не соглашусь, т.к. гпл вынудил «переписывать», и если вдруг момент «все пропало» наступит, то шанс «восстановить до актуального состояния» вполне остается. Мало того, мне все таки кажется, что не за горами момент, когда таки кто-то запустит ветку ядра «без раста» («убей (фигурально) торвальдса - стань новым торвальдсом»)…

Sm0ke85
()
Ответ на: комментарий от Sm0ke85

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

Loki13 ★★★★★
()
Ответ на: комментарий от Loki13

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

Ну и гну/линукс когда-то прозябал, но выкарабкался. Здесь вопрос принципиальный и острый, т.к. раст не имеет по сути, как я понимаю, фиксированного стандарта (чтоб хоть пару лет не менялся), а соответственно, не появится гпл-версия компилятора (т.к. у тебя каждый день «винегрет» разный)… Я ж когда ругаюсь на ржавого - всегда делаю упор именно на лицензию и централизацию, а так по-барабану на сам язык, ибо «очередной убийца С/С++»)))

Sm0ke85
()

Не пишу на плюсцах уже года 4 и даже после прочтения новостей не до конца понимаю что в том мирке происходит.

Тешу себя надеждой, что может это всё-таки лыжи не такие…

water_closed
()

Added -Wlifetime-safety to enable lifetime safety analysis, a CFG-based intra-procedural analysis that detects use-after-free and related temporal safety bugs. See the RFC for more details. By design, this warning is enabled in -Weverything. To disable the analysis, use -Wno-lifetime-safety or -fno-lifetime-safety.

И что, оно теперь на это ругается или нет?

std::vector vec;
vec.push_back(1);
int& v = vec[0];
for (int i=0; i<100; ++i)
v.push_back(i);
std::cout << v;
dynamic_cast
()
Последнее исправление: dynamic_cast (всего исправлений: 1)
Ответ на: комментарий от dynamic_cast

При компиляции программы

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec;
    vec.push_back(1);
    int& v = vec[0];
    for (int i=0; i<100; ++i) {
        vec.push_back(i);
    }
    std::cout << v;

    return 0;
}

командой

clang++-23 -c --std=c++23 -Weverything lt.cxx

компилятор показывает предупреждение

lt.cxx:7:14: warning: local variable 'vec' is later invalidated [-Wlifetime-safety-invalidation]
    7 |     int& v = vec[0];
      |              ^~~
lt.cxx:9:13: note: local variable 'vec' is invalidated here
    9 |         vec.push_back(i);
      |         ~~~~^~~~~~~~~~~~
lt.cxx:11:18: note: later used here
   11 |     std::cout << v;
      |                  ^
1 warning generated.
No ★★★
()

Добавлены флаги -std=c++2d и -std=gnu++2d для тестирования возможностей, развиваемых для стандарта, который выйдет после C++26.

Ещё бы clang-p2996 наконец-то приняли.
А то отстают от GCC 16 с C++26-рефлексией. :)

dataman ★★★★★
() автор топика
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.