Efter sex månaders utveckling har LLVM 22.1.0 släppts. Den utvecklar verktyg (kompilatorer, optimerare och kodgeneratorer) som kompilerar program till mellanliggande bitkod av RISC-liknande virtuella instruktioner (en virtuell maskin på låg nivå med ett flernivåoptimeringssystem). Den genererade pseudokoden kan konverteras till maskinkod för en given målplattform eller användas av en just-in-time (JIT)-kompilator för att generera maskininstruktioner direkt under programkörning. Baserat på LLVM-tekniker utvecklar projektet Clang-kompilatorn, som stöder programmeringsspråken C, C++ och Objective-C. Med början från grenen 18.x bytte projektet till ett nytt versionsnumreringsschema, enligt vilket version 0 ("N.0") används under utvecklingen, och den första stabila versionen numreras "N.1".
Förbättringar i Clang 22 inkluderar:
- Lade till stöd för minnesallokeringstokens (Allocation Tokens) för att markera minnesallokeringsoperationer som utförs med funktioner som malloc med en unik identifierare. Allokeringstokens möjliggör strukturering av heapinformation, förenkling av minnesläckagedetektering och aktivering av gruppering av objekt baserat på deras syfte eller modifieringsmönster (t.ex. att separera "varm" från "kall" data). För att aktivera, använd flaggan "-fsanitize=alloc-token".
- Funktioner relaterade till C-språket:
- Ett utkast till specifikation som definierar mekanismen för uppskjuten exekvering "defer" har implementerats, vilket gör att åtgärder kan utföras när det aktuella omfånget avslutas. Flaggan "-fdefer-ts" har lagts till för att aktivera stöd för "defer".
- Den inbyggda funktionen __builtin_stack_address() har lagts till, vilket speglar en liknande funktion i GCC. Denna funktion returnerar stackadressen som separerar stackområdet för den aktuella funktionen som anropade __builtin_stack_address() och efterföljande funktioner som den anropar.
- Funktioner som utvecklas för den framtida C2y-standarden:
- Lade till stöd för namngivna loopar, vilket gör att du kan tilldela namn till loopar och switch-satser, vilka kan anges i break- och continue-satser för att explicit definiera loopen att avslutas från. outer: for (int i = 0; i < IK; ++ i) { for (int j = 0; j < JK; ++ j) { continue; // gå till CONT1 continue outer; // gå till CONT2 // CONT1 } // CONT2 }
- Implementeringen av det inbyggda makrot "__COUNTER__", utformat för att generera unika identifierare, har utökats och inkluderats i standarden. En gräns på 2147483647 anrop till detta makro har satts; överskridande av denna gräns genererar ett fel.
- Tog bort varningen (-Wstatic-in-inline) när statiska funktioner eller variabler används inuti funktioner som deklarerats som "extern inline".
- Funktioner definierade i C23 C-standarden:
- Headerfilen float.h stöder nu makrona FLT_SNAN, DBL_SNAN och LDBL_SNAN, vilka implementerar signalerade (vilket orsakar ett undantag vid användning i aritmetiska operationer) NaN-värden för float-, double- och long double-typerna.
- Åtgärdade ett fel där olika namnlösa typer behandlades som kompatibla inom samma översättningsenhet om de hade samma fält.
- Flaggan "-MG" som används för att ignorera saknade headerfiler under beroendeskanning har utökats till "#embed"-direktiv och undertrycker nu felet "filen hittades inte" när en fil som anges i ett "#embed"-direktiv saknas.
- C++-relaterade funktioner:
- Möjligheten att använda strukturerade bindningar i "constexpr"-kontexten, som utvecklats i C++2c (C++26)-specifikationen, har lagts till. Detta innebär att referenser till konstanta uttryck nu själva kan vara konstanta uttryck. Stöd är implementerat för arrayer och enkla strukturer (tupler stöds ännu inte). constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
- Som krävs av C++20-standarden konverteras nu begränsningar till standardform innan de kontrolleras, vilket möjliggör mer exakta diagnostiska meddelanden och korrekt hantering av substitutionsfel i mallargument som endast används i koncept-ID:n.
- Lade till en familj av inbyggda funktioner "__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship" för att ta reda på om jämförelseoperatorerna "<", ">", "<=" och ">=" syntetiserades från operatorn "<=>".
- Parametern "-Wincompatible-pointer-types" har ändrats för att ge ett felmeddelande istället för en varning. För att återgå till föregående beteende, använd alternativet "-Wno-error=incompatible-pointer-types".
- Lade till de inbyggda funktionerna __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 och __builtin_dedup_pack. Till exempel låter builtin_dedup_pack dig ta bort dubbletter från en lista med typer: med hjälp av MyTypeList = TypeList<__builtin_dedup_pack …>; // den resulterande typen blir TypeList
- Vid felsökning av odefinierat beteende med UBSan (-fsanitize=undefined -fsanitize-trap=undefined) inkluderas nu information om felorsak i den genererade felsökningsinformationen. Flaggan "-fsanitize-debug-trap-reasons" har lagts till för att ange detaljnivån i felinformationen. Den kan ställas in på "grundläggande" för allmänna beskrivningar (t.ex. "Heltalsaddition översvämmad") och "detaljerad" för att inkludera detaljerad information (t.ex. "signed integer overflow in 'a + b'").
- Lade till nya kompilatorflaggor:
- "-f[no-]sanitize-debug-trap-reasons" för att kontrollera om orsaker till undantagsfällor bäddas in i felsökningsinformationen vid kompilering med läget "-fsanitize-trap".
- "-fsanitize=alloc-token", "-falloc-token-max", "-fsanitize-alloc-token-fast-abi" och "-fsanitize-alloc-token-extended" för att hantera minnesallokeringstokens.
- "-fmatrix-memory-layout" för att styra minneslayouten för matristyper (t.ex. kolumn-dur för kolumn-dur, rad-dur för rad-dur).
- Funktioner har nu attributet "malloc_span", liknande malloc-attributet men tillämpligt på funktioner som returnerar span-liknande strukturer som innehåller en pekare och ett fält med storleken eller en pekare till slutet av blocket.
- Lade till attributet "modular_format" för att dynamiskt välja den statiskt länkade implementeringen av printf-funktionen som krävs vid länkningstillfället.
- Diagnostiska och statiska analysverktyg har utökats, nya kontroller har lagts till (flera dussin diagnostikrelaterade förbättringar).
- Ytterligare intrinsiska funktioner för SSE-, AVX- och AVX512-tilläggen har lagts till i X86-backend. Bygglägen har lagts till för Intel-processorer baserade på mikroarkitekturerna Wildcat Lake (-march=wildcatlake) och Nova Lake (-march=novalake).
- AArch64-backend stöder nu processorerna Ampere Computing Ampere1C (ampere1c), Arm C1-Nano (c1-nano), Arm C1-Pro (c1-pro), Arm C1-Premium (c1-premium) och Arm C1-Ultra (c1-ultra). Ytterligare inbyggda funktioner har lagts till för instruktionerna FCVTZ[US], FCVTN[US], FCVTM[US], FCVTP[US] och FCVTA[US]. Stödet för Function Multi-Versioning (FMV) har stabiliserats. Användare kan nu åsidosätta prioriteten för olika funktionsversioner.
- Lade till stöd för LoongArch32-arkitekturen (LA32R, LA32S).
- Förbättrade backend-funktioner för ARM-, AMDGPU-, RISC-V-, LoongArch64-, MIPS-, WebAssembly- och PowerPC-arkitekturer.
Källa: opennet.ru
