Po sześciu miesiącach prac rozwojowych wydano LLVM 22.1.0. Opracowuje ona narzędzia (kompilatory, optymalizatory i generatory kodu), które kompilują programy do pośredniego kodu bitowego instrukcji wirtualnych typu RISC (maszyny wirtualne niskiego poziomu z wielopoziomowym systemem optymalizacji). Wygenerowany pseudokod może zostać przekonwertowany na kod maszynowy dla danej platformy docelowej lub wykorzystany przez kompilator just-in-time (JIT) do generowania instrukcji maszynowych bezpośrednio w trakcie wykonywania programu. W oparciu o technologie LLVM, projekt rozwija kompilator Clang, obsługujący języki programowania C, C++ i Objective-C. Począwszy od gałęzi 18.x, projekt przeszedł na nowy schemat numeracji wersji, zgodnie z którym podczas rozwoju używane jest wydanie 0 („N.0”), a pierwsza stabilna wersja ma numer „N.1”.
Ulepszenia w Clang 22 obejmują:
- Dodano obsługę tokenów alokacji pamięci (Allocation Tokens) do oznaczania operacji alokacji pamięci wykonywanych za pomocą funkcji takich jak malloc unikalnym identyfikatorem. Tokeny alokacji umożliwiają strukturyzację informacji o stercie, uproszczenie wykrywania wycieków pamięci oraz umożliwienie grupowania obiektów na podstawie ich przeznaczenia lub wzorców modyfikacji (np. oddzielenie danych „gorących” od „zimnych”). Aby włączyć, należy użyć flagi „-fsanitize=alloc-token”.
- Cechy związane z językiem C:
- Zaimplementowano projekt specyfikacji definiujący mechanizm odroczonego wykonywania „defer”, umożliwiający wykonywanie akcji po wyjściu z bieżącego zakresu. Dodano flagę „-fdefer-ts”, aby włączyć obsługę „defer”.
- Dodano wbudowaną funkcję __builtin_stack_address(), która jest odpowiednikiem podobnej funkcji w GCC. Funkcja ta zwraca adres stosu oddzielający obszar stosu bieżącej funkcji, która wywołała __builtin_stack_address(), od kolejnych funkcji, które ona wywołuje.
- Możliwości rozwijane na potrzeby przyszłego standardu C2y:
- Dodano obsługę pętli nazwanych, co pozwala na przypisywanie nazw pętlom i poleceniom switch, które można określić w poleceniach break i continue, aby jawnie zdefiniować pętlę, z której ma nastąpić wyjście. external: for (int i = 0; i < IK; ++ i) { for (int j = 0; j < JK; ++ j) { continue; // przejdź do CONT1 continue external; // przejdź do CONT2 // CONT1 } // CONT2 }
- Implementacja wbudowanego makra „__COUNTER__”, służącego do generowania unikalnych nazw identyfikatorów, została rozszerzona i uwzględniona w standardzie. Ustawiono limit 2147483647 wywołań tego makra; przekroczenie tego limitu spowoduje błąd.
- Usunięto ostrzeżenie (-Wstatic-in-inline) pojawiające się przy używaniu funkcji statycznych lub zmiennych wewnątrz funkcji zadeklarowanych jako „extern inline”.
- Możliwości zdefiniowane w standardzie C23 C:
- Plik nagłówkowy float.h obsługuje teraz makra FLT_SNAN, DBL_SNAN i LDBL_SNAN, które implementują sygnalizowane (powodujące wyjątek w przypadku użycia w operacjach arytmetycznych) wartości NaN dla typów float, double i long double.
- Naprawiono błąd, w wyniku którego różne nienazwane typy były traktowane jako kompatybilne w ramach tej samej jednostki tłumaczeniowej, jeśli miały te same pola.
- Flaga „-MG” służąca do ignorowania brakujących plików nagłówkowych podczas skanowania zależności została rozszerzona o dyrektywy „#embed” i teraz pomija błąd „plik nie został znaleziony”, gdy brakuje pliku określonego w dyrektywie „#embed”.
- Funkcje związane z C++:
- Dodano możliwość korzystania z powiązań strukturalnych w kontekście „constexpr”, zgodnie ze specyfikacją C++2c (C++26). Oznacza to, że odwołania do wyrażeń stałych mogą teraz same być wyrażeniami stałymi. Zaimplementowano obsługę tablic i prostych struktur (krotki nie są jeszcze obsługiwane). constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
- Zgodnie z wymogami standardu C++20 ograniczenia są teraz konwertowane do standardowej formy przed sprawdzeniem, co pozwala na dokładniejsze komunikaty diagnostyczne i właściwą obsługę błędów podstawień w argumentach szablonu używanych wyłącznie w identyfikatorach koncepcji.
- Dodano rodzinę wbudowanych funkcji „__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship”, aby dowiedzieć się, czy operatory porównania „<”, „>”, „<=" i „>=" zostały zsyntetyzowane z operatora „<=>”.
- Parametr „-Wincompatible-pointer-types” został zmieniony tak, aby zamiast ostrzeżenia wyświetlał błąd. Aby przywrócić poprzednie zachowanie, należy użyć opcji „-Wno-error=incompatible-pointer-types”.
- Dodano wbudowane funkcje __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 i __builtin_dedup_pack. Na przykład, builtin_dedup_pack pozwala usunąć duplikaty z listy typów: używając MyTypeList = TypeList<__builtin_dedup_pack …>; // wynikowym typem będzie TypeList
- Podczas debugowania niezdefiniowanego zachowania za pomocą UBSan (-fsanitize=undefined -fsanitize-trap=undefined), informacje o przyczynie błędu są teraz uwzględniane w generowanych informacjach debugowania. Dodano flagę „-fsanitize-debug-trap-reasons”, aby określić poziom szczegółowości informacji o błędzie. Można ją ustawić na „podstawowy” w przypadku opisów ogólnych (np. „Przepełnienie w dodawaniu liczb całkowitych”) i „szczegółowy”, aby uwzględnić szczegółowe informacje (np. „Przepełnienie w dodawaniu liczb całkowitych ze znakiem w 'a + b'”).
- Dodano nowe flagi kompilatora:
- „-f[no-]sanitize-debug-trap-reasons” kontroluje, czy powody pułapek wyjątków są osadzane w informacjach debugowania podczas kompilacji w trybie „-fsanitize-trap”.
- „-fsanitize=alloc-token”, „-falloc-token-max”, „-fsanitize-alloc-token-fast-abi” i „-fsanitize-alloc-token-extended” służą do zarządzania tokenami alokacji pamięci.
- „-fmatrix-memory-layout” służy do kontrolowania układu pamięci typów macierzy (np. column-major dla typu column-major, row-major dla typu row-major).
- Funkcje mają teraz atrybut „malloc_span”, podobny do atrybutu malloc, ale dotyczący funkcji zwracających struktury typu span zawierające wskaźnik i pole z rozmiarem lub wskaźnik do końca bloku.
- Dodano atrybut „modular_format”, aby dynamicznie wybierać wymaganą statycznie powiązaną implementację funkcji printf w momencie łączenia.
- Rozbudowano narzędzia diagnostyczne i analizy statycznej, dodano nowe sprawdzenia (kilkadziesiąt usprawnień związanych z diagnostyką).
- Do zaplecza x86 dodano dodatkowe funkcje wewnętrzne dla rozszerzeń SSE, AVX i AVX512. Dodano tryby kompilacji dla procesorów Intel opartych na mikroarchitekturach Wildcat Lake (-march=wildcatlake) i Nova Lake (-march=novalake).
- Backend AArch64 obsługuje teraz procesory Ampere Computing Ampere1C (ampere1c), Arm C1-Nano (c1-nano), Arm C1-Pro (c1-pro), Arm C1-Premium (c1-premium) i Arm C1-Ultra (c1-ultra). Dodano dodatkowe wbudowane funkcje dla instrukcji FCVTZ[US], FCVTN[US], FCVTM[US], FCVTP[US] i FCVTA[US]. Ustabilizowano obsługę funkcji Multi-Versioning (FMV). Użytkownicy mogą teraz nadpisywać priorytety różnych wersji funkcji.
- Dodano obsługę architektury LoongArch32 (LA32R, LA32S).
- Udoskonalone zaplecze dla architektur ARM, AMDGPU, RISC-V, LoongArch64, MIPS, WebAssembly i PowerPC.
Źródło: opennet.ru
