Utgivelse av LLVM 12.0-kompilatorpakken

Etter seks måneders utvikling ble utgivelsen av LLVM 12.0-prosjektet presentert - et GCC-kompatibelt verktøysett (kompilatorer, optimerere og kodegeneratorer) som kompilerer programmer til mellombitkode av RISC-lignende virtuelle instruksjoner (en virtuell maskin på lavt nivå med en optimeringssystem på flere nivåer). Den genererte pseudokoden kan konverteres ved hjelp av en JIT-kompilator til maskininstruksjoner direkte på tidspunktet for programkjøring.

Forbedringer i Clang 12.0:

  • Støtte for attributtene "sannsynlig" og "usannsynlig" foreslått i C++20-standarden er implementert og aktivert som standard, slik at optimereren kan informeres om sannsynligheten for at den betingede konstruksjonen utløses (for eksempel "[[sannsynlig) ]] if (tilfeldig > 0) {“).
  • Lagt til støtte for AMD Zen 3 (-march=znver3), Intel Alder Lake (-march=alderlake) og Intel Sapphire Rapids (-march=sapphirerapids) prosessorer.
  • Lagt til støtte for "-march=x86-64-v[234]"-flagg for å velge x86-64-arkitekturnivåer (v2 - dekker SSE4.2, SSSE3, POPCNT og CMPXCHG16B utvidelser; v3 - AVX2 og MOVBE; v4 - AVX-512 ).
  • Lagt til støtte for Arm Cortex-A78C (cortex-a78c), Arm Cortex-R82 (cortex-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) og Fujitsu A64FX (a64fx) prosessorer. For å aktivere optimaliseringer for Neoverse-V1 CPUer, kan du for eksempel spesifisere "-mcpu=neoverse-v1".
  • For AArch64-arkitekturen er nye kompilatorflagg "-moutline-atomics" og "-mno-outline-atomics" lagt til for å aktivere eller deaktivere hjelpefunksjoner for atomoperasjoner, for eksempel "__aarch64_cas8_relax". Slike funksjoner oppdager ved kjøring om LSE (Large System Extensions)-støtte er tilgjengelig og bruker de medfølgende atomprosessorinstruksjonene eller faller tilbake til å bruke LL/SC (Load-link/store-conditional) instruksjoner for synkronisering.
  • Lagt til alternativet "-fbinutils-version" for å velge målversjonen av binutils-pakken for kompatibilitet med eldre linker- og assembler-atferd.
  • For kjørbare ELF-filer, når "-gz"-flagget er spesifisert, er komprimering av feilsøkingsinformasjon ved å bruke zlib-biblioteket aktivert som standard (gz=zlib). Kobling av de resulterende objektfilene krever lld eller GNU binutils 2.26+. For å gjenopprette kompatibilitet med eldre versjoner av binutils, kan du spesifisere "-gz=zlib-gnu".
  • 'Denne'-pekeren behandles nå med ikke-null og derefererbare(N) sjekker. For å fjerne nonnull-attributtet når du trenger å bruke NULL-verdier, kan du bruke alternativet "-fdelete-null-pointer-checks".
  • På Linux-plattformen er "-fasynchronous-unwind-tables"-modusen aktivert for AArch64- og PowerPC-arkitekturene for å generere avviklings-anropstabeller, som i GCC.
  • I "#pragma clang loop vectorize_width" la til muligheten til å spesifisere "fast" (standard) og "skalerbar" alternativer for å velge vektoriseringsmetoden. Den "skalerbare" modusen, uavhengig av vektorlengde, er eksperimentell og kan brukes på maskinvare som støtter skalerbar vektorisering.
  • Forbedret støtte for Windows-plattformen: Offisielle binære sammenstillinger for Windows på Arm64-systemer er utarbeidet, inkludert Clang-kompilatoren, LLD-linkeren og kompilator-rt-kjøretidsbibliotekene. Når du bygger for MinGW-målplattformer, blir .exe-suffikset lagt til, selv ved krysskompilering.
  • Mulighetene knyttet til støtte for OpenCL, OpenMP og CUDA er utvidet. Lagt til alternativene "-cl-std=CL3.0" og "-cl-std=CL1.0" for å velge makroalternativer for OpenCL 3.0 og OpenCL 1.0. Diagnoseverktøy er utvidet.
  • Lagt til støtte for HRESET-, UINTR- og AVXVNNI-instruksjonene implementert i noen x86-baserte prosessorer.
  • På x86-systemer er støtte for "-mtune="-alternativet aktivert, og aktiverer utvalgte mikroarkitektoniske optimaliseringer uavhengig av "-march="-verdien.
  • Den statiske analysatoren har forbedret behandling av noen POSIX-funksjoner og betydelig forbedret bestemmelse av resultatet av betingede operasjoner når det er flere symbolske verdier i sammenligningen. Nye sjekker er lagt til: fuchia.HandleChecker (definerer håndtak i strukturer), webkit.UncountedLambdaCapturesChecker webkit og alpha.webkit.UncountedLocalVarsChecker (tar hensyn til særegenhetene ved å jobbe med pekere i WebKit-motorkoden).
  • I uttrykk som brukes i kontekst av konstanter, bruk av innebygde funksjoner __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateleft*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __bit_scan_reverse, __bsrd,__bsrd,__bsrd,__bsr, __bsr, __bsr, __bsr __ er tillatt bswapq , _castf*, __rol* og __ror*.
  • Lagt til et BitFieldColonSpacing-alternativ til clang-formatverktøyet for å velge mellomrom rundt identifikatorer, kolonner og feltdefinisjoner.
  • Clangd-hurtigbufferserveren (Clang Server) på Linux-plattformen har betydelig redusert minneforbruk under langsiktig drift (periodiske anrop til malloc_trim er gitt for å returnere ledige minnesider til operativsystemet).

Nøkkelinnovasjoner i LLVM 12.0:

  • Støtte for llvm-build byggeverktøyet skrevet i Python har blitt avviklet, og i stedet har prosjektet gått fullstendig over til å bruke CMake byggesystem.
  • I backend for AArch64-arkitekturen har støtten for Windows-plattformen blitt forbedret: riktig generering av assembler-utdata for mål-Windows-systemer er sikret, generering av data om avvikling av samtaler er optimalisert (størrelsen på slike data er redusert med 60 %), muligheten til å lage avviklingsdata ved hjelp av assembler har blitt lagt til direktiver .seh_*.
  • Bakenden for PowerPC-arkitekturen har nye optimaliseringer for looper og inline-distribusjon, utvidet støtte for Power10-prosessorer, lagt til støtte for MMA-instruksjoner for matrisemanipulering og forbedret støtte for AIX-operativsystemet.
  • x86-backend legger til støtte for AMD Zen 3, Intel Alder Lake og Intel Sapphire Rapids-prosessorer, samt HRESET-, UINTR- og AVXVNNI-prosessorinstruksjoner. Støtte for MPX (Memory Protection Extensions) for å sjekke pekere for å sikre at minnegrenser ikke lenger støttes (denne teknologien er ikke utbredt og har allerede blitt fjernet fra GCC og klang). Lagt til støtte for assembler for {disp32} og {disp8} prefikser og .d32 og .d8 suffikser for å kontrollere størrelsen på operandforskyvninger og hopp. Lagt til et nytt attributt "tune-cpu" for å kontrollere inkluderingen av mikroarkitektoniske optimaliseringer.
  • En ny modus "-fsanitize=unsigned-shift-base" er lagt til heltallsproblemdetektoren (heltallsrenser, "-fsanitize=integer") for å oppdage overløp av usignerte heltall etter en bitforskyvning til venstre.
  • I ulike detektorer (asan, cfi, lsan, msan, tsan, ubsan sanitizer) er støtte for Linux-distribusjoner med standard Musl-biblioteket lagt til.
  • Mulighetene til LLD-linkeren har blitt utvidet. Forbedret støtte for ELF-formatet, inkludert de ekstra alternativene "--avhengighetsfil", "-feilhåndteringsskript", "-lto-pseudo-probe-for-profiling", "-no-lto-whole-program -synlighet" " Forbedret MinGW-støtte. For Mach-O-formatet (macOS) er støtte for arm64-, arm- og i386-arkitekturer, link-time-optimaliseringer (LTO) og stack-avvikling for unntakshåndtering implementert.
  • Libc++ implementerer nye funksjoner i C++20-standarden og har begynt utviklingen av funksjoner i C++2b-spesifikasjonen. Lagt til støtte for bygging med deaktivering av lokaliseringsstøtte (“-DLIBCXX_ENABLE_LOCALIZATION=OFF”) og enheter for generering av pseudo-tilfeldige tall (“-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF”).

Kilde: opennet.ru

Legg til en kommentar