Wydanie zestawu kompilatorów LLVM 12.0

Po sześciu miesiącach rozwoju zostaje zaprezentowane wydanie projektu LLVM 12.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 12.0:

  • Zaimplementowano i domyślnie włączono obsługę atrybutów „prawdopodobne” i „mało prawdopodobne” zaproponowane w standardzie C++20, dzięki czemu optymalizator jest informowany o prawdopodobieństwie wyzwolenia konstrukcji warunkowej (na przykład „[[prawdopodobnie ]] if (losowo > 0) {“).
  • Dodano obsługę procesorów AMD Zen 3 (-march=znver3), Intel Alder Lake (-march=alderlake) i Intel Sapphire Rapids (-march=sapphirerapids).
  • Dodano obsługę flag „-march=x86-64-v[234]” w celu wybrania poziomów architektury x86-64 (v2 – obejmuje rozszerzenia SSE4.2, SSSE3, POPCNT i CMPXCHG16B; v3 – AVX2 i MOVBE; v4 – AVX-512 ) .
  • Dodano obsługę procesorów Arm Cortex-A78C (cortex-a78c), Arm Cortex-R82 (cortex-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) i Fujitsu A64FX (a64fx). Na przykład, aby włączyć optymalizację dla procesorów Neoverse-V1, możesz określić „-mcpu=neoverse-v1”.
  • Dla architektury AArch64 dodano nowe flagi kompilatora „-moutline-atomics” i „-mno-outline-atomics”, aby włączyć lub wyłączyć funkcje pomocnicze operacji atomowych, takie jak „__aarch64_cas8_relax”. Takie funkcje wykrywają w czasie wykonywania, czy dostępna jest obsługa LSE (Large System Extensions), i korzystają z dostarczonych instrukcji procesora atomowego lub wracają do używania instrukcji LL/SC (Load-link/store-conditional) do synchronizacji.
  • Dodano opcję „-fbinutils-version”, aby wybrać docelową wersję pakietu binutils w celu zapewnienia zgodności ze starszym zachowaniem linkera i asemblera.
  • W przypadku plików wykonywalnych ELF, jeśli określono flagę „-gz”, domyślnie włączona jest kompresja informacji debugowania przy użyciu biblioteki zlib (gz=zlib). Łączenie wynikowych plików obiektowych wymaga lld lub GNU binutils 2.26+. Aby przywrócić kompatybilność ze starszymi wersjami binutils, możesz podać „-gz=zlib-gnu”.
  • Wskaźnik „this” jest teraz przetwarzany przy użyciu kontroli innych niż null i umożliwiających wyłuskanie (N). Aby usunąć atrybut inny niż null, gdy konieczne jest użycie wartości NULL, możesz użyć opcji „-fdelete-null-pointer-checks”.
  • Na platformie Linux tryb „-fasynchronous-unwind-tables” jest włączony dla architektur AArch64 i PowerPC w celu generowania tabel wywołań unwind, tak jak w GCC.
  • W „#pragma clang pętli Vectorize_width” dodano możliwość określenia „stałych” (domyślnych) i „skalowalnych” opcji wyboru metody wektoryzacji. Tryb „skalowalny”, niezależny od długości wektora, ma charakter eksperymentalny i można go używać na sprzęcie obsługującym skalowalną wektoryzację.
  • Ulepszona obsługa platformy Windows: Przygotowano oficjalne zestawy binarne dla systemu Windows na systemach Arm64, w tym kompilator Clang, linker LLD i biblioteki wykonawcze kompilatora-rt. Podczas budowania dla platform docelowych MinGW dodawany jest przyrostek .exe, nawet podczas kompilacji krzyżowej.
  • Rozszerzone zostały możliwości związane ze wsparciem OpenCL, OpenMP i CUDA. Dodano opcje „-cl-std=CL3.0” i „-cl-std=CL1.0”, aby wybrać opcje makr dla OpenCL 3.0 i OpenCL 1.0. Rozszerzono narzędzia diagnostyczne.
  • Dodano obsługę instrukcji HRESET, UINTR i AVXVNNI zaimplementowanych w niektórych procesorach opartych na procesorach x86.
  • W systemach x86 włączona jest obsługa opcji „-mtune=”, umożliwiająca wybrane optymalizacje mikroarchitektury niezależnie od wartości „-march=”.
  • Analizator statyczny usprawnił przetwarzanie niektórych funkcji POSIX i znacząco poprawił wyznaczanie wyniku operacji warunkowych, gdy w porównaniu występuje kilka wartości symbolicznych. Dodano nowe kontrole: fuchia.HandleChecker (definiuje uchwyty w strukturach), webkit.UncountedLambdaCapturesChecker webkit i alpha.webkit.UncountedLocalVarsChecker (uwzględnia specyfikę pracy ze wskaźnikami w kodzie silnika WebKit).
  • W wyrażeniach używanych w kontekście stałych zastosowanie funkcji wbudowanych __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __bit_scan_reverse, __bsrd, __bsrq, __bswap, __bswapd, __bswap64, __ dozwolone jest bswapq , _castf*, __rol* i __ror*.
  • Do narzędzia clang-format dodano opcję BitFieldColonSpacing, aby wybrać odstępy wokół identyfikatorów, kolumn i definicji pól.
  • Serwer buforujący clangd (Clang Server) na platformie Linux znacznie zmniejszył zużycie pamięci podczas długotrwałej pracy (okresowe wywołania malloc_trim służą do zwracania wolnych stron pamięci do systemu operacyjnego).

Kluczowe innowacje w LLVM 12.0:

  • Zaprzestano obsługi narzędzia do kompilacji llvm-build napisanego w języku Python i zamiast tego projekt całkowicie przeszedł na system kompilacji CMake.
  • W backendie architektury AArch64 poprawiono obsługę platformy Windows: zapewniono poprawną generację wyjścia asemblera dla docelowych systemów Windows, zoptymalizowano generowanie danych o wywołaniach unwind (rozmiar tych danych zmniejszono o 60 %), dodano możliwość tworzenia danych unwind przy użyciu asemblera, dodano dyrektywy .seh_*.
  • Zaplecze architektury PowerPC zawiera nowe optymalizacje dla pętli i wdrażania inline, rozszerzoną obsługę procesorów Power10, dodaną obsługę instrukcji MMA do manipulacji macierzą oraz ulepszoną obsługę systemu operacyjnego AIX.
  • Backend x86 dodaje obsługę procesorów AMD Zen 3, Intel Alder Lake i Intel Sapphire Rapids, a także instrukcje procesorów HRESET, UINTR i AVXVNNI. Obsługa MPX (Memory Protection Extensions) do sprawdzania wskaźników w celu upewnienia się, że granice pamięci nie są już obsługiwane (ta technologia nie jest rozpowszechniona i została już usunięta z GCC i clang). Do asemblera dodano obsługę przedrostków {disp32} i {disp8} oraz przyrostków .d32 i .d8 w celu kontrolowania rozmiaru przesunięć i skoków operandów. Dodano nowy atrybut „tune-cpu”, aby kontrolować włączenie optymalizacji mikroarchitektury.
  • Do detektora problemów z liczbami całkowitymi dodano nowy tryb „-fsanitize=unsigned-shift-base” (integer sanitizer, „-fsanitize=integer”) w celu wykrywania przepełnienia liczb całkowitych bez znaku po przesunięciu bitu w lewo.
  • W różnych detektorach (asan, cfi, lsan, msan, tsan, ubsan sanitizer) dodano obsługę dystrybucji Linuksa ze standardową biblioteką Musl.
  • Możliwości linkera LLD zostały rozszerzone. Ulepszona obsługa formatu ELF, w tym dodane opcje „--plik-zależności”, „-skrypt-obsługi błędów”, „-lto-pseudo-probe-for-profiling”, „-no-lto-whole-program -widoczność” Ulepszona obsługa MinGW. W przypadku formatu Mach-O (macOS) zaimplementowano obsługę architektur arm64, arm i i386, optymalizację czasu łącza (LTO) i odwijanie stosu w celu obsługi wyjątków.
  • Libc++ implementuje nowe funkcje standardu C++20 i rozpoczyna rozwój funkcjonalności specyfikacji C++2b. Dodano obsługę budowania z wyłączeniem obsługi lokalizacji („-DLIBCXX_ENABLE_LOCALIZATION=OFF”) i urządzeń do generowania liczb pseudolosowych („-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF”).

Źródło: opennet.ru

Dodaj komentarz