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

Pas gjashtë muajsh zhvillimi, është publikuar LLVM 22.1.0. Ai zhvillon mjete (përpilues, optimizues dhe gjeneratorë kodi) që përpilojnë programet në 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 shumënivelësh). Pseudokodi i gjeneruar mund të konvertohet në kod makine për një platformë të caktuar të synuar ose të përdoret nga një përpilues vetëm në kohë (JIT) për të gjeneruar udhëzime makine direkt gjatë ekzekutimit të programit. Bazuar në teknologjitë LLVM, projekti po zhvillon përpiluesin Clang, duke mbështetur gjuhët e programimit C, C++ dhe Objective-C. Duke filluar me degën 18.x, projekti kaloi në një skemë të re numërimi versionesh, sipas së cilës versioni 0 ("N.0") përdoret gjatë zhvillimit, dhe versioni i parë i qëndrueshëm numërohet "N.1".

Përmirësimet në Clang 22 përfshijnë:

  • U shtua mbështetje për tokenët e alokimit të memories (Allocation Tokens) për shënimin e operacioneve të alokimit të memories të kryera duke përdorur funksione të tilla si malloc me një identifikues unik. Tokenët e alokimit lejojnë strukturimin e informacionit të grumbullit, duke thjeshtuar zbulimin e rrjedhjeve të memories dhe duke mundësuar grupimin e objekteve bazuar në qëllimin e tyre ose modelet e modifikimit (p.sh., ndarja e të dhënave "të nxehta" nga "të ftohta"). Për ta aktivizuar, përdorni flamurin "-fsanitize=alloc-token".
  • Karakteristikat që lidhen me gjuhën C:
    • Një draft specifikim që përcakton mekanizmin e ekzekutimit të shtyrë "shtyj" është zbatuar, duke lejuar që veprimet të ekzekutohen kur mbyllet fushëveprimi aktual. Flamuri "-fdefer-ts" është shtuar për të aktivizuar mbështetjen "shtyj".
    • Funksioni i integruar __builtin_stack_address() është shtuar, duke pasqyruar funksionin e ngjashëm në GCC. Ky funksion kthen adresën e stekut duke ndarë zonën e stekut të funksionit aktual që thirri __builtin_stack_address() dhe funksionet pasuese që ai thirri.
  • Aftësitë që po zhvillohen për standardin e ardhshëm C2y:
    • U shtua mbështetje për sythet me emër, e cila ju lejon t'u caktoni emra sytheve dhe deklaratave switch, të cilat mund të specifikohen në deklaratat break dhe continue për të përcaktuar në mënyrë eksplicite sythin nga i cili do të dalësh. outer: for (int i = 0; i < IK; ++ i) { for (int j = 0; j < JK; ++ j) { continue; // shkoni te CONT1 continue outer; // shkoni te CONT2 // CONT1 } // CONT2 }
    • Implementimi i makrosë së integruar "__COUNTER__", e projektuar për të gjeneruar emra unikë identifikuesish, është zgjeruar dhe përfshirë në standard. Është vendosur një limit prej 2147483647 thirrjesh për këtë makro; tejkalimi i këtij limiti do të gjenerojë një gabim.
    • U hoq paralajmërimi (-Wstatic-in-inline) kur përdoreshin funksione statike ose variabla brenda funksioneve të deklaruara si "extern inline".
  • Aftësitë e përcaktuara në standardin C23 C:
    • Skedari i kokës float.h tani mbështet makrot FLT_SNAN, DBL_SNAN dhe LDBL_SNAN, të cilat zbatojnë vlerat NaN të sinjalizuara (duke shkaktuar një përjashtim kur përdoren në operacionet aritmetike) për llojet float, double dhe long double.
    • U rregullua një gabim ku lloje të ndryshme pa emër trajtoheshin si të pajtueshme brenda të njëjtës njësi përkthimi nëse kishin të njëjtat fusha.
    • Flamuri "-MG" i përdorur për të injoruar skedarët e kokës që mungojnë gjatë skanimit të varësive është zgjeruar në direktivat "#embed" dhe tani e shtyp gabimin "skedari nuk u gjet" kur mungon një skedar i specifikuar në një direktivë "#embed".
  • Karakteristikat që lidhen me C++:
    • Është shtuar mundësia për të përdorur lidhje të strukturuara në kontekstin "constexpr", siç është zhvilluar në specifikimin C++2c (C++26). Kjo do të thotë që referencat ndaj shprehjeve konstante tani mund të jenë vetë shprehje konstante. Mbështetja është zbatuar për vargje dhe struktura të thjeshta (tuples nuk mbështeten ende). constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
    • Siç kërkohet nga standardi C++20, kufizimet tani konvertohen në formë standarde përpara se të kontrollohen, duke lejuar mesazhe diagnostikuese më të sakta dhe trajtimin e duhur të gabimeve të zëvendësimit në argumentet e shabllonit të përdorura vetëm në ID-të e koncepteve.
    • U shtua një familje funksionesh të integruara "__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship" për të zbuluar nëse operatorët e krahasimit "<", ">", "<=" dhe ">=" u sintetizuan nga operatori "<=>".
    • Parametri "-Wincompatible-pointer-types" është ndryshuar për të shfaqur një gabim në vend të një paralajmërimi. Për t'u rikthyer në sjelljen e mëparshme, përdorni opsionin "-Wno-error=incompatible-pointer-types".
  • U shtuan funksionet e integruara __builtin_bswapg, __builtin_elementwise_ldexp, __builtin_elementwise_fshl, __builtin_elementwise_fshr, __builtin_elementwise_minnumnum, __builtin_elementwise_maxnumnum, __builtin_masked_load, __builtin_masked_expand_load, __builtin_masked_store, __builtin_masked_compress_store, __builtin_masked_gather, __builtin_masked_scatter dhe __builtin_dedup_pack. Për shembull, builtin_dedup_pack ju lejon të hiqni kopjet nga një listë llojesh: duke përdorur MyTypeList = TypeList<__builtin_dedup_pack …>; // lloji që rezulton do të jetë TypeList
  • Kur debugohet sjellja e papërcaktuar me UBSan (-fsanitize=undefined -fsanitize-trap=undefined), informacioni i shkakut të gabimit tani përfshihet në informacionin e gjeneruar të debugimit. Është shtuar flamuri "-fsanitize-debug-trap-reasons" për të specifikuar nivelin e detajeve në informacionin e gabimit. Mund të vendoset në "bazë" për përshkrime të përgjithshme (p.sh., "Mbledhja e numrave të plotë u tejmbush") dhe "i detajuar" për të përfshirë informacion të detajuar (p.sh., "mbyllje e mbledhjes së numrave të plotë me shenjë në 'a + b'").
  • U shtuan flamuj të rinj përpilues:
    • "-f[no-]sanitize-debug-trap-reasons" për të kontrolluar nëse arsyet e kurtheve të përjashtimit janë të integruara në informacionin e debugimit gjatë kompilimit me modalitetin "-fsanitize-trap".
    • "-fsanitize=alloc-token", "-falloc-token-max", "-fsanitize-alloc-token-fast-abi", dhe "-fsanitize-alloc-token-extended" për të menaxhuar tokenët e alokimit të memories.
    • "-fmatrix-memory-layout" për të kontrolluar paraqitjen e memories së llojeve të matricave (p.sh. column-major për column-major, row-major për row-major).
  • Funksionet tani kanë një atribut "malloc_span", i ngjashëm me atributin malloc, por i zbatueshëm për funksionet që kthejnë struktura të ngjashme me span që përmbajnë një tregues dhe një fushë me madhësinë ose një tregues në fund të bllokut.
  • U shtua atributi "modular_format" për të zgjedhur dinamikisht implementimin e kërkuar të lidhur statikisht të funksionit printf në kohën e lidhjes.
  • Mjetet diagnostikuese dhe të analizës statike janë zgjeruar, janë shtuar kontrolle të reja (disa dhjetëra përmirësime të lidhura me diagnostikimin).
  • Në backend-in X86 janë shtuar elementë të brendshëm shtesë për zgjerimet SSE, AVX dhe AVX512. Janë shtuar mënyra ndërtimi për CPU-të Intel bazuar në mikroarkitekturat Wildcat Lake (-march=wildcatlake) dhe Nova Lake (-march=novalake).
  • Sfondi AArch64 tani mbështet procesorët Ampere Computing Ampere1C (ampere1c), Arm C1-Nano (c1-nano), Arm C1-Pro (c1-pro), Arm C1-Premium (c1-premium) dhe Arm C1-Ultra (c1-ultra). Janë shtuar funksione të tjera të integruara për udhëzimet FCVTZ[US], FCVTN[US], FCVTM[US], FCVTP[US] dhe FCVTA[US]. Mbështetja për Funksione Shumëversionuese (FMV) është stabilizuar. Përdoruesit tani mund të anashkalojnë përparësinë e versioneve të ndryshme të funksioneve.
  • Shtuar mbështetje për arkitekturën LoongArch32 (LA32R, LA32S).
  • Backend-e të përmirësuara për arkitekturat ARM, AMDGPU, RISC-V, LoongArch64, MIPS, WebAssembly dhe PowerPC.

Burimi: opennet.ru

Bleni një host të besueshëm për faqet me mbrojtje DDoS, serverë VPS VDS 🔥 Bleni hosting të besueshëm të faqeve të internetit me mbrojtje DDoS, servera VPS VDS | ProHoster