Lëshimi i paketës së përpiluesit LLVM 12.0

Pas gjashtë muajsh zhvillimi, prezantohet publikimi i projektit LLVM 12.0 - një paketë veglash e pajtueshme me GCC (përpiluesit, optimizuesit dhe gjeneruesit e kodeve) që përpilon programet në një bitkod të ndërmjetëm të udhëzimeve virtuale të ngjashme me RISC (një makinë virtuale e nivelit të ulët me një sistem optimizimi me shumë nivele). Pseudokodi i gjeneruar mund të konvertohet nga përpiluesi JIT në udhëzime të makinës pikërisht në momentin e ekzekutimit të programit.

Përmirësime në Clang 12.0:

  • Mbështetja për atributet "të mundshme" dhe "të pamundura" të propozuara në standardin C++20 është zbatuar dhe aktivizuar si parazgjedhje, duke lejuar optimizuesin të informohet rreth probabilitetit që konstrukti i kushtëzuar të aktivizohet (për shembull, "[[ka gjasa ]] nëse (të rastësishme > 0) {“).
  • Mbështetje e shtuar për procesorët AMD Zen 3 (-marsh=znver3), Intel Alder Lake (-marsh=alderlake) dhe Intel Sapphire Rapids (-marsh=sapphirerapids).
  • Mbështetje e shtuar për flamujt "-marsh=x86-64-v[234]" për të zgjedhur nivelet e arkitekturës x86-64 (v2 - mbulon shtesat SSE4.2, SSSE3, POPCNT dhe CMPXCHG16B; v3 - AVX2 dhe MOVBE; v4 - AVX-512 ) .
  • Mbështetje e shtuar për procesorët Arm Cortex-A78C (cortex-a78c), Arm Cortex-R82 (cortex-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) dhe Fujitsu A64FX (a64fx). Për shembull, për të aktivizuar optimizimet për CPU-të Neoverse-V1, mund të specifikoni "-mcpu=neoverse-v1".
  • Për arkitekturën AArch64, flamujt e rinj të përpiluesit "-moutline-atomics" dhe "-mno-outline-atomics" janë shtuar për të aktivizuar ose çaktivizuar funksionet ndihmëse të funksionimit atomik, të tilla si "__aarch64_cas8_relax". Funksione të tilla zbulojnë në kohën e ekzekutimit nëse mbështetja LSE (Zgjerime të mëdha të sistemit) është e disponueshme dhe përdorin udhëzimet e dhëna të procesorit atomik ose kthehen në përdorimin e udhëzimeve LL/SC (Load-link/store-conditional) për sinkronizim.
  • U shtua opsioni "-fbinutils-version" për të zgjedhur versionin e synuar të grupit binutils për përputhshmëri me lidhjen më të vjetër dhe sjelljen e montimit.
  • Për skedarët e ekzekutueshëm ELF, kur specifikohet flamuri "-gz", ngjeshja e informacionit të korrigjimit duke përdorur bibliotekën zlib aktivizohet si parazgjedhje (gz=zlib). Lidhja e skedarëve të objekteve që rezultojnë kërkon lld ose GNU binutils 2.26+. Për të rivendosur përputhshmërinë me versionet më të vjetra të binutils, mund të specifikoni "-gz=zlib-gnu".
  • Treguesi 'ky' tani përpunohet me kontrolle jonull dhe të çreferencueshme (N). Për të hequr atributin nonnull kur duhet të përdorni vlera NULL, mund të përdorni opsionin "-fdelete-null-pointer-checks".
  • Në platformën Linux, modaliteti "-fasynchronous-unwind-tables" është i aktivizuar për arkitekturat AArch64 dhe PowerPC për të gjeneruar tabela të thirrjeve unwind, si në GCC.
  • Në "#pragma clang loop vectorize_width" shtoi aftësinë për të specifikuar opsionet "fikse" (default) dhe "të shkallëzueshme" për të zgjedhur metodën e vektorizimit. Modaliteti "i shkallëzuar", i pavarur nga gjatësia e vektorit, është eksperimental dhe mund të përdoret në pajisje që mbështesin vektorizimin e shkallëzuar.
  • Mbështetje e përmirësuar për platformën Windows: Asambletë zyrtare binare për Windows në sistemet Arm64 janë përgatitur, duke përfshirë përpiluesin Clang, lidhjen LLD dhe bibliotekat e ekzekutimit të përpiluesit-rt. Kur ndërtohet për platformat e synuara MinGW, shtohet prapashtesa .exe, edhe kur bëhet ndër-përpilimi.
  • Aftësitë që lidhen me mbështetjen për OpenCL, OpenMP dhe CUDA janë zgjeruar. U shtuan opsionet "-cl-std=CL3.0" dhe "-cl-std=CL1.0" për të zgjedhur opsionet makro për OpenCL 3.0 dhe OpenCL 1.0. Mjetet diagnostikuese janë zgjeruar.
  • Mbështetje e shtuar për udhëzimet HRESET, UINTR dhe AVXVNNI të zbatuara në disa procesorë të bazuar në x86.
  • Në sistemet x86, mbështetja për opsionin "-mtune=" është aktivizuar ", e cila aktivizon optimizimet e zgjedhura mikroarkitekturore, pavarësisht nga vlera e "-marsh= "
  • Analizatori statik ka përmirësuar përpunimin e disa funksioneve POSIX dhe ka përmirësuar ndjeshëm përcaktimin e rezultatit të operacioneve të kushtëzuara kur ka disa vlera simbolike në krahasim. Janë shtuar kontrolle të reja: fuchia.HandleChecker (përcakton dorezat në struktura), webkit.UncountedLambdaCapturesChecker uebkit dhe alpha.webkit.UncountedLocalVarsChecker (merr parasysh veçoritë e punës me tregues në kodin e motorit WebKit).
  • Në shprehjet e përdorura në kontekstin e konstanteve, përdorimi i funksioneve të integruara __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __bit_scan_bitreverse, __bit_scan_reverse, _bsd_wap , lejohet __bswapq , _castf*, __rol* dhe __ror*.
  • Shtoi një opsion BitFieldColonSpacing në mjetin e formatit clang për të zgjedhur hapësirën rreth identifikuesve, kolonave dhe përcaktimeve të fushave.
  • Serveri clangd caching (Clang Server) në platformën Linux ka reduktuar ndjeshëm konsumin e memories gjatë funksionimit afatgjatë (ofrohen thirrje periodike drejt malloc_trim për të kthyer faqet e memories pa pagesë në sistemin operativ).

Risitë kryesore në LLVM 12.0:

  • Mbështetja për mjetin e ndërtimit llvm-build të shkruar në Python është ndërprerë, dhe në vend të kësaj projekti ka kaluar plotësisht në përdorimin e sistemit të ndërtimit CMake.
  • Në backend për arkitekturën AArch64, mbështetja për platformën Windows është përmirësuar: është siguruar gjenerimi i saktë i daljes së montimit për sistemet Windows të synuar, gjenerimi i të dhënave për thirrjet unwind është optimizuar (madhësia e të dhënave të tilla është zvogëluar me 60 %), aftësisë për të krijuar të dhëna unwind duke përdorur assembler janë shtuar direktivat .seh_*.
  • Backend-i për arkitekturën PowerPC përmban optimizime të reja për unazat dhe vendosjen inline, mbështetje të zgjeruar për procesorët Power10, mbështetje të shtuar për udhëzimet MMA për manipulimin e matricës dhe mbështetje të përmirësuar për sistemin operativ AIX.
  • Backend-i x86 shton mbështetje për procesorët AMD Zen 3, Intel Alder Lake dhe Intel Sapphire Rapids, si dhe udhëzimet për procesorët HRESET, UINTR dhe AVXVNNI. Mbështetje për MPX (Memory Protection Extensions) për kontrollimin e treguesve për të siguruar që kufijtë e memories nuk mbështeten më (kjo teknologji nuk është e përhapur dhe tashmë është hequr nga GCC dhe tingëllima). Mbështetja e shtuar për assembler-in për prefikset {disp32} dhe {disp8} dhe prapashtesat .d32 dhe .d8 për të kontrolluar madhësinë e zhvendosjeve dhe kërcimeve të operandit. U shtua një atribut i ri "tune-cpu" për të kontrolluar përfshirjen e optimizimeve mikroarkitekturore.
  • Një modalitet i ri "-fsanitize=unsigned-shift-base" është shtuar në detektorin e problemit të numrit të plotë (sanitizer i numrave të plotë, "-fsanitize=integer") për të zbuluar tejmbushjet e numrave të plotë të panënshkruar pas një zhvendosjeje pak majtas.
  • Në detektorë të ndryshëm (asan, cfi, lsan, msan, tsan, ubsan sanitizer) është shtuar mbështetja për shpërndarjet Linux me bibliotekën standarde Musl.
  • Aftësitë e lidhësit LLD janë zgjeruar. Mbështetje e përmirësuar për formatin ELF, duke përfshirë opsionet e shtuara "--dependency-file", "-error-handling-script", "-lto-pseudo-probe-for-profiling", "-no-lto-whole-program" -dukshmëri”” Mbështetja e përmirësuar e MinGW. Për formatin Mach-O (macOS), është zbatuar mbështetja për arkitekturat arm64, arm dhe i386, optimizimet në kohën e lidhjes (LTO) dhe shthurja e stivës për trajtimin e përjashtimeve.
  • Libc++ implementon veçori të reja të standardit C++20 dhe ka filluar zhvillimin e veçorive të specifikimit C++2b. Mbështetje e shtuar për ndërtimin me mbështetjen e lokalizimit çaktivizues (“-DLIBCXX_ENABLE_LOCALIZATION=OFF”) dhe pajisje për gjenerimin e numrave pseudo të rastësishëm (“-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF”).

Burimi: opennet.ru

Shto një koment