PasĂ« gjashtĂ« muajsh zhvillimi, u publikua lĂ«shimi i projektit LLVM 16.0 â njĂ« mjet qĂ« Ă«shtĂ« kompatibil me GCC (kompilatorĂ«t, optimizuesit dhe gjeneruesit e kodit), i cili kompilon programe nĂ« kodin e mesĂ«m RISC-pĂ«rshtatĂ«se tĂ« instruksioneve virtuale (njĂ« makinĂ« virtuale me nivele tĂ« shumta optimizimi). Pseudokodi i gjeneruar mund tĂ« konvertohet me ndihmĂ«n e JIT-kompilatorit nĂ« instruksione makinerie nĂ« momentin e ekzekutimit tĂ« programit.
Përmirësimet kryesore në Clang 16.0:
- Standarti i përdorur si standard i paracaktuar për C++/ObjC++ është vendosur në gnu++17 (më parë është përdorur gnu++14), që nënkupton përkrahjen e mundësive të C++17 me zgjerime GNU. Për të kthyer sjelljen e mëparshme, mund të përdoret opsioni "-std=gnu++14".
- Janë implementuar mundësi të zgjeruara që lidhen me standardin C++20:
- Funksionet speciale që janë kushtimisht triviale,
- kapja e lidhjeve të strukturuara në funksionet lambda,
- Operatori i barazisë brenda shprehjeve,
- Mundësia për të mos e specifikuar fjalën kyçe typename në disa kontekste,
- Lejueshmëria e inicializimit të agreguara në klllufat ("Aggr(val1, val2)").
- Janë implementuar mundësi të përcaktuara në standardin e ardhshëm C++2b:
- Lejohet vendosja e etiketave në fund të shprehjeve përbërëse,
- static operator(),
- static operator[],
- Sigurohet përputhshmëria me tipin char8_t,
- Zgjeruar gamĂ«n e simboleve qĂ« lejohen pĂ«r t'u pĂ«rdorur nĂ« "\N{âŠ}",
- Shtuar mundësia e përdorimit të variablave të shpallura si "static constexpr" në funksionet e shpallura si constexpr.
- Janë implementuar mundësi të përcaktuara në standardin e ardhshëm të C-së, C2x:
- Për të çaktivizuar paralajmërimin "-Wunused-label", është lejuar përdorimi i atributit "[[maybe_unused]]" për etiketat,
- Lejohet vendosja e etiketave në çdo vend brenda shprehjeve përbërëse,
- Shtuar operatorët typeof dhe typeof_unqual,
- Një tip i ri nullptr_t dhe konstante nullptr për të përcaktuar tregues të null, i cili mund të konvertohet në çdo tip tregues dhe të përfaqësojë variantin NULL, i cili nuk është i lidhur me tipat e numrave të plotë dhe tipin void*.
- Në modalitetin C2x, lejohet thirrja e makros va_start me numër variativ argumetesh.
- Në modet e përputhshmërisë me standardet C99, C11 dhe C17, opsionet "-Wimplicit-function-declaration" dhe "-Wimplicit-int" tani, sipas parazgjedhjes, japin një gabim në përputhje me një paralajmërim.
- Përdorimi i drejtpërdrejtë të "void *" (p.sh., "void func(void *p) { *p; }") në modën C++ tani çon në gjenerimin e gabimeve, ashtu si në ISO C++, GCC, ICC dhe MSVC.
- Shënimin e fushave të bitëve si operandë të instruksioneve (p.sh., "__asm { mov eax, s.bf }") në blloqet inline të asamblesë në stilin Microsoft tani çon në gjenerimin e gabimeve.
- Shtuar diagnozën për praninë e strukturave dhe sindikatave të ndryshme me emra të njëjtë në module të ndryshme.
- Mundësitë që lidhen me mbështetjej OpenCL dhe OpenMP janë zgjeruar. Diagnoza e shabloneve C++ në argumentet e bërthamës OpenCL është përmirësuar. Mbështetje më e mirë për bllokun e zëvendësimit në radhë për AMDGPU. Të gjitha funksionet tani kanë përfshirë automatikisht atributin nounwind. Mbështetje më e mirë për funksionet e ndërtuara.
- Shtuar mundësia e përdorimit të variablës mjedisore CLANG_CRASH_DIAGNOSTICS_DIR për të përcaktuar dosjen në të cilën ruhen të dhënat diagnostikuese për ndërprerjet e papritura.
- MbĂ«shtetje pĂ«r Unicode Ă«shtĂ« azhurnuar nĂ« specifikimin Unicode 15.0. Lejohet pĂ«rdorimi i disa simboleve matematike nĂ« identifikues, si "â" (p.sh., "double xâââ").
- Shtuar mbĂ«shtetje pĂ«r ngarkimin e disa skedave konfigurimi (sĂ« pari ngarkohen skedat e konfigurimit tĂ« parazgjedhura, pastaj ato tĂ« pĂ«rcaktuara pĂ«rmes flamurit "âconfig=", i cili tani mund tĂ« specifikohet disa herĂ«). Renditja e ngarkimit tĂ« skedave tĂ« konfigurimit tĂ« parazgjedhura Ă«shtĂ« ndryshuar: clang pĂ«rpiqet sĂ« pari tĂ« ngarkojĂ« skedarin -.cfg, dhe nĂ«se nuk gjendet pĂ«rpiqet tĂ« ngarkojĂ« dy skeda .cfg dhe .cfg. PĂ«r tĂ« çaktivizuar ngarkimin e skedave tĂ« konfigurimit tĂ« parazgjedhura Ă«shtĂ« shtuar flamuri "âno-default-config."
- Për të siguruar ndërtime të përsëritshme, është shtuar mundësia për të zëvendësuar vlerat e datës dhe orës aktuale në makros __DATE__, __TIME__ dhe __TIMESTAMP__ me kohën e caktuar në variablën mjedisore SOURCE_DATE_EPOCH.
- Për të kontrolluar nëse funksionet e ndërtuara (builtin) që mund të përdoren në kontekstin e konstantave janë të pranishme, është shtuar makros "__has_constexpr_builtin".
- Shtuar një flamur të ri të kompilimit "-fcoro-aligned-allocation" për shpërndarjen e përputhshme të kornizave të kooperacionit.
- Në flamurin "-fstrict-flex-arrays=", është implementuar mbështetje e nivelit të tretë për verifikimin e elementit fleksibël të masës në struktura (Flexible Array Members, një masë me madhësi të paqartë në fund të strukturës). Në nivelin e tretë, vetëm madhësia "[]" (p.sh., "int b[]") përpunohen si një masë fleksibile, ndërsa madhësia "[0]" (p.sh., "int b[0]") nuk trajtohet si e tillë.
- ĂshtĂ« shtuar flagu «-fmodule-output» pĂ«r tĂ« aktivizuar modelin e njĂ«fazshĂ«m tĂ« pĂ«rmbledhjes pĂ«r modulat standarde C++.
- ĂshtĂ« shtuar rethi «-Rpass-analysis=stack-frame-layout», i cili lejon diagnostikimin e problemeve me renditjen e kuadrove tĂ« stack.
- ĂshtĂ« shtuar njĂ« atribut i ri __attribute__((target_version(«cpu_features»))) dhe Ă«shtĂ« zgjeruar funksionaliteti i atributit __attribute__((target_clones(«cpu_features1âł,»cpu_features2»,âŠ))) pĂ«r tĂ« zgjedhur versione specifike tĂ« funksioneve qĂ« ofrohen nga CPU AArch64.
- Janë zgjeruar mjetet e diagnostikimit:
- ĂshtĂ« shtuar njĂ« paralajmĂ«rim «-Wsingle-bit-bitfield-constant-conversion» pĂ«r tĂ« identifikuar truncatimin implicit kur caktohet njĂ« nĂ« njĂ« fushĂ« bital njĂ«bit.
- Janë zgjeruar diagnostikimet për variablat constexpr të pa inicializuar.
- Janë shtuar paralajmërimet «-Wcast-function-type-strict» dhe «-Wincompatible-function-pointer-types-strict» për të identifikuar probleme të mundshme gjatë konvertimit të tipeve të funksioneve.
- ĂshtĂ« realizuar diagnostika e pĂ«rdorimit tĂ« emrave tĂ« pasaktĂ« ose tĂ« rezervuar tĂ« moduleve nĂ« blloqet e eksportit.
- ĂshtĂ« pĂ«rmirĂ«suar identifikimi i fjalĂ«ve kyçe tĂ« munguar «auto» nĂ« pĂ«rcaktimet.
- Në implementimin e paralajmërimit «-Winteger-overflow» janë shtuar kontrolle për situata të tjera që çojnë në overflow.
- ĂshtĂ« realizuar mbĂ«shtetje pĂ«r arkitekturĂ«n e grupit tĂ« komandave LoongArch (-march=loongarch64 ose -march=la464), qĂ« pĂ«rdoret nĂ« procesorĂ«t Loongson 3 5000 dhe implementon njĂ« ISA tĂ« ri RISC, tĂ« ngjashĂ«m me MIPS dhe RISC-V.
Novitete kryesore LLVM 16.0:
- Në kodin LLVM është lejuar përdorimi i elementeve të përcaktuara në standardin C++17.
- Janë rritur kërkesat për ambientin për kompilimin e LLVM. Mjetet e ndërtimit tani duhet të mbështesin standardin C++17, pra për ndërtimin kërkohen si minimum GCC 7.1, Clang 5.0, Apple Clang 10.0, ose Visual Studio 2019 16.7.
- Në backend për arkitekturën AArch64 është shtuar mbështetja për CPU Cortex-A715, Cortex-X3 dhe Neoverse V2, assembler për RME MEC (Kontekste të Enkriptimit të Memorisë), zgjerime Armv8.3 (Numri Kompleks) dhe multi-versioning (Versionimi i Shumë Funksionesh).
- NĂ« backend pĂ«r arkitekturĂ«n ARM Ă«shtĂ« ndĂ«rprerĂ« mbĂ«shtetja pĂ«r platformat e synuara Armv2, Armv2A, Armv3 dhe Armv3M, pĂ«r tĂ« cilat gjenerimi i kodit nuk garantoheshin. ĂshtĂ« shtuar mundĂ«sia e gjenerimit tĂ« kodit pĂ«r instruksionet qĂ« punojnĂ« me numra kompleksĂ«.
- NĂ« backend pĂ«r arkitekturĂ«n X86 Ă«shtĂ« shtuar mbĂ«shtetje pĂ«r arkitekturat e grupit tĂ« komandave (ISA) AMX-FP16, CMPCCXADD, AVX-IFMA, AVX-VNNI-INT8, AVX-NE-CONVERT. ĂshtĂ« shtuar mbĂ«shtetje pĂ«r instruksionet RDMSRLIST, RMSRLIST dhe WRMSRNS. JanĂ« realizuar opsionet «-mcpu=raptorlake», «-mcpu=meteorlake», «-mcpu=emeraldrapids», «-mcpu=sierraforest», «-mcpu=graniterapids» dhe «-mcpu=grandridge».
- ĂshtĂ« shtuar mbĂ«shtetje zyrtare pĂ«r platformĂ«n LoongArch.
- Backend-et për arkitekturën MIPS, PowerPC dhe RISC-V janë përmirësuar.
- NĂ« debugin LLDB Ă«shtĂ« shtuar mbĂ«shtetje pĂ«r debugin e skedarĂ«ve ekzekutivĂ« 64-bit pĂ«r arkitekturĂ«n LoongArch. ĂshtĂ« pĂ«rmirĂ«suar pĂ«rpunimi i simboleve tĂ« debugin COFF. ĂshtĂ« garantuar filtrimi i kopjeve tĂ« DLL-ve nĂ« listĂ«n e moduleve tĂ« ngarkuara nĂ« Windows.
- Në bibliotekën Libc++ puna kryesore është përqendruar në implementimin e mbështetjes për mundësitë e reja të standardeve C++20 dhe C++23.
- NĂ« lidhĂ«sin LDD Ă«shtĂ« reduktuar ndjeshĂ«m koha e lidhjes pĂ«rmes paralelizimit tĂ« operacioneve tĂ« skanimit tĂ« lĂ«vizjeve tĂ« adresave dhe inicializimit tĂ« seksioneve. ĂshtĂ« shtuar mbĂ«shtetje pĂ«r kompresimin e seksioneve duke pĂ«rdorur algoritmin ZSTD.
Burimi: opennet.ru
