Po sześciu miesiącach rozwoju zostaje zaprezentowane wydanie projektu LLVM 13.0 — zestawu narzędzi kompatybilnego z GCC (kompilatory, optymalizatory i generatory kodu), który kompiluje programy w pośredni kod bitowy instrukcji wirtualnych podobnych do RISC (maszyna wirtualna niskiego poziomu z wielopoziomowy system optymalizacji). Wygenerowany pseudokod może zostać przekształcony przez kompilator JIT w instrukcje maszynowe w momencie wykonywania programu.
Ulepszenia w Clang 13.0:
- Obsługiwane są gwarantowane wywołania ogonowe (wywołanie podprogramu na samym końcu funkcji, tworząc rekurencję ogonową, jeśli podprogram wywołuje sam siebie). Gwarantowane wywołania ogonowe są obsługiwane za pomocą atrybutu „[[clang::musttail]]” w C++ i „__attribute__((musttail))” w C, używanego w wyrażeniu „return”. Ta funkcja umożliwia optymalizację poprzez rozwinięcie kodu do płaskiej iteracji, co pozwala zaoszczędzić miejsce na stosie.
- Definicje atrybutów w stylu C++11 są teraz obsługiwane w deklaracjach „using” i rozszerzeniach Clang, korzystając z formatu „[[]]”.
- Dodano flagę „-Wreserved-identifier”, która wyświetla ostrzeżenie podczas określania zarezerwowanych identyfikatorów w kodzie użytkownika.
- Dodano flagi „-Wunused-but-set-parameter” i „-Wunused-but-set-variable”, które wyświetlają ostrzeżenie, jeśli parametr lub zmienna jest ustawiona, ale nie jest używana.
- Dodano flagę „-Wnull-pointer-subtraction”, która wyświetla ostrzeżenie, jeśli kod może prowadzić do niezdefiniowanego zachowania z powodu użycia wskaźnika zerowego w operacjach odejmowania.
- Dodano flagę „-fstack-usage” w celu wygenerowania dla każdego pliku kodu dodatkowego pliku „.su” zawierającego informacje o rozmiarze ramek stosu dla każdej funkcji zdefiniowanej w przetwarzanym pliku.
- Do analizatora statycznego dodano nowy typ danych wyjściowych — „sarif-html”, który generuje raporty zarówno w formacie HTML, jak i Sarif. Dodano nowe sprawdzenie allocClassWithName. Po określeniu opcji „-analyzer-display-progress” zwracany jest czas analizy każdej funkcji. Inteligentny analizator wskaźników (alpha.cplusplus.SmartPtr) jest prawie gotowy.
- Rozszerzone możliwości związane z obsługą OpenCL. Dodano obsługę nowych rozszerzeń cl_khr_integer_dot_product, cl_khr_extended_bit_ops, __cl_clang_bitfields i __cl_clang_non_portable_kernel_param_types. Kontynuowano implementację specyfikacji OpenCL 3.0. W przypadku języka C domyślnie używana jest specyfikacja OpenCL 1.2, chyba że jawnie wybrano inną wersję. W przypadku języka C++ dodano obsługę plików z rozszerzeniem „.clcpp”.
- Wprowadzono obsługę dyrektyw transformacji pętli („#pragma omp unrol” i „#pragma omp tile”) zdefiniowanych w specyfikacji OpenMP 5.1.
- Narzędzie clang-format zostało zaktualizowane o następujące opcje: SpacesInLineCommentPrefix do określania liczby spacji przed komentarzami, IndentAccessModifiers, LambdaBodyIndentation i PPIndentWidth do kontrolowania wyrównania rekordów, wyrażeń lambda i dyrektyw preprocesora. Rozszerzono możliwość sortowania listy plików nagłówkowych (SortIncludes). Dodano obsługę formatowania plików JSON.
- Do pakietu clang-tidy dodano dużą partię nowych kontroli.
Kluczowe innowacje w LLVM 13.0:
- Dodano opcję „-ehcontguard” umożliwiającą korzystanie z technologii CET (Windows Technologia egzekwowania przepływu sterowania (Control-flow Enforcement Technology) zapewniająca ochronę na etapie obsługi wyjątków przed wykonywaniem exploitów stworzonych przy użyciu technik programowania zorientowanego na powrót (Return-Oriented Programming, ROP).
- Projekt debuginfo-test został przemianowany na cross-project-tests i jest przeznaczony do testowania komponentów z różnych projektów, nie ograniczając się wyłącznie do informacji debugowania.
- System kompilacji umożliwia tworzenie wielu dystrybucji, na przykład jednej z narzędziami i drugiej z bibliotekami dla programistów.
- Zaplecze architektury AArch64 implementuje obsługę rozszerzeń Armv9-A RME (Realm Management Extension) i SME (Scalable Matrix Extension) w asemblerze.
- Do architektury Hexagon dodano obsługę ISA V68/HVX.
- Architektura x86 zapewnia lepszą obsługę procesorów AMD Zen 3.
- Dodano obsługę układu GFX1013 RDNA2 APU do zaplecza AMDGPU.
- Libc++ kontynuuje implementację nowych funkcji standardów C++20 i C++2b, w tym ukończenie biblioteki „concepts”. Dla platformy Windows Dodano obsługę std::filesystem opartego na MinGW. Pliki nagłówkowe zostały rozdzielone. , I Dodano opcję kompilacji LIBCXX_ENABLE_INCOMPLETE_FEATURES umożliwiającą wyłączenie plików nagłówkowych o niepełnej funkcjonalności.
- Linker LLD został rozszerzony o obsługę procesorów Big-endian Aarch64, a backend Mach-O został ulepszony, aby umożliwić linkowanie standardowych programów. Wprowadzono również ulepszenia niezbędne do linkowania biblioteki Glibc za pomocą LLD.
- Narzędzie llvm-mca (Machine Code Analyzer) zostało zaktualizowane w celu zapewnienia obsługi procesorów potokowych superskalarnych, takich jak ARM Cortex-A55.
- Debuger LLDB dla platformy AArch64 w pełni obsługuje teraz uwierzytelnianie wskaźników, mechanizm MTE (MemTag, rozszerzenie tagowania pamięci) oraz rejestry SVE. Dodano polecenia wiążące znaczniki z każdą operacją alokacji pamięci oraz sprawdzające wskaźnik podczas dostępu do pamięci, który musi być powiązany z prawidłowym znacznikiem.
- Debuger LLDB i interfejs użytkownika Fortran Flang zostały dodane do plików binarnych generowanych przez projekt.
Źródło: opennet.ru
