Pas gjashtĂ« muajsh zhvillimi, u prezantua lĂ«shimi i projektit LLVM 12.0 â njĂ« mjet i pĂ«rputhshĂ«m me GCC (kompilerĂ«, optimizues dhe gjeneratorĂ« kodi), qĂ« kompilon programet nĂ« kodin ndĂ«rmjetĂ«s tĂ« instruksioneve virtuale tĂ« ngjashme me RISC (njĂ« makinĂ« virtuale me nivel tĂ« ulĂ«t me njĂ« sistem optimizimi me shumĂ« nivele). Kodi i gjeneruar mund tĂ« konvertohet pĂ«rmes JIT-kompilatorit nĂ« instruksione makinerike nĂ« momentin e ekzekutimit tĂ« programit.
Përmirësimet në Clang 12.0:
- ĂshtĂ« realizuar dhe pĂ«rfshirĂ« si parazgjedhje mbĂ«shtetje pĂ«r atributet e propozuara nĂ« standardin C++20 «likely» dhe «unlikely», qĂ« lejojnĂ« informimin e optimizuesit pĂ«r probabilitetin e funksionimit tĂ« njĂ« ndĂ«rtese kushtore (p.sh., «[[likely]] if (random > 0) {»).
- ĂshtĂ« shtuar mbĂ«shtetje pĂ«r procesorĂ«t AMD Zen 3 (-march=znver3), Intel Alder Lake (-march=alderlake) dhe Intel Sapphire Rapids (-march=sapphirerapids).
- ĂshtĂ« shtuar mbĂ«shtetje pĂ«r flagjet «-march=x86-64-v[234]» pĂ«r tĂ« zgjedhur nivelet e arkitekturĂ«s x86-64 (v2 â pĂ«rfshin zgjerimet SSE4.2, SSSE3, POPCNT dhe CMPXCHG16B; v3 â AVX2 dhe MOVBE; v4 â AVX-512).
- Shtuar mbështetje 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 Neoverse-V1 mund të specifikoni "-mcpu=neoverse-v1".
- Për arkitekturën AArch64 janë shtuar flamuj të rinj kompilatori "-moutline-atomics" dhe "-mno-outline-atomics", të destinuar për aktivizimin dhe çaktivizimin e funksioneve ndihmëse me implementime të operacioneve atomike, si "__aarch64_cas8_relax". Funksionet e tilla gjatë ekzekutimit përcaktojnë ekzistencën e mbështetjes për zgjerimet LSE (Large System Extensions) dhe përdorin instruksionet atomike të ofruara nga procesori ose rikthehen për të përdorur instruksionet LL/SC (Load-link/store-conditional) për sinkronizim.
- Shtuar opsioni "-fbinutils-version" për të zgjedhur versionin e synuar të paketës binutils për të siguruar kompatibilitet me sjelljen e vjetër të linker-it dhe assembler-it.
- Për skedarët ekzekutivë ELF, me përdorimin e flagut "-gz", kompresimi i informacionit të rindërtimit me bibliotekën zlib (gz=zlib) është aktivizuar si standard. Për lidhjen e skedarëve objekt të rezultatit kërkohet lld ose GNU binutils 2.26+. Për të rikthyer kompatibilitetin me versionet më të vjetra të binutils, mund të specifikohet "-gz=zlib-gnu".
- TĂ« dhĂ«nat âthisâ tani trajtohen me kontrollet nonnull dhe dereferenceable(N). PĂ«r tĂ« hequr atributin nonnull, kur Ă«shtĂ« e nevojshme tĂ« pĂ«rdoren vlerat NULL, mund tĂ« pĂ«rdoret opsioni "-fdelete-null-pointer-checks."
- Në platformën Linux për arkitekturën AArch64 dhe PowerPC është aktivizuar moda "-fasynchronous-unwind-tables" për të gjeneruar tabelat e thirrjeve "të përmbysura" (unwind), si në GCC.
- Në "#pragma clang loop vectorize_width" është shtuar mundësia për të specifikuar opsionet "fixed" (standard) dhe "scalable" për të zgjedhur metodën e vektorizimit. Moda "scalable", e cila është e pavarur nga gjatësi e vektorit, është eksperimentale dhe mund të përdoret në pajisje që mbështesin vektorizimin e zakonshëm.
- Përmirësuar mbështetje për platformën Windows: Janë përgatitur versione zyrtare binarësh për Windows në sistemet Arm64, duke përfshirë kompiluesin Clang, linkerin LLD dhe bibliotekat runtime compiler-rt. Gjatë ndërtimit për platforma të synuara MinGW, është realizuar shtimi i sufixit .exe, edhe në rastin e ndërtimit të kryqëzuar.
- Janë zgjeruar mundësitë lidhur me mbështetje për OpenCL, OpenMP dhe CUDA. Janë shtuar opsionet «-cl-std=CL3.0» dhe «-cl-std=CL1.0» për të zgjedhur variantet e makros për OpenCL 3.0 dhe OpenCL 1.0. Janë zgjeruar mjete diagnostike.
- Shtuar mbështetje për instrukcionet HRESET, UINTR dhe AVXVNNI, të realizuara në disa procesorë të bazuar në arktitekturën x86.
- Në sistemet x86 është përfshirë mbështetje për opsionin «-mtune=», që aktivizon optimizime mikroarkitekturale të zgjedhura, pavarësisht nga vlera «-march=».
- Në analizatorin statik, është përmirësuar trajtimi i disa funksioneve POSIX dhe është përmirësuar ndjeshëm përcaktimi i rezultatit të operacioneve kushtore kur krahasohen disa vlera karakteresh. Janë shtuar verifikime të reja: fuchia.HandleChecker (përcakton deshkruesit në struktura), webkit.UncountedLambdaCapturesChecker dhe alpha.webkit.UncountedLocalVarsChecker (marrin parasysh veçoritë e punës me treguesit në kodin e motorit WebKit).
- Në shprehjet që përdoren në kontekstin e constanteve, lejohet përdorimi i funksioneve të ndërtuara __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, __bit_scan_forward, __bsfd, __bsfq, __bit_scan_reverse, __bsrd, __bsrq, __bswap, __bswapd, __bswap64, __bswapq, _castf*, __rol* dhe __ror*.
- Në utilitarin clang-format është shtuar opsioni BitFieldColonSpacing për të zgjedhur vendosjen e hapësirave rreth identifikuesve, kolonave dhe përcaktimeve të fushave.
- Në sistemin e njohurive serveri clangd (Shërbimi Clang) në platformën Linux ka zvogëluar ndjeshëm konsumimin e memories gjatë punës së gjatë (sigurohet thirrja periodike e malloc_trim për të lëshuar faqet e lira të memories te sistemi operativ).
Njohuritë kryesore të LLVM 12.0:
- Ndalimi i mbështetjes për mjetin e ndërtimit llvm-build të shkruar në gjuhën Python, në vend të tij projekti ka kaluar plotësisht në përdorimin e sistemit të ndërtimit CMake.
- Në backend për arkitekturën AArch64 është përmirësuar mbështetje për platformën Windows: është siguruar gjenerimi i saktë i daljes së assemblerit për sistemet target Windows, është optimizuar gjenerimi i të dhënave për "unwind" të thirrjeve (prakisht madhësia e këtyre të dhënave është reduktuar me 60%), është shtuar mundësia për të krijuar të dhëna unwind përmes drejtimeve assembler .seh_*.
- Në backend për arkitekturën PowerPC janë realizuar optimizime të reja për ciklet dhe zhvillimin inline, është zgjeruar mbështetje për procesorët Power10, është shtuar mbështetje për instruktionet MMA për manipulimin e matricave, është përmirësuar mbështetje për sistemin operativ AIX.
- NĂ« backend pĂ«r arkitekturĂ«n x86, Ă«shtĂ« shtuar mbĂ«shtetje pĂ«r procesorĂ«t AMD Zen 3, Intel Alder Lake dhe Intel Sapphire Rapids, si dhe pĂ«r instrukcionet e procesorĂ«ve HRESET, UINTR dhe AVXVNNI. ĂshtĂ« ndalur mbĂ«shtetje pĂ«r zgjerimet MPX (Memory Protection Extensions) pĂ«r verifikimin e treguesve nĂ« respektimin e kufijve tĂ« hapĂ«sirĂ«s sĂ« memories (kjo teknologji nuk fitoi popullaritet dhe tashmĂ« Ă«shtĂ« hequr nga GCC dhe clang). NĂ« assembler Ă«shtĂ« shtuar mbĂ«shtetje pĂ«r prefiksin {disp32} dhe {disp8} si dhe sufixet .d32 dhe .d8 pĂ«r tĂ« menaxhuar madhĂ«sinĂ« e zhvendosjeve tĂ« operandĂ«ve dhe skenave. ĂshtĂ« shtuar njĂ« atribut i ri 'tune-cpu' pĂ«r tĂ« menaxhuar pĂ«rfshirjen e optimizimeve mikroarkitektonike.
- Në detektorin e problemeve për punën me numra të tërë (integer sanitizer, '-fsanitize=integer'), është shtuar një mod të ri '-fsanitize=unsigned-shift-base' për identifikimin e mbingarkesave të numrave të plotë të padiskutueshëm pas zhvendosjes së bitit të majtë.
- Në detektorë të ndryshëm (asan, cfi, lsan, msan, tsan, ubsan sanitizer) është shtuar mbështetje për shpërndarjet Linux me bibliotekën standarde Musl.
- JanĂ« zgjeruar mjetet e ndĂ«rtimit tĂ« LLD. ĂshtĂ« pĂ«rmirĂ«suar mbĂ«shtetje pĂ«r formatin ELF, duke pĂ«rfshirĂ« opsionet "âdependency-file", "âerror-handling-script", "âlto-pseudo-probe-for-profiling", "âno-lto-whole-program-visibility". ĂshtĂ« pĂ«rmirĂ«suar mbĂ«shtetje pĂ«r MinGW. PĂ«r formatin Mach-O (macOS), Ă«shtĂ« realizuar mbĂ«shtetje pĂ«r arkitekturĂ«n arm64, arm dhe i386, optimizimeve nĂ« fazĂ«n e lidhjes (LTO) dhe rikthimin e stack-ut gjatĂ« trajtimit tĂ« pĂ«rjashtimeve.
- NĂ« Libc++ janĂ« realizuar mundĂ«si tĂ« reja tĂ« standardit C++20 dhe ka filluar zhvillimi i mundĂ«sive tĂ« specifikimit C++2b. ĂshtĂ« shtuar mbĂ«shtetje pĂ«r ndĂ«rtim pa mbĂ«shtetje pĂ«r lokalizimin ("-DLIBCXX_ENABLE_LOCALIZATION=OFF") dhe pajisje pĂ«r gjenerimin e numrave pseudo-rastĂ«sorĂ« ("-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF").
Burimi: opennet.ru
