Utgivelse av LLVM 22-kompilatorpakken

Etter seks måneders utvikling er LLVM 22.1.0 utgitt. Den utvikler verktøy (kompilatorer, optimalisatorer og kodegeneratorer) som kompilerer programmer til mellomliggende bitkode av RISC-lignende virtuelle instruksjoner (en lavnivå virtuell maskin med et flernivåoptimaliseringssystem). Den genererte pseudokoden kan konverteres til maskinkode for en gitt målplattform eller brukes av en just-in-time (JIT)-kompilator for å generere maskininstruksjoner direkte under programkjøring. Basert på LLVM-teknologier utvikler prosjektet Clang-kompilatoren, som støtter programmeringsspråkene C, C++ og Objective-C. Fra og med 18.x-grenen byttet prosjektet til et nytt versjonsnummereringsskjema, der versjon 0 ("N.0") brukes under utvikling, og den første stabile versjonen er nummerert "N.1".

Forbedringer i Clang 22 inkluderer:

  • Lagt til støtte for minneallokeringstokener (Allocation Tokens) for å merke minneallokeringsoperasjoner utført ved hjelp av funksjoner som malloc med en unik identifikator. Allokeringstokener tillater strukturering av heap-informasjon, forenkling av minnelekkasjedeteksjon og muliggjør gruppering av objekter basert på deres formål eller modifikasjonsmønstre (f.eks. å skille "varme" fra "kalde" data). For å aktivere, bruk flagget "-fsanitize=alloc-token".
  • Funksjoner relatert til C-språket:
    • Et utkast til spesifikasjon som definerer mekanismen for utsatt utførelse «defer» er implementert, slik at handlinger kan utføres når gjeldende omfang avsluttes. Flagget «-fdefer-ts» er lagt til for å aktivere støtte for «defer».
    • Den innebygde funksjonen __builtin_stack_address() er lagt til, og speiler den lignende funksjonen i GCC. Denne funksjonen returnerer stakkadressen som skiller stakkområdet til den gjeldende funksjonen som kalte __builtin_stack_address() og påfølgende funksjoner den kaller.
  • Funksjoner som utvikles for den fremtidige C2y-standarden:
    • Lagt til støtte for navngitte løkker, som lar deg tilordne navn til løkker og switch-setninger, som kan spesifiseres i break- og continue-setninger for å eksplisitt definere løkken den skal avsluttes fra. outer: for (int i = 0; i < IK; ++ i) { for (int j = 0; j < JK; ++ j) { continue; // gå til CONT1 continue outer; // gå til CONT2 // CONT1 } // CONT2 }
    • Implementeringen av den innebygde makroen «__COUNTER__», som er utformet for å generere unike identifikatornavn, er utvidet og inkludert i standarden. Det er satt en grense på 2147483647 kall til denne makroen. Overskridelse av denne grensen vil generere en feil.
    • Fjernet advarselen (-Wstatic-in-inline) ved bruk av statiske funksjoner eller variabler i funksjoner deklarert som "extern inline".
  • Funksjoner definert i C23 C-standarden:
    • Headerfilen float.h støtter nå makroene FLT_SNAN, DBL_SNAN og LDBL_SNAN, som implementerer signaliserte (forårsaker et unntak når de brukes i aritmetiske operasjoner) NaN-verdier for float-, double- og long double-typene.
    • Fikset en feil der forskjellige navnløse typer ble behandlet som kompatible innenfor samme oversettelsesenhet hvis de hadde de samme feltene.
    • Flagget «-MG» som brukes til å ignorere manglende headerfiler under avhengighetsskanning, har blitt utvidet til «#embed»-direktiver og undertrykker nå feilen «fil ikke funnet» når en fil spesifisert i et «#embed»-direktiv mangler.
  • C++-relaterte funksjoner:
    • Muligheten til å bruke strukturerte bindinger i "constexpr"-konteksten, slik den er utviklet i C++2c (C++26)-spesifikasjonen, er lagt til. Dette betyr at referanser til konstante uttrykk nå i seg selv kan være konstante uttrykk. Støtte er implementert for arrayer og enkle strukturer (tupler støttes ikke ennå). constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
    • Som kreves av C++20-standarden, konverteres nå begrensninger til standardform før de kontrolleres, noe som gir mer nøyaktige diagnostiske meldinger og riktig håndtering av substitusjonsfeil i malargumenter som kun brukes i konsept-ID-er.
    • La til en familie med innebygde funksjoner «__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship» for å finne ut om sammenligningsoperatorene «<», «>», «<=" og «>=" ble syntetisert fra operatoren «<=>».
    • Parameteren «-Wincompatible-pointer-types» er endret til å sende ut en feil i stedet for en advarsel. For å gå tilbake til forrige virkemåte, bruk alternativet «-Wno-error=incompatible-pointer-types».
  • La til innebygde funksjoner __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 og __builtin_dedup_pack. For eksempel lar builtin_dedup_pack deg fjerne duplikater fra en liste over typer: ved å bruke MyTypeList = TypeList<__builtin_dedup_pack …>; // den resulterende typen blir TypeList
  • Når du feilsøker udefinert oppførsel med UBSan (-fsanitize=undefined -fsanitize-trap=undefined), inkluderes nå informasjon om feilårsak i den genererte feilsøkingsinformasjonen. Flagget "-fsanitize-debug-trap-reasons" er lagt til for å angi detaljnivået i feilinformasjonen. Det kan settes til "grunnleggende" for generelle beskrivelser (f.eks. "Heltallsaddisjon overløpt") og "detaljert" for å inkludere detaljert informasjon (f.eks. "signed integer addisjon overløpt i 'a + b'").
  • Lagt til nye kompilatorflagg:
    • «-f[no-]sanitize-debug-trap-reasons» for å kontrollere om årsaker til unntaksfeller er innebygd i feilsøkingsinformasjonen når det kompileres med «-fsanitize-trap»-modus.
    • "-fsanitize=alloc-token", "-falloc-token-max", "-fsanitize-alloc-token-fast-abi" og "-fsanitize-alloc-token-extended" for å administrere minneallokeringstokener.
    • "-fmatrix-memory-layout" for å kontrollere minneoppsettet til matrisetyper (f.eks. kolonne-hoved for kolonne-hoved, rad-hoved for rad-hoved).
  • Funksjoner har nå et "malloc_span"-attributt, likt malloc-attributtet, men gjelder for funksjoner som returnerer span-lignende strukturer som inneholder en peker og et felt med størrelsen eller en peker til slutten av blokken.
  • La til attributtet «modular_format» for dynamisk å velge den nødvendige statisk lenkede implementeringen av printf-funksjonen ved koblingstidspunktet.
  • Diagnostiske og statiske analyseverktøy er utvidet, nye kontroller er lagt til (flere dusin diagnostikkrelaterte forbedringer).
  • Ytterligere intrinsiske funksjoner for SSE-, AVX- og AVX512-utvidelsene er lagt til i X86-backend. Byggemoduser er lagt til for Intel-CPUer basert på mikroarkitekturene Wildcat Lake (-march=wildcatlake) og Nova Lake (-march=novalake).
  • AArch64-backend støtter nå prosessorene Ampere Computing Ampere1C (ampere1c), Arm C1-Nano (c1-nano), Arm C1-Pro (c1-pro), Arm C1-Premium (c1-premium) og Arm C1-Ultra (c1-ultra). Ytterligere innebygde funksjoner er lagt til for instruksjonene FCVTZ[US], FCVTN[US], FCVTM[US], FCVTP[US] og FCVTA[US]. Støtte for funksjonsmultiversjonering (FMV) er stabilisert. Brukere kan nå overstyre prioriteten til forskjellige funksjonsversjoner.
  • La til støtte for LoongArch32 (LA32R, LA32S)-arkitekturen.
  • Forbedrede backend-systemer for ARM-, AMDGPU-, RISC-V-, LoongArch64-, MIPS-, WebAssembly- og PowerPC-arkitekturer.

Kilde: opennet.ru

Kjøp pålitelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere 🔥 Kjøp pålitelig webhotell med DDoS-beskyttelse, VPS VDS-servere | ProHoster