Release av LLVM 12.0-kompilatorpaketet

Efter sex månaders utveckling presenterades lanseringen av LLVM 12.0-projektet - en GCC-kompatibel verktygslåda (kompilatorer, optimerare och kodgeneratorer) som kompilerar program till mellanliggande bitkod av RISC-liknande virtuella instruktioner (en virtuell maskin på låg nivå med en optimeringssystem på flera nivåer). Den genererade pseudokoden kan konverteras med hjälp av en JIT-kompilator till maskininstruktioner direkt vid tidpunkten för programexekveringen.

Förbättringar i Clang 12.0:

  • Stöd för attributen "sannolikt" och "osannolikt" som föreslagits i C++20-standarden har implementerats och aktiverats som standard, vilket gör att optimeraren kan informeras om sannolikheten för att den villkorliga konstruktionen utlöses (till exempel "[[sannolikt) ]] om (slumpmässigt > 0) {“).
  • Lade till stöd för AMD Zen 3 (-march=znver3), Intel Alder Lake (-march=alderlake) och Intel Sapphire Rapids (-march=sapphirerapids) processorer.
  • Lade till stöd för "-march=x86-64-v[234]"-flaggor för att välja x86-64-arkitekturnivåer (v2 - täcker SSE4.2, SSSE3, POPCNT och CMPXCHG16B tillägg; v3 - AVX2 och MOVBE; v4 - AVX-512 ) .
  • Lade till stöd för Arm Cortex-A78C (cortex-a78c), Arm Cortex-R82 (cortex-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) och Fujitsu A64FX (a64fx) processorer. Till exempel, för att aktivera optimeringar för Neoverse-V1-processorer, kan du ange "-mcpu=neoverse-v1".
  • För AArch64-arkitekturen har nya kompilatorflaggor "-moutline-atomics" och "-mno-outline-atomics" lagts till för att aktivera eller inaktivera hjälpfunktioner för atomoperationer, såsom "__aarch64_cas8_relax". Sådana funktioner upptäcker vid körning om LSE-stöd (Large System Extensions) är tillgängligt och använder de medföljande atomprocessorinstruktionerna eller faller tillbaka till att använda LL/SC-instruktioner (Load-link/store-conditional) för synkronisering.
  • Lade till alternativet "-fbinutils-version" för att välja målversionen av binutils-sviten för kompatibilitet med äldre länk- och assemblerbeteende.
  • För körbara ELF-filer, när "-gz"-flaggan är specificerad, är komprimering av felsökningsinformation med hjälp av zlib-biblioteket aktiverad som standard (gz=zlib). Att länka de resulterande objektfilerna kräver lld eller GNU binutils 2.26+. För att återställa kompatibiliteten med äldre versioner av binutils kan du ange "-gz=zlib-gnu".
  • "den här"-pekaren bearbetas nu med icke-null och dereferenceable(N) kontroller. För att ta bort nonnull-attributet när du behöver använda NULL-värden, kan du använda alternativet "-fdelete-null-pointer-checks".
  • På Linux-plattformen är "-fasynchronous-unwind-tables"-läget aktiverat för AArch64- och PowerPC-arkitekturerna för att generera unwind-anropstabeller, som i GCC.
  • I "#pragma clang loop vectorize_width" lades till möjligheten att ange de "fixade" (standard) och "skalbara" alternativen för att välja vektoriseringsmetoden. Det "skalbara" läget, oberoende av vektorlängd, är experimentellt och kan användas på hårdvara som stöder skalbar vektorisering.
  • Förbättrat stöd för Windows-plattformen: Officiella binära sammansättningar för Windows på Arm64-system har förberetts, inklusive Clang-kompilatorn, LLD-linker och compiler-rt runtime-bibliotek. När man bygger för MinGW-målplattformar läggs .exe-suffixet till, även vid korskompilering.
  • Möjligheterna förknippade med stöd för OpenCL, OpenMP och CUDA har utökats. Lade till alternativ "-cl-std=CL3.0" och "-cl-std=CL1.0" för att välja makroalternativ för OpenCL 3.0 och OpenCL 1.0. Diagnostiska verktyg har utökats.
  • Lade till stöd för instruktionerna HRESET, UINTR och AVXVNNI implementerade i vissa x86-baserade processorer.
  • På x86-system är stöd för alternativet "-mtune=" aktiverat ", som aktiverar de valda mikroarkitektoniska optimeringarna, oavsett värdet på "-march= "
  • Den statiska analysatorn har förbättrad bearbetning av vissa POSIX-funktioner och avsevärt förbättrad bestämning av resultatet av villkorliga operationer när det finns flera symboliska värden i jämförelsen. Nya kontroller har lagts till: fuchia.HandleChecker (definierar handtag i strukturer), webkit.UncountedLambdaCapturesChecker webkit och alpha.webkit.UncountedLocalVarsChecker (tar hänsyn till särdragen med att arbeta med pekare i WebKit-motorkoden).
  • I uttryck som används i sammanhang med konstanter, användningen av de inbyggda funktionerna __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateleft*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __bit_scan_reverse, __bsrd, __bsrd, __bsrd, __bsrd, __bsrd, __bsrd, __bsr , är tillåtet. __bswapq , _castf*, __rol* och __ror*.
  • Lade till ett BitFieldColonSpacing-alternativ till verktyget clang-format för att välja mellanrum runt identifierare, kolumner och fältdefinitioner.
  • Clangd-cacheservern (Clang Server) på Linux-plattformen har avsevärt minskat minnesförbrukningen under långvarig drift (periodiska anrop till malloc_trim tillhandahålls för att returnera lediga minnessidor till operativsystemet).

Viktiga innovationer i LLVM 12.0:

  • Stödet för byggverktyget llvm-build skrivet i Python har upphört, och istället har projektet helt gått över till att använda byggsystemet CMake.
  • I backend för AArch64-arkitekturen har stödet för Windows-plattformen förbättrats: korrekt generering av assembler-utdata för mål-Windows-system har säkerställts, generering av data om avvecklingssamtal har optimerats (storleken på sådan data har minskat med 60 %), möjligheten att skapa avvecklingsdata med hjälp av assembler har lagts till direktiv .seh_*.
  • Backend för PowerPC-arkitekturen har nya optimeringar för loopar och inline-distribution, utökat stöd för Power10-processorer, extra stöd för MMA-instruktioner för matrismanipulation och förbättrat stöd för AIX-operativsystemet.
  • x86-backend lägger till stöd för AMD Zen 3, Intel Alder Lake och Intel Sapphire Rapids-processorer, samt HRESET-, UINTR- och AVXVNNI-processorinstruktioner. Stöd för MPX (Memory Protection Extensions) för att kontrollera pekare för att säkerställa att minnesgränser inte längre stöds (denna teknik är inte utbredd och har redan tagits bort från GCC och clang). Lade till stöd för assemblern för prefixen {disp32} och {disp8} och suffixen .d32 och .d8 för att kontrollera storleken på operandförskjutningar och hopp. Lade till ett nytt attribut "tune-cpu" för att kontrollera inkluderingen av mikroarkitektoniska optimeringar.
  • Ett nytt läge "-fsanitize=unsigned-shift-base" har lagts till i heltalsproblemdetektorn (heltalssanering, "-fsanitize=integer") för att upptäcka överflöden av osignerade heltal efter en bitförskjutning åt vänster.
  • I olika detektorer (asan, cfi, lsan, msan, tsan, ubsan sanitizer) har stöd för Linux-distributioner med standard Musl-biblioteket lagts till.
  • Förmågan hos LLD-linkern har utökats. Förbättrat stöd för ELF-formatet, inklusive de tillagda alternativen "--beroende-fil", "-felhanteringsskript", "-lto-pseudo-probe-for-profiling", "-no-lto-whole-program -synlighet" " Förbättrat MinGW-stöd. För Mach-O-formatet (macOS) har stöd för arm64-, arm- och i386-arkitekturer, länktidsoptimering (LTO) och stack-avveckling för undantagshantering implementerats.
  • Libc++ implementerar nya funktioner i C++20-standarden och har börjat utveckla funktioner i C++2b-specifikationen. Lade till stöd för att bygga med inaktiverande lokaliseringsstöd (“-DLIBCXX_ENABLE_LOCALIZATION=OFF”) och enheter för att generera pseudoslumptal (“-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF”).

Källa: opennet.ru

Lägg en kommentar