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
