Po nieco ponad sześciu miesiącach rozwoju, uruchomienie nowa wersja projektu LLVM 16.0, wersja, w której zaimplementowano dużą liczbę zmian i ulepszeń.
Dla osób niezaznajomionych z LLVM powinieneś wiedzieć, że to jest kompilatorem kompatybilnym z GCC (kompilatory, optymalizatory i generatory kodu), które kompilują programy do pośredniego kodu bitowego instrukcji wirtualnej typu RISC (maszyna wirtualna niskiego poziomu z wielopoziomowym systemem optymalizacji).
Wygenerowany pseudokod może zostać przekonwertowany przez kompilator JIT na instrukcje maszynowe już w momencie wykonywania programu.
Główne nowe funkcje LLVM 16.0
W prezentowanej nowej wersji możemy znaleźć kilka ważnych ulepszeń w klangu 16.0, z których wyróżnia się domyślny standard C++/ObjC++, który jest ustawiony na gnu++17 (dawniej gnu++14), który oznacza domyślnie obsługę funkcji C++ 17 z rozszerzeniami GNU. W kodzie LLVM dozwolone jest stosowanie elementów zdefiniowanych w standardzie C++17.
Kolejną wyróżniającą się zmianą jest to, że została dodana obsługa procesorów Cortex-A715, Cortex-X3 i Neoverse Rozszerzenia V2, Armv8.3 i funkcje wielu wersji do zaplecza AArch64.
La kompatybilność platformy Armv2, Armv2A, Armv3 i Armv3M zostały wycofane w backendzie architektury ARM, dla którego nie było gwarancji poprawnego wygenerowania kodu. Dodano możliwość generowania kodu dla instrukcji do pracy z liczbami zespolonymi i dodano wsparcie dla architektur zestawów instrukcji (ISA) AMX-FP16, CMPCXADD, AVX-IFMA, AVX-VNNI-INT8, AVX-NE-CONVERT do zaplecza X86.
Poza tym, zwiększono wymagania dotyczące budowy LLVM, Również kompilacja powinna być teraz kompatybilna ze standardem C++ 17, tj. kompilacja wymaga co najmniej GCC 7.1, Clang 5.0, Apple Clang 10.0 lub Visual Studio 2019 16.7.
Z drugiej strony również podkreśla ulepszone backendy dla architektur MIPS, PowerPC i RISC-V, a także obsługę debugowania 64-bitowych plików wykonywalnych dla architektury LoongArch do debugera LLDB oraz ulepszoną obsługę symboli debugowania COFF.
Z innych zmian które wyróżniają się:
- W bibliotece Libc++ główne prace koncentrowały się na implementacji obsługi nowych funkcji standardów C++20 i C++23.
- Czas połączenia został znacznie skrócony w konsolidatorze LDD dzięki zrównolegleniu skanowania relokacji adresów i operacji inicjalizacji sekcji. Dodano obsługę kompresji sekcji przy użyciu algorytmu ZSTD.
- Zwrócono również uwagę na zaawansowane funkcje zaimplementowane w standardzie C++20.
- przechwytywanie linków strukturalnych w funkcjach lambda.
- Operator równości w wyrażeniach.
- Możliwość nie określania słowa kluczowego typename w niektórych kontekstach,
- Dopuszczalność inicjalizacji dodana w nawiasach („Aggr(val1, val2)”).
- Zaimplementowane funkcje zdefiniowane w przyszłym standardzie C++2b.
- Wsparcie świadczone za pomocą typu char8_t,
- Rozszerzono zakres znaków dozwolonych w „\N{…}”,
- Dodano możliwość używania zmiennych zadeklarowanych jako "static constexpr" w funkcjach zadeklarowanych jako constexpr.
- Zaimplementowane funkcje zdefiniowane w przyszłym standardzie C2x C:
- Dodano obsługę ładowania wielu plików konfiguracyjnych (domyślne pliki konfiguracyjne są ładowane jako pierwsze, a następnie te określone za pomocą flagi „–config=”, którą można teraz określić wiele razy).
- Zmieniono kolejność ładowania domyślnych plików konfiguracyjnych: clang próbuje najpierw załadować plik - .cfg, a jeśli nie może go znaleźć, próbuje załadować dwa pliki .cfg i cfg.
- Dodano nową flagę kompilacji „-fcoro-aligned-allocation” dla rutynowej dystrybucji wyrównanej do ramek.
- Dodano flagę „-fmodule-output”, aby włączyć jednofazowy model kompilacji standardowych modułów C++.
- Dodano tryb „-Rpass-analysis=stack-frame-layout” do diagnozowania problemów z układem ramek stosu.
- Dodano nowy atrybut __attribute__((target_version("cpu_features"))) i rozszerzono funkcjonalność atrybutu __attribute__((target_clones("cpu_features1″,"cpu_features2",…))) w celu wybrania określonych wersji funkcji zapewnianych przez procesor AArch64 .
- Udoskonalone narzędzia diagnostyczne:
- Dodano ostrzeżenie „-Wsingle-bit-bitfield-constant-conversion”, aby przechwycić niejawne obcięcie podczas przypisywania jednego do jednobitowego podpisanego pola bitowego.
- Rozszerzona diagnostyka dla niezainicjowanych zmiennych constexpr.
- Dodano ostrzeżenia „-Wcast-function-type-strict” i „-Win Compatible-function-pointer-types-strict”, aby wykryć potencjalne problemy podczas rzutowania typów funkcji.
W końcu Jeśli chcesz dowiedzieć się więcej na ten temat, możesz sprawdzić szczegóły w następujący link.