Wydanie zestawu kompilatorów LLVM 15.0

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

Główne ulepszenia w Clang 15.0:

  • Dla systemów opartych na architekturze x86 dodana została flaga „-fzero-call-used-regs”, która gwarantuje, że wszystkie rejestry procesora użyte w funkcji zostaną wyzerowane przed zwrotem sterowania z funkcji. Ta opcja pozwala zabezpieczyć się przed wyciekiem informacji z funkcji i zmniejszyć liczbę bloków odpowiednich do budowania gadżetów ROP (programowanie zorientowane na zwrot) w exploitach o około 20%.
  • Zaimplementowano randomizację rozmieszczenia struktur w pamięci dla kodu C, co komplikuje ekstrakcję danych ze struktur w przypadku wykorzystania luk. Randomizację można włączać i wyłączać za pomocą atrybutów randomize_layout i no_randomize_layout i wymaga ustawienia materiału siewnego przy użyciu flagi „-frandomize-layout-seed” lub „-frandomize-layout-seed-file”.
  • Dodano flagę „-fstrict-flex-arrays=" ", za pomocą którego można kontrolować granice elastycznego elementu tablicy w strukturach (Flexible Array Members, tablica o nieokreślonym rozmiarze na końcu struktury). Przy ustawieniu na 0 (domyślnie) ostatni element struktury z tablicą jest zawsze przetwarzany jako tablica elastyczna, 1 - tylko rozmiary [], [0] i [1] są przetwarzane jako tablica elastyczna, 2 - tylko rozmiary [] i [0] są przetwarzane jak elastyczna tablica.
  • Dodano eksperymentalne wsparcie dla języka C HLSL (High-Level Shader Language), używanego w DirectX do pisania shaderów.
  • Dodano parametr „-Warray”, aby ostrzec o przesłanianiu funkcji z niezgodnymi deklaracjami argumentów powiązanymi z tablicami o stałej i zmiennej długości.
  • Poprawiona kompatybilność z MSVC. Dodano obsługę „funkcji #pragma” (instruuje kompilator, aby wygenerował wywołanie funkcji zamiast rozwijania wbudowanego) i „#pragma alloc_text” (definiuje nazwę sekcji z kodem funkcji) dostarczonych w MSVC. Dodano obsługę flag /JMC i /JMC zgodnych z MSVC.
  • Kontynuowane są prace nad obsługą przyszłych standardów C2X i C++23. Dla języka C zaimplementowane są: atrybut noreturn, słowa kluczowe false i true, typ _BitInt(N) dla liczb całkowitych o danej głębi bitowej, makra *_WIDTH, prefiks u8 dla znaków zakodowanych w UTF-8.

    Dla C++ zaimplementowano: łączenie modułów, izolację składowych funkcji ABI, uporządkowaną dynamiczną inicjalizację zmiennych nielokalnych w modułach, wielowymiarowe operatory indeksów, auto(x), zmienne nieliteralne, goto i etykiety w funkcjach zadeklarowanych jako constexpr , rozdzielane sekwencje specjalne, nazwane znaki specjalne.

  • Rozszerzono możliwości związane z obsługą OpenCL i OpenMP. Dodano obsługę rozszerzenia OpenCL cl_khr_subgroup_rotate.
  • Dla architektury x86 dodano ochronę przed lukami w procesorach spowodowanymi spekulatywnym wykonaniem instrukcji po operacjach bezwarunkowego skoku do przodu. Problem występuje w wyniku wywłaszczającego przetwarzania instrukcji bezpośrednio po instrukcji rozgałęzienia w pamięci (SLS, Straight Line Speculation). Aby włączyć ochronę, zaproponowano opcję „-mharden-sls=[none|all|return|indirect-jmp]”.
  • Dla platform obsługujących rozszerzenie SSE2 dodano typ _Float16, który w przypadku braku obsługi instrukcji AVX512-FP16 jest emulowany przy użyciu typu float.
  • Dodano flagę „-m[no-]rdpru” do kontrolowania użycia instrukcji RDPRU, obsługiwaną począwszy od procesorów AMD Zen2.
  • Dodano flagę „-mfunction-return=thunk-extern” w celu ochrony przed luką RETBLEED, która działa poprzez dodanie sekwencji instrukcji wykluczającej udział mechanizmu wykonywania spekulatywnego dla gałęzi pośrednich.

Kluczowe innowacje w LLVM 15.0:

  • Dodano obsługę procesorów Cortex-M85, architektur Armv9-A, Armv9.1-A i Armv9.2-A, rozszerzeń Armv8.1-M PACBTI-M.
  • Dodano eksperymentalny backend dla DirectX, który obsługuje format DXIL (DirectX Intermediate Language) używany w shaderach DirectX. Zaplecze jest włączane poprzez określenie parametru „-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX” podczas składania.
  • Libc++ kontynuuje wdrażanie nowych funkcjonalności standardów C++20 i C++2b, włączając w to zakończenie implementacji biblioteki „format” i proponowanej eksperymentalnej wersji biblioteki „ranges”.
  • Ulepszone backendy dla architektur x86, PowerPC i RISC-V.
  • Udoskonalono możliwości łącznika LLD i debugera LLDB.

Źródło: opennet.ru

Dodaj komentarz