Izdanje paketa prevoditelja LLVM 12.0

Nakon šest mjeseci razvoja, predstavljeno je izdanje projekta LLVM 12.0 - GCC-kompatibilnog skupa alata (kompilatori, optimizatori i generatori koda) koji kompajlira programe u međubitni kod virtualnih instrukcija sličnih RISC-u (virtualni stroj niske razine s višerazinski optimizacijski sustav). Generirani pseudokod može se pretvoriti pomoću JIT kompajlera u strojne instrukcije izravno u trenutku izvođenja programa.

Poboljšanja u Clangu 12.0:

  • Podrška za atribute "vjerojatno" i "malo vjerojatno" predložene u standardu C++20 implementirana je i omogućena prema zadanim postavkama, omogućujući optimizatoru da bude informiran o vjerojatnosti pokretanja uvjetne konstrukcije (na primjer, "[[vjerojatno ]] if (random > 0) {“).
  • Dodana podrška za procesore AMD Zen 3 (-march=znver3), Intel Alder Lake (-march=alderlake) i Intel Sapphire Rapids (-march=sapphirerapids).
  • Dodana podrška za oznake "-march=x86-64-v[234]" za odabir razina arhitekture x86-64 (v2 - pokriva SSE4.2, SSSE3, POPCNT i CMPXCHG16B ekstenzije; v3 - AVX2 i MOVBE; v4 - AVX-512 ) .
  • Dodana podrška za procesore 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 primjer, da biste omogućili optimizacije za Neoverse-V1 CPU-e, možete navesti "-mcpu=neoverse-v1".
  • Za arhitekturu AArch64 dodane su nove oznake prevoditelja "-moutline-atomics" i "-mno-outline-atomics" za omogućavanje ili onemogućavanje pomoćnih funkcija atomskih operacija, kao što je "__aarch64_cas8_relax". Takve funkcije u vrijeme izvođenja otkrivaju je li podrška za LSE (Large System Extensions) dostupna i koriste dostavljene upute atomskog procesora ili se vraćaju na korištenje LL/SC (Load-link/store-conditional) instrukcija za sinkronizaciju.
  • Dodana je opcija "-fbinutils-version" za odabir ciljane verzije paketa binutils za kompatibilnost sa starijim ponašanjem povezivača i asemblera.
  • Za ELF izvršne datoteke, kada je navedena zastavica "-gz", kompresija informacija o otklanjanju pogrešaka pomoću biblioteke zlib omogućena je prema zadanim postavkama (gz=zlib). Povezivanje rezultirajućih objektnih datoteka zahtijeva lld ili GNU binutils 2.26+. Za vraćanje kompatibilnosti sa starijim verzijama binutilsa, možete navesti "-gz=zlib-gnu".
  • Pokazivač 'this' sada se obrađuje provjerama koje nisu null i dereferenceable(N). Za uklanjanje nonnull atributa kada trebate koristiti NULL vrijednosti, možete koristiti opciju "-fdelete-null-pointer-checks".
  • Na Linux platformi, način rada "-fasynchronous-unwind-tables" omogućen je za AArch64 i PowerPC arhitekture za generiranje tablica poziva za opuštanje, kao u GCC-u.
  • U "#pragma clang loop vectorize_width" dodana je mogućnost određivanja "fiksne" (zadane) i "skalabilne" opcije za odabir metode vektorizacije. "Skalabilni" način, neovisno o duljini vektora, je eksperimentalni i može se koristiti na hardveru koji podržava skalabilnu vektorizaciju.
  • Poboljšana podrška za Windows platformu: Pripremljeni su službeni binarni sklopovi za Windows na Arm64 sustavima, uključujući Clang kompajler, LLD povezivač i prevoditelj-rt runtime biblioteke. Prilikom izgradnje za MinGW ciljne platforme, dodaje se sufiks .exe, čak i kod unakrsnog prevođenja.
  • Proširene su mogućnosti povezane s podrškom za OpenCL, OpenMP i CUDA. Dodane opcije "-cl-std=CL3.0" i "-cl-std=CL1.0" za odabir makro opcija za OpenCL 3.0 i OpenCL 1.0. Dijagnostički alati su prošireni.
  • Dodana podrška za instrukcije HRESET, UINTR i AVXVNNI implementirane u neke procesore temeljene na x86.
  • Na x86 sustavima omogućena je podrška za opciju "-mtune=", koja omogućuje odabrane mikroarhitektonske optimizacije bez obzira na vrijednost "-march=".
  • Statički analizator ima poboljšanu obradu nekih POSIX funkcija i značajno poboljšano određivanje rezultata uvjetnih operacija kada postoji nekoliko simboličkih vrijednosti u usporedbi. Dodane su nove provjere: fuchia.HandleChecker (definira ručke u strukturama), webkit.UncountedLambdaCapturesChecker webkit i alpha.webkit.UncountedLocalVarsChecker (uzima u obzir osobitosti rada s pokazivačima u kodu motora WebKit).
  • U izrazima koji se koriste u kontekstu konstanti, upotreba ugrađenih funkcija __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __bit_scan_reverse, __bsrd, __bsrq, __bswap, __bswapd , __bswap64, __ je dopušteno bswapq , _castf*, __rol* i __ror*.
  • Dodana je opcija BitFieldColonSpacing uslužnom programu za formatiranje klapa za odabir razmaka oko identifikatora, stupaca i definicija polja.
  • Clangd poslužitelj za predmemoriju (Clang Server) na Linux platformi značajno je smanjio potrošnju memorije tijekom dugotrajnog rada (omogućeni su periodični pozivi na malloc_trim za vraćanje slobodnih memorijskih stranica operativnom sustavu).

Ključne inovacije u LLVM 12.0:

  • Podrška za alat za izgradnju llvm-build napisan u Pythonu je prekinuta, a umjesto toga projekt je u potpunosti prešao na korištenje sustava za izgradnju CMake.
  • U pozadini za AArch64 arhitekturu, poboljšana je podrška za Windows platformu: osigurana je ispravna generacija asemblerskog izlaza za ciljne Windows sustave, optimizirana je generacija podataka o pozivima za odmotavanje (veličina takvih podataka smanjena je za 60 %), mogućnost stvaranja podataka za odmotavanje pomoću asemblera dodane su direktive .seh_*.
  • Pozadina za PowerPC arhitekturu ima nove optimizacije za petlje i inline implementaciju, proširenu podršku za Power10 procesore, dodanu podršku za MMA instrukcije za manipulaciju matricom i poboljšanu podršku za AIX operativni sustav.
  • Pozadina x86 dodaje podršku za procesore AMD Zen 3, Intel Alder Lake i Intel Sapphire Rapids, kao i upute za procesor HRESET, UINTR i AVXVNNI. Podrška za MPX (Proširenja za zaštitu memorije) za provjeru pokazivača kako bi se osiguralo da granice memorije više nisu podržane (ova tehnologija nije široko rasprostranjena i već je uklonjena iz GCC-a i klanka). Asembleru je dodana podrška za prefikse {disp32} i {disp8} te sufikse .d32 i .d8 za kontrolu veličine pomaka i skokova operanda. Dodan je novi atribut "tune-cpu" za kontrolu uključivanja mikroarhitektonskih optimizacija.
  • Novi način rada “-fsanitize=unsigned-shift-base” dodan je detektoru problema s cijelim brojevima (integer sanitizer, “-fsanitize=integer”) za otkrivanje preljeva cijelih brojeva bez predznaka nakon malog pomaka ulijevo.
  • U raznim detektorima (asan, cfi, lsan, msan, tsan, ubsan sanitizer) dodana je podrška za Linux distribucije sa standardnom Musl bibliotekom.
  • Proširene su mogućnosti LLD povezivača. Poboljšana podrška za ELF format, uključujući dodane opcije “--dependency-file”, “-error-handling-script”, “-lto-pseudo-probe-for-profiling”, “-no-lto-whole-program -vidljivost" " Poboljšana podrška za MinGW. Za format Mach-O (macOS) implementirana je podrška za arm64, arm i i386 arhitekture, optimizacije vremena povezivanja (LTO) i odmotavanje stoga za rukovanje iznimkama.
  • Libc++ implementira nove značajke standarda C++20 i započeo je razvoj značajki specifikacije C++2b. Dodana podrška za izgradnju s onemogućavanjem podrške za lokalizaciju (“-DLIBCXX_ENABLE_LOCALIZATION=OFF”) i uređaja za generiranje pseudoslučajnih brojeva (“-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF”).

Izvor: opennet.ru

Dodajte komentar