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