Wydanie zestawu kompilatorów LLVM 13.0

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:

  • Zaimplementowano obsługę gwarantowanych wywołań końcowych (wywołanie podprogramu na samym końcu funkcji, utworzenie rekurencji ogonowej, jeśli podprogram wywoła sam siebie). Obsługa gwarantowanych wywołań ogona jest zapewniana przez atrybut „[[clang::musttail]]” w C++ i „__attribute__((musttail))” w C, używany w instrukcji „return”. Ta funkcja umożliwia wdrożenie optymalizacji poprzez wdrożenie kodu w płaskiej iteracji, aby zaoszczędzić zużycie stosu.
  • Deklaracje „używania” i rozszerzenia clang zapewniają obsługę definiowania atrybutów w stylu C++ 11 przy użyciu formatu „[[]]”.
  • Dodano flagę „-Wreserved-identifier”, aby wyświetlić ostrzeżenie w przypadku określenia zastrzeżonych identyfikatorów w kodzie użytkownika.
  • Dodano flagi „-Wunused-but-set-parameter” i „-Wunused-but-set-variable”, aby wyświetlić ostrzeżenie, jeśli parametr lub zmienna jest ustawiona, ale nie jest używana.
  • Dodano flagę „-Wnull-pointer-subtraction”, aby wyświetlić ostrzeżenie, jeśli kod może wprowadzić niezdefiniowane zachowanie z powodu użycia wskaźnika zerowego w operacjach odejmowania.
  • Dodano flagę „-fstack-usage”, aby dla każdego pliku kodu wygenerować dodatkowy plik „.su” zawierający informacje o rozmiarze ramek stosu dla każdej funkcji zdefiniowanej w przetwarzanym pliku.
  • Do analizatora statycznego dodano nowy typ wyjścia - „sarif-html”, który umożliwia jednoczesne generowanie raportów w formatach HTML i Sarif. Dodano nową kontrolę allocClassWithName. Po wybraniu opcji „-analyzer-display-progress” wyświetlany jest czas analizy każdej funkcji. Analizator inteligentnych wskaźników (alpha.cplusplus.SmartPtr) jest już prawie gotowy.
  • Rozszerzono 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 wdrażanie specyfikacji OpenCL 3.0. W przypadku języka C domyślnie używana jest specyfikacja OpenCL 1.2, chyba że wyraźnie wybrano inną wersję. Dla C++ dodano obsługę plików z rozszerzeniem „.clcpp”.
  • Zaimplementowano obsługę dyrektyw transformacji pętli („#pragma omp unrol” i „#pragma omptile”) zdefiniowanych w specyfikacji OpenMP 5.1.
  • Do narzędzia clang-format dodano opcje: SpacesInLineCommentPrefix do definiowania liczby spacji przed komentarzami, IndentAccessModifiers, LambdaBodyIndentation i PPIndentWidth do kontrolowania wyrównania wpisów, wyrażeń lambda i dyrektyw preprocesora. Rozszerzono możliwości sortowania wyliczeń plików nagłówkowych (SortIncludes). Dodano obsługę formatowania plików JSON.
  • Dodano dużą część nowych kontroli, aby uporządkować linter.

Kluczowe innowacje w LLVM 13.0:

  • Dodano opcję „-ehcontguard”, aby wykorzystać technologię CET (technologia egzekwowania przepływu sterowania systemu Windows) w celu ochrony przed wykonaniem exploitów zbudowanych przy użyciu technik programowania zorientowanego na zwrot (ROP) na etapie obsługi wyjątków.
  • Projekt debuginfo-test został przemianowany na testy międzyprojektowe i jest przeznaczony do testowania komponentów z różnych projektów, nie ograniczając się do informacji o debugowaniu.
  • System asemblera zapewnia wsparcie przy budowaniu kilku dystrybucji, na przykład jednej z narzędziami, a drugiej z bibliotekami dla programistów.
  • W backendie architektury AArch64 w asemblerze zaimplementowano obsługę rozszerzeń Armv9-A RME (Realm Management Extension) i SME (Scalable Matrix Extension).
  • Do backendu architektury Hexagon dodano obsługę ISA V68/HVX.
  • Backend x86 ma lepszą obsługę procesorów AMD Zen 3.
  • Dodano obsługę APU GFX1013 RDNA2 do backendu AMDGPU.
  • Libc++ kontynuuje wdrażanie nowych funkcji standardów C++20 i C++2b, w tym uzupełnianie biblioteki „concepts”. Dodano obsługę std::filesystem dla platformy Windows opartej na MinGW. Pliki nagłówkowe oddzielone , I . Dodano opcję kompilacji LIBCXX_ENABLE_INCOMPLETE_FEATURES, aby wyłączyć pliki nagłówkowe z nie w pełni zaimplementowaną funkcjonalnością.
  • Rozszerzono możliwości linkera LLD, w którym zaimplementowano obsługę procesorów Big-endian Aarch64, a backend Mach-O doprowadzono do stanu umożliwiającego łączenie zwykłych programów. Zawiera ulepszenia potrzebne do połączenia Glibc przy użyciu LLD.
  • Narzędzie llvm-mca (Machine Code Analyzer) dodało obsługę procesorów wykonujących instrukcje w kolejności (potok superskalarny w kolejności), takich jak ARM Cortex-A55.
  • Debugger LLDB dla platformy AArch64 zapewnia pełną obsługę Pointer Authentication, MTE (MemTag, Memory Tagging Extension) i rejestrów SVE. Dodano polecenia umożliwiające powiązanie znaczników z każdą operacją alokacji pamięci i zorganizowanie sprawdzania wskaźnika podczas uzyskiwania dostępu do pamięci, który musi być powiązany z właściwym znacznikiem.
  • Do generowanych przez projekt binarnych assemblerów dodano debugger LLDB oraz nakładkę dla języka Fortran - Flang.

Źródło: opennet.ru

Dodaj komentarz