Izdaja zbirke prevajalnikov LLVM 12.0

Po šestih mesecih razvoja je bila predstavljena izdaja projekta LLVM 12.0 - kompleta orodij, združljivega z GCC (prevajalniki, optimizatorji in generatorji kode), ki prevaja programe v vmesno bitno kodo virtualnih ukazov, podobnih RISC (virtualni stroj nizke ravni z večnivojski optimizacijski sistem). Ustvarjeno psevdokodo je mogoče pretvoriti s pomočjo prevajalnika JIT v strojna navodila neposredno v času izvajanja programa.

Izboljšave v Clang 12.0:

  • Podpora za atributa »verjetno« in »malo verjetno«, predlagana v standardu C++20, je implementirana in privzeto omogočena, kar omogoča, da je optimizator obveščen o verjetnosti sprožitve pogojnega konstrukta (na primer »[[verjetno ]] če (naključno > 0) {“).
  • Dodana podpora za procesorje AMD Zen 3 (-march=znver3), Intel Alder Lake (-march=alderlake) in Intel Sapphire Rapids (-march=sapphirerapids).
  • Dodana podpora za zastavice "-march=x86-64-v[234]" za izbiro ravni arhitekture x86-64 (v2 - zajema razširitve SSE4.2, SSSE3, POPCNT in CMPXCHG16B; v3 - AVX2 in MOVBE; v4 - AVX-512 ) .
  • Dodana podpora za procesorje Arm Cortex-A78C (cortex-a78c), Arm Cortex-R82 (cortex-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) in Fujitsu A64FX (a64fx). Če želite na primer omogočiti optimizacije za procesorje Neoverse-V1, lahko podate »-mcpu=neoverse-v1«.
  • Za arhitekturo AArch64 sta bili dodani novi zastavici prevajalnika "-moutline-atomics" in "-mno-outline-atomics", da omogočita ali onemogočita pomožne funkcije za atomsko operacijo, kot je "__aarch64_cas8_relax". Takšne funkcije med izvajanjem zaznajo, ali je na voljo podpora za LSE (velike sistemske razširitve), in uporabijo podana navodila atomskega procesorja ali se za sinhronizacijo vrnejo k uporabi navodil LL/SC (nalaganje povezave/pogojno shranjevanje).
  • Dodana možnost "-fbinutils-version" za izbiro ciljne različice zbirke binutils za združljivost s starejšim povezovalnikom in sestavljalcem.
  • Za izvedljive datoteke ELF, ko je podana zastavica »-gz«, je stiskanje informacij o odpravljanju napak s knjižnico zlib privzeto omogočeno (gz=zlib). Povezovanje nastalih objektnih datotek zahteva lld ali GNU binutils 2.26+. Če želite obnoviti združljivost s starejšimi različicami binutils, lahko podate "-gz=zlib-gnu".
  • Kazalec 'ta' je zdaj obdelan s preverjanji, ki niso ničelna in dereferencirana (N). Če želite odstraniti atribut nonnull, ko morate uporabiti vrednosti NULL, lahko uporabite možnost "-fdelete-null-pointer-checks".
  • Na platformi Linux je način "-fasynchronous-unwind-tables" omogočen za arhitekturi AArch64 in PowerPC za ustvarjanje tabel za sprostitev klicev, kot v GCC.
  • V "#pragma clang loop vectorize_width" je dodana možnost določanja "fiksne" (privzete) in "razširljive" možnosti za izbiro metode vektorizacije. "Razširljiv" način, neodvisen od dolžine vektorja, je eksperimentalen in se lahko uporablja na strojni opremi, ki podpira razširljivo vektorizacijo.
  • Izboljšana podpora za platformo Windows: pripravljeni so bili uradni binarni sklopi za Windows v sistemih Arm64, vključno s prevajalnikom Clang, povezovalcem LLD in izvajalnimi knjižnicami prevajalnik-rt. Pri gradnji za ciljne platforme MinGW je dodana pripona .exe, tudi pri navzkrižnem prevajanju.
  • Zmogljivosti, povezane s podporo za OpenCL, OpenMP in CUDA, so bile razširjene. Dodani možnosti "-cl-std=CL3.0" in "-cl-std=CL1.0" za izbiro možnosti makra za OpenCL 3.0 in OpenCL 1.0. Diagnostična orodja so bila razširjena.
  • Dodana podpora za navodila HRESET, UINTR in AVXVNNI, implementirana v nekaterih procesorjih, ki temeljijo na x86.
  • V sistemih x86 je omogočena podpora za možnost "-mtune=", ki omogoča izbrane mikroarhitekturne optimizacije ne glede na vrednost "-march=".
  • Statični analizator ima izboljšano obdelavo nekaterih funkcij POSIX in bistveno izboljšano določanje rezultata pogojnih operacij, ko je v primerjavi več simbolnih vrednosti. Dodana so nova preverjanja: fuchia.HandleChecker (definira ročice v strukturah), webkit.UncountedLambdaCapturesChecker webkit in alpha.webkit.UncountedLocalVarsChecker (upošteva posebnosti dela s kazalci v kodi motorja WebKit).
  • V izrazih, ki se uporabljajo v kontekstu konstant, je uporaba vgrajenih funkcij __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __bit_scan_reverse, __bsrd, __bsrq, __bswap, __bswapd , __bswap64, __ je dovoljeno bswapq , _castf*, __rol* in __ror*.
  • Dodana možnost BitFieldColonSpacing v pripomoček za formatiranje klana za izbiro razmika okoli identifikatorjev, stolpcev in definicij polj.
  • Strežnik za predpomnjenje clangd (Clang Server) na platformi Linux je znatno zmanjšal porabo pomnilnika med dolgotrajnim delovanjem (zagotovljeni so periodični klici malloc_trim za vrnitev prostih pomnilniških strani v operacijski sistem).

Ključne novosti v LLVM 12.0:

  • Podpora za orodje za gradnjo llvm-build, napisano v Pythonu, je bila ukinjena in namesto tega je projekt popolnoma prešel na uporabo sistema gradnje CMake.
  • V zaledju za arhitekturo AArch64 je bila izboljšana podpora za platformo Windows: zagotovljena je pravilna generacija izhoda asemblerja za ciljne sisteme Windows, generiranje podatkov o klicih sprostitve je bilo optimizirano (velikost teh podatkov je bila zmanjšana za 60 %), zmožnost ustvarjanja podatkov za odvijanje z uporabo asemblerja je bila dodana direktiva .seh_*.
  • Zaledje za arhitekturo PowerPC vključuje nove optimizacije za zanke in vgrajeno uvajanje, razširjeno podporo za procesorje Power10, dodano podporo za navodila MMA za manipulacijo matrike in izboljšano podporo za operacijski sistem AIX.
  • Zaledje x86 dodaja podporo za procesorje AMD Zen 3, Intel Alder Lake in Intel Sapphire Rapids ter procesorska navodila HRESET, UINTR in AVXVNNI. Podpora za MPX (razširitve za zaščito pomnilnika) za preverjanje kazalcev, da se zagotovi, da meje pomnilnika niso več podprte (ta tehnologija ni razširjena in je bila že odstranjena iz GCC in clang). Sestavljalniku je dodana podpora za predponi {disp32} in {disp8} ter priponi .d32 in .d8 za nadzor velikosti odmikov in skokov operanda. Dodan nov atribut "tune-cpu" za nadzor vključitve mikroarhitekturnih optimizacij.
  • Nov način »-fsanitize=unsigned-shift-base« je bil dodan detektorju težav s celimi števili (integer sanitizer, »-fsanitize=integer«) za zaznavanje prelivanja nepredznačenih celih števil po bitnem premiku v levo.
  • V različnih detektorjih (asan, cfi, lsan, msan, tsan, ubsan sanitizer) je dodana podpora za distribucije Linuxa s standardno knjižnico Musl.
  • Zmogljivosti povezovalnika LLD so bile razširjene. Izboljšana podpora za format ELF, vključno z dodanimi možnostmi »--dependency-file«, »-error-handling-script«, »-lto-psevdo-probe-for-profiling«, »-no-lto-whole-program -vidnost" " Izboljšana podpora MinGW. Za format Mach-O (macOS) je bila implementirana podpora za arhitekture arm64, arm in i386, optimizacije časa povezave (LTO) in odvijanje sklada za obravnavanje izjem.
  • Libc++ implementira nove funkcije standarda C++20 in je začel razvijati funkcije specifikacije C++2b. Dodana podpora za gradnjo z onemogočanjem lokalizacijske podpore (»-DLIBCXX_ENABLE_LOCALIZATION=OFF«) in naprave za generiranje psevdonaključnih števil (»-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF«).

Vir: opennet.ru

Dodaj komentar