Release fan de LLVM 12.0-kompilersuite

Nei seis moannen fan ûntwikkeling waard de frijlitting fan it LLVM 12.0-projekt presintearre - in GCC-kompatibele toolkit (kompilers, optimizers en koadegenerators) dy't programma's kompilearret yn tuskenlizzende bitcode fan RISC-like firtuele ynstruksjes (in firtuele masine op leech nivo mei in multi-level optimalisaasje systeem). De oanmakke pseudokoade kin wurde omboud mei in JIT-kompiler yn masineynstruksjes direkt op it momint fan útfiering fan it programma.

Ferbetterings yn Clang 12.0:

  • Stipe foar de "wierskynlike" en "ûnwierskynlike" attributen foarsteld yn 'e C++20-standert is standert ymplementearre en ynskeakele, wêrtroch't de optimizer ynformearre wurde kin oer de kâns dat it betingsten konstrukt wurdt trigger (bygelyks, "[[wierskynlik) ]] if (willekeurich > 0) {“).
  • Stipe tafoege foar AMD Zen 3 (-march = znver3), Intel Alder Lake (-march = alderlake) en Intel Sapphire Rapids (-march = sapphirerapids) processors.
  • Stipe tafoege foar "-march=x86-64-v[234]" flaggen om x86-64-arsjitektuernivo's te selektearjen (v2 - beslacht SSE4.2, SSSE3, POPCNT en CMPXCHG16B-útwreidingen; v3 - AVX2 en MOVBE; v4 - AVX-512 ).
  • Stipe tafoege foar Arm Cortex-A78C (cortex-a78c), Arm Cortex-R82 (cortex-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) en Fujitsu A64FX (a64fx) processors. Bygelyks, om optimisaasjes foar Neoverse-V1 CPU's yn te skeakeljen, kinne jo "-mcpu=neoverse-v1" opjaan.
  • Foar de AArch64-arsjitektuer binne nije kompilerflaggen "-moutline-atomics" en "-mno-outline-atomics" tafoege om helpfunksjes foar atoomoperaasje yn te skeakeljen of út te skeakeljen, lykas "__aarch64_cas8_relax". Sokke funksjes detektearje by runtime oft LSE (Large System Extensions)-stipe beskikber is en brûke de levere atomêre prosessor-ynstruksjes of falle werom nei it brûken fan LL / SC (Laad-keppeling / winkel-betingsten) ynstruksjes foar syngronisaasje.
  • Added "-fbinutils-version" opsje om de doelferzje fan 'e binutils suite te selektearjen foar kompatibiliteit mei âldere linker- en assemblergedrach.
  • Foar ELF-útfierbere bestannen, as de flagge "-gz" is oantsjutte, is kompresje fan debuggenynformaasje mei de zlib-bibleteek standert ynskeakele (gz=zlib). It keppeljen fan de resultearjende objektbestannen fereasket lld of GNU binutils 2.26+. Om kompatibiliteit te herstellen mei âldere ferzjes fan binutils, kinne jo "-gz=zlib-gnu" opjaan.
  • De 'dit' oanwizer wurdt no ferwurke mei nonnull en dereferenceable (N) kontrôles. Om it nonnull-attribút te ferwiderjen as jo NULL-wearden brûke moatte, kinne jo de opsje "-fdelete-null-pointer-checks" brûke.
  • Op it Linux-platfoarm is de "-fasynchronous-unwind-tables" modus ynskeakele foar de AArch64- en PowerPC-arsjitektueren om oproptabellen te generearjen, lykas yn GCC.
  • Yn "#pragma clang loop vectorize_width" tafoege de mooglikheid om te spesifisearjen de "fêste" (standert) en "scalable" opsjes foar in selektearje de vectorization metoade. De "scalable" modus, ûnôfhinklik fan vector lingte, is eksperiminteel en kin brûkt wurde op hardware dy't stipet scalable vectorization.
  • Ferbettere stipe foar it Windows-platfoarm: Offisjele binêre gearkomsten foar Windows op Arm64-systemen binne taret, ynklusyf de Clang-kompiler, LLD-linker en kompilator-rt runtime-biblioteken. By it bouwen foar MinGW-doelplatfoarms wurdt it .exe-efterheaksel tafoege, sels by cross-compiling.
  • De mooglikheden ferbûn mei stipe foar OpenCL, OpenMP en CUDA binne útwreide. Opsjes tafoege "-cl-std = CL3.0" en "-cl-std = CL1.0" om makro-opsjes te selektearjen foar OpenCL 3.0 en OpenCL 1.0. Diagnostyske ark binne útwreide.
  • Stipe tafoege foar de HRESET-, UINTR- en AVXVNNI-ynstruksjes ymplementearre yn guon x86-basearre processors.
  • Op x86-systemen is stipe foar de opsje "-mtune=" ynskeakele, wêrtroch selektearre mikroarsjitektoanyske optimisaasjes nettsjinsteande de wearde "-march=" mooglik binne.
  • De statyske analysator hat ferbettere ferwurking fan guon POSIX-funksjes en signifikant ferbettere bepaling fan it resultaat fan betingsten operaasjes as d'r ferskate symboalyske wearden binne yn 'e fergeliking. Nije kontrôles binne tafoege: fuchia.HandleChecker (definiearret hannelingen yn struktueren), webkit.UncountedLambdaCapturesChecker webkit en alpha.webkit.UncountedLocalVarsChecker (nacht de eigenaardichheden fan wurkjen mei oanwizers yn 'e WebKit-motorkoade).
  • Yn útdrukkingen brûkt yn 'e kontekst fan konstanten, it brûken fan ynboude funksjes __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateleft*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __bit_scan_reverse, __bsr, __bsr, __bsr, __bsd, __bsd, __bsd, __bsd, __bsd, __bsd, __bsd, __bsd, __ is tastien bswapq , _castf*, __rol* en __ror*.
  • In BitFieldColonSpacing-opsje tafoege oan it clang-formaat-hulpprogramma om de ôfstân om identifiers, kolommen en fjilddefinysjes te selektearjen.
  • De clangd-caching-tsjinner (Clang Server) op it Linux-platfoarm hat it ûnthâldferbrûk signifikant fermindere tidens operaasje op lange termyn (periodike oproppen nei malloc_trim wurde levere om frije ûnthâldsiden werom te jaan nei it bestjoeringssysteem).

Wichtige ynnovaasjes yn LLVM 12.0:

  • Stipe foar it llvm-build build-ark dat skreaun is yn Python is stopset, en ynstee is it projekt folslein oergien op it brûken fan it CMake-buildsysteem.
  • Yn 'e efterkant foar de AArch64-arsjitektuer is stipe foar it Windows-platfoarm ferbettere: korrekte generaasje fan assembler-útfier foar doel Windows-systemen is garandearre, generaasje fan gegevens oer unwind-oproppen is optimalisearre (de grutte fan sokke gegevens is fermindere mei 60 %), de mooglikheid om te meitsjen unwind gegevens mei help fan assembler is tafoege rjochtlinen .seh_*.
  • De backend foar de PowerPC-arsjitektuer hat nije optimisaasjes foar loops en ynline-ynset, útwreide stipe foar Power10-processors, tafoege stipe foar MMA-ynstruksjes foar matrixmanipulaasje, en ferbettere stipe foar it AIX-bestjoeringssysteem.
  • De x86-backend foeget stipe ta foar AMD Zen 3, Intel Alder Lake en Intel Sapphire Rapids processors, lykas HRESET, UINTR en AVXVNNI prosessor ynstruksjes. Stipe foar MPX (Memory Protection Extensions) foar it kontrolearjen fan pointers om te soargjen dat ûnthâldgrinzen net mear wurde stipe (dizze technology is net wiidferspraat en is al fuortsmiten fan GCC en clang). Stipe tafoege oan de assembler foar de {disp32} en {disp8} foarheaksels en de .d32 en .d8 efterheaksels om de grutte fan operand-offsets en sprongen te kontrolearjen. In nij attribút "tune-cpu" tafoege om it opnimmen fan mikroarsjitektoanyske optimisaasjes te kontrolearjen.
  • In nije modus "-fsanitize = unsigned-shift-base" is tafoege oan de integer-probleemdetektor (integer-sanitizer, "-fsanitize = integer") om oerstreamingen fan net-ûndertekene heule getallen te detektearjen nei in bytsje ferskowing nei lofts.
  • Yn ferskate detektors (asan, cfi, lsan, msan, tsan, ubsan sanitizer) is stipe foar Linux-distribúsjes mei de standert Musl-bibleteek tafoege.
  • De mooglikheden fan 'e LLD-linker binne útwreide. Ferbettere stipe foar it ELF-formaat, ynklusyf de tafoege opsjes "--dependency-file", "-error-handling-script", "-lto-pseudo-probe-for-profiling", "-no-lto-whole-program -sichtberens" " Ferbettere MinGW-stipe. Foar it Mach-O-formaat (macOS) is stipe foar arm64-, arm- en i386-arsjitektueren, link-time-optimisaasjes (LTO), en stapelûntwikkeling foar útsûnderingshanneling ymplementearre.
  • Libc ++ ymplemintearret nije funksjes fan 'e C ++ 20-standert en is begon te ûntwikkeljen fan funksjes fan' e C ++ 2b-spesifikaasje. Stipe tafoege foar it bouwen mei it útskeakeljen fan lokalisaasjestipe ("-DLIBCXX_ENABLE_LOCALIZATION = OFF") en apparaten foar it generearjen fan pseudo-willekeurige nûmers ("-DLIBCXX_ENABLE_RANDOM_DEVICE = OFF").

Boarne: opennet.ru

Add a comment