Dopo sei mesi di sviluppo, è stata rilasciata la versione LLVM 22.1.0. Sviluppa strumenti (compilatori, ottimizzatori e generatori di codice) che compilano programmi in bitcode intermedio di istruzioni virtuali di tipo RISC (una macchina virtuale di basso livello con un sistema di ottimizzazione multilivello). Lo pseudocodice generato può essere convertito in codice macchina per una determinata piattaforma di destinazione o utilizzato da un compilatore just-in-time (JIT) per generare istruzioni macchina direttamente durante l'esecuzione del programma. Basato sulle tecnologie LLVM, il progetto sta sviluppando il compilatore Clang, che supporta i linguaggi di programmazione C, C++ e Objective-C. A partire dalla versione 18.x, il progetto è passato a un nuovo schema di numerazione delle versioni, in base al quale la versione 0 ("N.0") viene utilizzata durante lo sviluppo e la prima versione stabile è numerata "N.1".
I miglioramenti in Clang 22 includono:
- Aggiunto il supporto per i token di allocazione della memoria (token di allocazione) per contrassegnare le operazioni di allocazione della memoria eseguite tramite funzioni come malloc con un identificatore univoco. I token di allocazione consentono di strutturare le informazioni dell'heap, semplificando il rilevamento delle perdite di memoria e consentendo il raggruppamento degli oggetti in base al loro scopo o ai modelli di modifica (ad esempio, separando i dati "attivi" da quelli "inattivi"). Per abilitarli, utilizzare il flag "-fsanitize=alloc-token".
- Caratteristiche relative al linguaggio C:
- È stata implementata una bozza di specifica che definisce il meccanismo di esecuzione differita "defer", consentendo l'esecuzione di azioni quando l'ambito corrente esce. È stato aggiunto il flag "-fdefer-ts" per abilitare il supporto "defer".
- È stata aggiunta la funzione integrata __builtin_stack_address(), che rispecchia la funzione simile in GCC. Questa funzione restituisce l'indirizzo dello stack che separa l'area dello stack della funzione corrente che ha chiamato __builtin_stack_address() dalle funzioni successive che chiama.
- Funzionalità in fase di sviluppo per il futuro standard C2y:
- Aggiunto supporto per cicli denominati, che consente di assegnare nomi ai cicli e alle istruzioni switch, che possono essere specificati nelle istruzioni break e continue per definire in modo esplicito il ciclo da cui uscire. outer: for (int i = 0; i < IK; ++ i) { for (int j = 0; j < JK; ++ j) { continue; // vai a CONT1 continue outer; // vai a CONT2 // CONT1 } // CONT2 }
- L'implementazione della macro integrata "__COUNTER__", progettata per generare nomi identificativi univoci, è stata ampliata e inclusa nello standard. È stato impostato un limite di 2147483647 chiamate a questa macro; il superamento di questo limite genererà un errore.
- Rimosso l'avviso (-Wstatic-in-inline) quando si utilizzano funzioni statiche o variabili all'interno di funzioni dichiarate come "extern inline".
- Capacità definite nello standard C23 C:
- Il file di intestazione float.h ora supporta le macro FLT_SNAN, DBL_SNAN e LDBL_SNAN, che implementano valori NaN segnalati (causando un'eccezione quando utilizzati in operazioni aritmetiche) per i tipi float, double e long double.
- Risolto un bug per cui diversi tipi senza nome venivano trattati come compatibili all'interno della stessa unità di traduzione se avevano gli stessi campi.
- Il flag "-MG" utilizzato per ignorare i file di intestazione mancanti durante la scansione delle dipendenze è stato esteso alle direttive "#embed" e ora elimina l'errore "file non trovato" quando un file specificato in una direttiva "#embed" è mancante.
- Funzionalità correlate a C++:
- È stata aggiunta la possibilità di utilizzare binding strutturati nel contesto "constexpr", come sviluppato nella specifica C++2c (C++26). Ciò significa che i riferimenti a espressioni costanti possono ora essere essi stessi espressioni costanti. È implementato il supporto per array e strutture semplici (le tuple non sono ancora supportate). constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
- Come richiesto dallo standard C++20, i vincoli vengono ora convertiti nel formato standard prima di essere controllati, consentendo messaggi diagnostici più accurati e una corretta gestione degli errori di sostituzione negli argomenti del modello utilizzati solo nei concept-id.
- Aggiunta una famiglia di funzioni integrate "__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship" per scoprire se gli operatori di confronto "<", ">", "<=" e ">=" sono stati sintetizzati dall'operatore "<=>".
- Il parametro "-Wincompatible-pointer-types" è stato modificato per generare un errore anziché un avviso. Per ripristinare il comportamento precedente, utilizzare l'opzione "-Wno-error=incompatible-pointer-types".
- Aggiunte le funzioni integrate __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 e __builtin_dedup_pack. Ad esempio, builtin_dedup_pack consente di rimuovere i duplicati da un elenco di tipi: using MyTypeList = TypeList<__builtin_dedup_pack …>; // il tipo risultante sarà TypeList
- Durante il debug di un comportamento indefinito con UBSan (-fsanitize=undefined -fsanitize-trap=undefined), le informazioni sulla causa dell'errore sono ora incluse nelle informazioni di debug generate. È stato aggiunto il flag "-fsanitize-debug-trap-reasons" per specificare il livello di dettaglio nelle informazioni di errore. Può essere impostato su "base" per descrizioni generali (ad esempio, "Overflow nell'addizione di interi") e su "dettagliato" per includere informazioni dettagliate (ad esempio, "Overflow nell'addizione di interi con segno in 'a + b'").
- Aggiunti nuovi flag del compilatore:
- "-f[no-]sanitize-debug-trap-reasons" per controllare se i motivi delle trappole di eccezione sono incorporati nelle informazioni di debug durante la compilazione con la modalità "-fsanitize-trap".
- "-fsanitize=alloc-token", "-falloc-token-max", "-fsanitize-alloc-token-fast-abi" e "-fsanitize-alloc-token-extended" per gestire i token di allocazione della memoria.
- "-fmatrix-memory-layout" per controllare il layout di memoria dei tipi di matrice (ad esempio column-major per column-major, row-major per row-major).
- Le funzioni ora hanno un attributo "malloc_span", simile all'attributo malloc ma applicabile alle funzioni che restituiscono strutture di tipo span contenenti un puntatore e un campo con la dimensione o un puntatore alla fine del blocco.
- Aggiunto l'attributo "modular_format" per selezionare dinamicamente l'implementazione collegata staticamente richiesta della funzione printf al momento del collegamento.
- Sono stati ampliati gli strumenti di analisi diagnostica e statica e sono stati aggiunti nuovi controlli (diverse decine di miglioramenti correlati alla diagnostica).
- Sono stati aggiunti al backend X86 ulteriori componenti intrinseci per le estensioni SSE, AVX e AVX512. Sono state aggiunte modalità di compilazione per le CPU Intel basate sulle microarchitetture Wildcat Lake (-march=wildcatlake) e Nova Lake (-march=novalake).
- Il backend AArch64 ora supporta i processori Ampere Computing Ampere1C (ampere1c), Arm C1-Nano (c1-nano), Arm C1-Pro (c1-pro), Arm C1-Premium (c1-premium) e Arm C1-Ultra (c1-ultra). Sono state aggiunte ulteriori funzioni integrate per le istruzioni FCVTZ[US], FCVTN[US], FCVTM[US], FCVTP[US] e FCVTA[US]. Il supporto Function Multi-Versioning (FMV) è stato stabilizzato. Gli utenti possono ora ignorare la priorità delle diverse versioni delle funzioni.
- Aggiunto supporto per l'architettura LoongArch32 (LA32R, LA32S).
- Backend migliorati per le architetture ARM, AMDGPU, RISC-V, LoongArch64, MIPS, WebAssembly e PowerPC.
Fonte: opennet.ru
