Izdanje LLVM 12.0 kompajlerskog paketa

Nakon šest mjeseci razvoja, predstavljeno je izdanje LLVM 12.0 projekta - GCC-kompatibilnog kompleta alata (kompajleri, optimizatori i generatori koda) koji kompajlira programe u srednji bit kod RISC-ovih virtualnih instrukcija (virtuelna mašina niskog nivoa sa sistem optimizacije na više nivoa). Generisani pseudokod se može konvertovati pomoću JIT kompajlera u mašinske instrukcije direktno u vreme izvršavanja programa.

Poboljšanja u Clang 12.0:

  • Podrška za atribute "vjerovatno" i "nevjerovatno" predložene u standardu C++20 implementirana je i omogućena prema zadanim postavkama, omogućavajući optimizatoru da bude informiran o vjerovatnoći pokretanja uvjetne konstrukcije (na primjer, "[[vjerovatno ]] if (nasumično > 0) {“).
  • Dodata podrška za AMD Zen 3 (-march=znver3), Intel Alder Lake (-march=alderlake) i Intel Sapphire Rapids (-march=sapphirerapids) procesore.
  • Dodata podrška za "-march=x86-64-v[234]" zastavice za odabir nivoa x86-64 arhitekture (v2 - pokriva SSE4.2, SSSE3, POPCNT i CMPXCHG16B ekstenzije; v3 - AVX2 i MOVBE; v4 - AVX-512 ) .
  • Dodata 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, možete navesti “-mcpu=neoverse-v1”.
  • Za arhitekturu AArch64 dodane su nove zastavice kompajlera "-moutline-atomics" i "-mno-outline-atomics" kako bi se omogućile ili onemogućile pomoćne funkcije atomske operacije, kao što je "__aarch64_cas8_relax". Takve funkcije otkrivaju u vrijeme izvođenja da li je dostupna podrška za LSE (Large System Extensions) i koriste priložene instrukcije atomskog procesora ili se vraćaju na korištenje LL/SC (Load-link/store-conditional) instrukcija za sinhronizaciju.
  • Dodata opcija "-fbinutils-version" za odabir ciljne verzije binutils paketa radi kompatibilnosti sa starijim ponašanjem linkera i asemblera.
  • Za ELF izvršne datoteke, kada je navedena zastavica “-gz”, kompresija informacija za otklanjanje grešaka pomoću biblioteke zlib je omogućena po defaultu (gz=zlib). Povezivanje rezultirajućih objektnih datoteka zahtijeva lld ili GNU binutils 2.26+. Da biste vratili kompatibilnost sa starijim verzijama binutilsa, možete odrediti "-gz=zlib-gnu".
  • Pokazivač 'this' se sada obrađuje s provjerama koje nisu nule i koje se mogu dereferencirati (N). Da biste uklonili nonnull atribut kada trebate koristiti NULL vrijednosti, možete koristiti opciju "-fdelete-null-pointer-checks".
  • Na Linux platformi, režim "-fasynchronous-unwind-tables" je omogućen za AArch64 i PowerPC arhitekture za generiranje tabela poziva za odmotavanje, kao u GCC-u.
  • U "#pragma clang loop vectorize_width" dodata je mogućnost specificiranja "fiksne" (podrazumevane) i "skalabilne" opcije za odabir metode vektorizacije. "Skalabilni" način rada, neovisno o dužini vektora, je eksperimentalan i može se koristiti na hardveru koji podržava skalabilnu vektorizaciju.
  • Poboljšana podrška za Windows platformu: Pripremljeni su zvanični binarni sklopovi za Windows na Arm64 sistemima, uključujući Clang kompajler, LLD linker i compiler-rt runtime biblioteke. Prilikom izrade za MinGW ciljne platforme, dodaje se .exe sufiks, čak i prilikom unakrsnog prevođenja.
  • Mogućnosti povezane s podrškom za OpenCL, OpenMP i CUDA su proširene. 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.
  • Dodata podrška za HRESET, UINTR i AVXVNNI instrukcije implementirane u nekim procesorima baziranim na x86.
  • Na x86 sistemima, podrška za opciju "-mtune=" je omogućena, omogućavajući odabrane mikroarhitektonske optimizacije bez obzira na vrijednost "-march=".
  • Statički analizator je poboljšao obradu nekih POSIX funkcija i značajno poboljšao određivanje rezultata uvjetnih operacija kada postoji nekoliko simboličkih vrijednosti u poređenju. Dodane su nove provjere: fuchia.HandleChecker (definira ručke u strukturama), webkit.UncountedLambdaCapturesChecker webkit i alpha.webkit.UncountedLocalVarsChecker (uzima u obzir posebnosti rada sa pokazivačima u kodu WebKit engine-a).
  • 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_bsbsd_wap_wap_reverse, __bswap64, __ je dozvoljen bswapq , _castf*, __rol* i __ror*.
  • Dodata opcija BitFieldColonSpacing uslužnom programu clang-format za odabir razmaka oko identifikatora, kolona i definicija polja.
  • Clangd server za keširanje (Clang Server) na Linux platformi značajno je smanjio potrošnju memorije tokom dugotrajnog rada (omogućeni su periodični pozivi malloc_trim za vraćanje slobodnih memorijskih stranica u operativni sistem).

Ključne inovacije u LLVM 12.0:

  • Podrška za llvm-build alat napisan na Python-u je ukinut, a umjesto toga projekat je u potpunosti prešao na korištenje CMake build sistema.
  • U backendu za AArch64 arhitekturu, poboljšana je podrška za Windows platformu: osigurano je ispravno generiranje asemblerskog izlaza za ciljne Windows sisteme, optimizirano je generiranje podataka o pozivima za odmotavanje (veličina takvih podataka je smanjena za 60 %), mogućnost kreiranja podataka za odmotavanje pomoću asemblera je dodana direktivama .seh_*.
  • Backend za PowerPC arhitekturu sadrži nove optimizacije za petlje i inline implementaciju, proširenu podršku za Power10 procesore, dodatu podršku za MMA instrukcije za manipulaciju matricom i poboljšanu podršku za AIX operativni sistem.
  • x86 backend dodaje podršku za AMD Zen 3, Intel Alder Lake i Intel Sapphire Rapids procesore, kao i HRESET, UINTR i AVXVNNI instrukcije za procesore. Podrška za MPX (Memory Protection Extensions) 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 clang). Dodata podrška asembleru za prefikse {disp32} i {disp8} i 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” je dodat detektoru cjelobrojnih problema (integer sanitizer, “-fsanitize=integer”) za otkrivanje prekoračenja neoznačenih cijelih brojeva nakon pomaka bita ulijevo.
  • U raznim detektorima (asan, cfi, lsan, msan, tsan, ubsan sanitizer) dodana je podrška za Linux distribucije sa standardnom Musl bibliotekom.
  • Mogućnosti LLD linkera su proširene. 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 Mach-O format (macOS), implementirana je podrška za arm64, arm i i386 arhitekture, optimizacije vremena veze (LTO) i odmotavanje steka za rukovanje izuzetcima.
  • Libc++ implementira nove karakteristike standarda C++20 i započeo je razvoj karakteristika C++2b specifikacije. Dodata podrška za izgradnju uz onemogućavanje podrške za lokalizaciju (“-DLIBCXX_ENABLE_LOCALIZATION=OFF”) i uređaja za generiranje pseudo-slučajnih brojeva (“-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF”).

izvor: opennet.ru

Dodajte komentar