Vydání sady kompilátorů LLVM 12.0

Po šesti měsících vývoje je představeno vydání projektu LLVM 12.0 - GCC kompatibilní toolkit (kompilátory, optimalizátory a generátory kódu), který kompiluje programy do středního bitového kódu virtuálních instrukcí podobných RISC (nízkoúrovňový virtuální stroj s víceúrovňový optimalizační systém). Vygenerovaný pseudokód je možné převést JIT kompilátorem na strojové instrukce přímo v době provádění programu.

Vylepšení v Clang 12.0:

  • Podpora atributů „pravděpodobný“ a „nepravděpodobný“ navržená ve standardu C++20 byla implementována a povolena ve výchozím nastavení, což umožňuje optimalizátoru získat informace o pravděpodobnosti spuštění podmíněného konstruktu (například „[[pravděpodobné ]] if (náhodné > 0) {“).
  • Přidána podpora pro procesory AMD Zen 3 (-march=znver3), Intel Alder Lake (-march=alderlake) a Intel Sapphire Rapids (-march=sapphirerapids).
  • Přidána podpora pro příznaky "-march=x86-64-v[234]" pro výběr úrovní architektury x86-64 (v2 - pokrývá rozšíření SSE4.2, SSSE3, POPCNT a CMPXCHG16B; v3 - AVX2 a MOVBE; v4 - AVX-512 ).
  • Přidána podpora pro procesory Arm Cortex-A78C (cortex-a78c), Arm Cortex-R82 (cortex-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) a Fujitsu A64FX (a64fx). Chcete-li například povolit optimalizace pro CPU Neoverse-V1, můžete zadat „-mcpu=neoverse-v1“.
  • Pro architekturu AArch64 byly přidány nové příznaky kompilátoru "-moutline-atomics" a "-mno-outline-atomics", které povolují nebo zakazují pomocné funkce atomických operací, jako je "__aarch64_cas8_relax". Tyto funkce zjišťují za běhu, zda je k dispozici podpora LSE (Large System Extensions), a používají poskytnuté instrukce atomového procesoru nebo se vrátí k použití instrukcí LL/SC (Load-link/store-conditional) pro synchronizaci.
  • Přidána možnost "-fbinutils-version" pro výběr cílové verze sady binutils pro kompatibilitu se starším chováním linkeru a assembleru.
  • Pro spustitelné soubory ELF, když je zadán příznak "-gz", je komprese ladicích informací pomocí knihovny zlib standardně povolena (gz=zlib). Propojení výsledných objektových souborů vyžaduje lld nebo GNU binutils 2.26+. Chcete-li obnovit kompatibilitu se staršími verzemi binutils, můžete zadat "-gz=zlib-gnu".
  • Ukazatel 'toto' je nyní zpracován s nenulovými a dereferenceable(N) kontrolami. Chcete-li odstranit atribut nonnull, když potřebujete použít hodnoty NULL, můžete použít volbu "-fdelete-null-pointer-checks".
  • Na platformě Linux je pro architektury AArch64 a PowerPC povolen režim "-fasynchronous-unwind-tables" pro generování tabulek volání unwind, jako v GCC.
  • V "#pragma clang loop vectorize_width" byla přidána možnost specifikovat možnosti "fixed" (výchozí) a "scalable" pro výběr metody vektorizace. „Škálovatelný“ režim, nezávislý na délce vektoru, je experimentální a lze jej použít na hardwaru, který podporuje škálovatelnou vektorizaci.
  • Vylepšená podpora pro platformu Windows: Byly připraveny oficiální binární sestavení pro Windows na systémech Arm64, včetně kompilátoru Clang, linkeru LLD a runtime knihoven kompilátoru-rt. Při vytváření pro cílové platformy MinGW je přidána přípona .exe, a to i při křížové kompilaci.
  • Možnosti spojené s podporou OpenCL, OpenMP a CUDA byly rozšířeny. Přidány volby "-cl-std=CL3.0" a "-cl-std=CL1.0" pro výběr voleb maker pro OpenCL 3.0 a OpenCL 1.0. Diagnostické nástroje byly rozšířeny.
  • Přidána podpora pro instrukce HRESET, UINTR a AVXVNNI implementované v některých procesorech založených na x86.
  • Na systémech x86 je povolena podpora pro volbu "-mtune=" ", který aktivuje vybrané mikroarchitektonické optimalizace bez ohledu na hodnotu "-march= "
  • Statický analyzátor zlepšil zpracování některých funkcí POSIX a výrazně zlepšilo určování výsledku podmíněných operací, když je v porovnání několik symbolických hodnot. Byly přidány nové kontroly: fuchia.HandleChecker (definuje úchyty ve strukturách), webkit.UncountedLambdaCapturesChecker a alpha.webkit.UncountedLocalVarsChecker (bere v úvahu zvláštnosti práce s ukazateli v kódu motoru WebKit).
  • Ve výrazech používaných v kontextu konstant je použití vestavěných funkcí __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __verse,_bs,_rbs,_verse,_rbs_reft bswapd, __bswap64, je povolen. __bswapq , _castf*, __rol* a __ror*.
  • Do nástroje clang-format byla přidána možnost BitFieldColonSpacing pro výběr mezer kolem identifikátorů, sloupců a definic polí.
  • Clangd caching server (Clang Server) na platformě Linux výrazně snížil spotřebu paměti během dlouhodobého provozu (periodická volání malloc_trim jsou poskytována pro návrat stránek volné paměti do operačního systému).

Klíčové inovace v LLVM 12.0:

  • Podpora pro sestavení nástroje llvm-build napsaného v Pythonu byla ukončena a místo toho projekt zcela přešel na použití systému sestavení CMake.
  • V backendu pro architekturu AArch64 byla vylepšena podpora platformy Windows: bylo zajištěno správné generování výstupu assembleru pro cílové systémy Windows, optimalizováno generování dat o unwind callech (velikost těchto dat byla zmenšena o 60 %), možnost vytvářet data odvíjení pomocí assembleru byla přidána direktivy .seh_*.
  • Backend pro architekturu PowerPC obsahuje nové optimalizace pro smyčky a inline nasazení, rozšířenou podporu pro procesory Power10, přidanou podporu instrukcí MMA pro manipulaci s maticí a vylepšenou podporu pro operační systém AIX.
  • Backend x86 přidává podporu pro procesory AMD Zen 3, Intel Alder Lake a Intel Sapphire Rapids a také instrukce procesorů HRESET, UINTR a AVXVNNI. Podpora pro MPX (Memory Protection Extensions) pro kontrolu ukazatelů, aby se zajistilo, že hranice paměti již nejsou podporovány (tato technologie není rozšířená a již byla odstraněna z GCC a clang). Do assembleru byla přidána podpora pro předpony {disp32} a {disp8} a přípony .d32 a .d8 pro řízení velikosti posunů a skoků operandů. Přidán nový atribut „tune-cpu“ pro řízení zahrnutí mikroarchitektonických optimalizací.
  • Nový režim „-fsanitize=unsigned-shift-base“ byl přidán do detektoru problémů s celými čísly (integer sanitizer, „-fsanitize=integer“) pro detekci přetečení celých čísel bez znaménka po bitovém posunu doleva.
  • V různých detektorech (asan, cfi, lsan, msan, tsan, ubsan sanitizer) byla přidána podpora linuxových distribucí se standardní knihovnou Musl.
  • Možnosti LLD linkeru byly rozšířeny. Vylepšená podpora pro formát ELF, včetně přidaných možností „--dependency-file“, „-error-handling-script“, „-lto-pseudo-probe-for-profiling“, „-no-lto-whole-program“ -viditelnost"" Vylepšená podpora MinGW. Pro formát Mach-O (macOS) byla implementována podpora architektur arm64, arm a i386, optimalizace doby propojení (LTO) a odvíjení zásobníku pro zpracování výjimek.
  • Libc++ implementuje nové funkce standardu C++20 a zahájil vývoj funkcí specifikace C++2b. Přidána podpora pro sestavení s deaktivací podpory lokalizace („-DLIBCXX_ENABLE_LOCALIZATION=OFF“) a zařízení pro generování pseudonáhodných čísel („-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF“).

Zdroj: opennet.ru

Přidat komentář