Udgivelse af LLVM 22 compiler suite

Efter seks måneders udvikling er LLVM 22.1.0 blevet udgivet. Den udvikler værktøjer (compilere, optimeringsværktøjer og kodegeneratorer), der kompilerer programmer til mellemliggende bitkode af RISC-lignende virtuelle instruktioner (en lavniveau virtuel maskine med et flerniveauoptimeringssystem). Den genererede pseudokode kan konverteres til maskinkode til en given målplatform eller bruges af en just-in-time (JIT) compiler til at generere maskininstruktioner direkte under programudførelse. Baseret på LLVM-teknologier udvikler projektet Clang-compileren, der understøtter programmeringssprogene C, C++ og Objective-C. Fra og med 18.x-grenen skiftede projektet til et nyt versionsnummereringsskema, hvor version 0 ("N.0") bruges under udviklingen, og den første stabile version nummereres "N.1".

Forbedringer i Clang 22 omfatter:

  • Tilføjet understøttelse af hukommelsesallokeringstokens (Allocation Tokens) til markering af hukommelsesallokeringsoperationer udført ved hjælp af funktioner som malloc med et unikt id. Allokeringstokens muliggør strukturering af heap-information, forenkling af hukommelseslækagedetektion og aktivering af gruppering af objekter baseret på deres formål eller modifikationsmønstre (f.eks. adskillelse af "varme" fra "kolde" data). For at aktivere, brug flaget "-fsanitize=alloc-token".
  • Funktioner relateret til C-sproget:
    • Et udkast til en specifikation, der definerer mekanismen for udskudt udførelse "defer", er blevet implementeret, hvilket tillader handlinger at blive udført, når det aktuelle omfang afsluttes. Flaget "-fdefer-ts" er blevet tilføjet for at aktivere understøttelse af "defer".
    • Den indbyggede funktion __builtin_stack_address() er blevet tilføjet, hvilket afspejler den lignende funktion i GCC. Denne funktion returnerer stakadressen, der adskiller stakområdet for den aktuelle funktion, der kaldte __builtin_stack_address(), og de efterfølgende funktioner, den kalder.
  • Funktioner, der udvikles til den fremtidige C2y-standard:
    • Tilføjet understøttelse af navngivne løkker, som giver dig mulighed for at tildele navne til løkker og switch-sætninger, som kan angives i break- og continue-sætninger for eksplicit at definere den løkke, der skal afsluttes 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 af ​​den indbyggede makro "__COUNTER__", der er designet til at generere unikke identifikatornavne, er blevet udvidet og inkluderet i standarden. Der er sat en grænse på 2147483647 kald til denne makro; overskridelse af denne grænse vil generere en fejl.
    • Fjernede advarslen (-Wstatic-in-inline) ved brug af statiske funktioner eller variabler i funktioner, der er deklareret som "extern inline".
  • Funktioner defineret i C23 C-standarden:
    • Float.h-headerfilen understøtter nu makroerne FLT_SNAN, DBL_SNAN og LDBL_SNAN, som implementerer signalerede (forårsager en undtagelse ved brug i aritmetiske operationer) NaN-værdier for float-, double- og long double-typerne.
    • Rettede en fejl, hvor forskellige unavngivne typer blev behandlet som kompatible inden for den samme oversættelsesenhed, hvis de havde de samme felter.
    • Flaget "-MG", der bruges til at ignorere manglende headerfiler under afhængighedsscanning, er blevet udvidet til "#embed"-direktiver og undertrykker nu fejlen "fil ikke fundet", når en fil angivet i et "#embed"-direktiv mangler.
  • C++-relaterede funktioner:
    • Muligheden for at bruge strukturerede bindinger i "constexpr"-konteksten, som udviklet i C++2c (C++26)-specifikationen, er blevet tilføjet. Det betyder, at referencer til konstante udtryk nu selv kan være konstante udtryk. Understøttelse er implementeret for arrays og simple strukturer (tupler understøttes endnu ikke). constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
    • Som krævet af C++20-standarden konverteres begrænsninger nu til standardform, før de kontrolleres, hvilket giver mulighed for mere præcise diagnostiske meddelelser og korrekt håndtering af substitutionsfejl i skabelonargumenter, der kun bruges i koncept-id'er.
    • Tilføjede en familie af indbyggede funktioner "__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship" for at finde ud af, om sammenligningsoperatorerne "<", ">", "<=" og ">=" blev syntetiseret fra operatoren "<=>".
    • Parameteren "-Wincompatible-pointer-types" er blevet ændret til at vise en fejl i stedet for en advarsel. For at vende tilbage til den tidligere funktionsmåde skal du bruge indstillingen "-Wno-error=incompatible-pointer-types".
  • Tilføjede indbyggede funktioner __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 giver builtin_dedup_pack dig mulighed for at fjerne dubletter fra en liste over typer: ved hjælp af MyTypeList = TypeList<__builtin_dedup_pack …>; // den resulterende type vil være TypeList
  • Når der fejlfindes udefineret adfærd med UBSan (-fsanitize=undefined -fsanitize-trap=undefined), inkluderes oplysninger om fejlårsag nu i de genererede fejlfindingsoplysninger. Flaget "-fsanitize-debug-trap-reasons" er blevet tilføjet for at angive detaljeringsniveauet i fejloplysningerne. Det kan indstilles til "grundlæggende" for generelle beskrivelser (f.eks. "Heltalsaddition overløbet") og "detaljeret" for at inkludere detaljerede oplysninger (f.eks. "signed integer addition overløb i 'a + b'").
  • Tilføjet nye compilerflag:
    • "-f[no-]sanitize-debug-trap-reasons" til at kontrollere, om årsager til undtagelsesfælder er integreret i fejlfindingsoplysningerne ved kompilering med tilstanden "-fsanitize-trap".
    • "-fsanitize=alloc-token", "-falloc-token-max", "-fsanitize-alloc-token-fast-abi" og "-fsanitize-alloc-token-extended" til at administrere hukommelsesallokeringstokens.
    • "-fmatrix-memory-layout" til at styre hukommelseslayoutet for matrixtyper (f.eks. kolonne-stor for kolonne-stor, række-stor for række-stor).
  • Funktioner har nu en "malloc_span"-attribut, der ligner malloc-attributten, men som kan anvendes på funktioner, der returnerer span-lignende strukturer, der indeholder en pointer og et felt med størrelsen eller en pointer til slutningen af ​​blokken.
  • Tilføjede attributten "modular_format" for dynamisk at vælge den nødvendige statisk linkede implementering af printf-funktionen på linktidspunktet.
  • Diagnostiske og statiske analyseværktøjer er blevet udvidet, og nye kontroller er blevet tilføjet (flere dusin diagnostiske forbedringer).
  • Yderligere intrinsiske funktioner til SSE-, AVX- og AVX512-udvidelserne er blevet tilføjet til X86-backend'en. Byggetilstande er blevet tilføjet til Intel CPU'er baseret på Wildcat Lake- (-march=wildcatlake) og Nova Lake- (-march=novalake) mikroarkitekturerne.
  • AArch64-backend understøtter nu 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) processorer. Yderligere indbyggede funktioner er blevet tilføjet til instruktionerne FCVTZ[US], FCVTN[US], FCVTM[US], FCVTP[US] og FCVTA[US]. Understøttelse af Function Multi-Versioning (FMV) er blevet stabiliseret. Brugere kan nu tilsidesætte prioriteten for forskellige funktionsversioner.
  • Tilføjet understøttelse af LoongArch32 (LA32R, LA32S) arkitektur.
  • Forbedrede backends til ARM-, AMDGPU-, RISC-V-, LoongArch64-, MIPS-, WebAssembly- og PowerPC-arkitekturer.

Kilde: opennet.ru

Køb pålidelig hosting til websteder med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster