Dopo sei mesi di sviluppo, è stato rilasciato il progetto LLVM 22.1.0, che evolve l'ecosistema di strumenti (compilatori, ottimizzatori e generatori di codice), progettato per compilare programmi in un bytecode intermedio di istruzioni virtuali simili a RISC (una macchina virtuale di basso livello con un sistema di ottimizzazione multilivello). Il pseudocodice generato può essere trasformato in codice macchina per una specifica piattaforma target o utilizzato da un compilatore JIT per generare istruzioni macchina direttamente durante l'esecuzione del programma. Sulla base delle tecnologie LLVM, il progetto sviluppa il compilatore Clang, che supporta i linguaggi di programmazione C, C++ e Objective-C. A partire dal ramo 18.x, il progetto ha adottato un nuovo schema di numerazione delle versioni, secondo il quale la release zero («N.0») è utilizzata durante lo sviluppo, mentre la prima versione stabile è contrassegnata con il numero «N.1».
Tra i miglioramenti in Clang 22:
- È stata aggiunta la supporto ai token di allocazione della memoria (Allocation Token) per contrassegnare con un identificatore unico le operazioni di allocazione della memoria effettuate tramite funzioni come malloc. Gli identificatori permettono di strutturare le informazioni nell'heap, semplificando l'individuazione delle perdite di memoria e consentendo la raggruppazione degli oggetti in base alla destinazione o alla natura delle modifiche (ad esempio, differenziare i dati "caldi" da quelli "freddi"). Per abilitare questa funzione, utilizzare il flag "-fsanitize=alloc-token".
- Funzionalità legate al linguaggio C:
- È stata implementata una bozza della specifica che definisce il meccanismo di esecuzione differita "defer", che consente di eseguire azioni al momento dell'uscita dall'attuale ambito di visibilità. Per abilitare il supporto per "defer" è stato aggiunto il flag "-fdefer-ts".
- È stata aggiunta la funzione incorporata __builtin_stack_address(), che replica una funzione simile in GCC. La funzione restituisce l'indirizzo nello stack che separa l'area dello stack della funzione corrente, che ha chiamato __builtin_stack_address(), dalle funzioni successive chiamate.
- Funzionalità in sviluppo per il futuro standard C2y:
- È stata aggiunta la supporto per i cicli nominati, consentendo di assegnare nomi ai cicli e all'istruzione switch, che possono essere specificati nelle istruzioni break e continue per identificare esplicitamente il ciclo da cui si esce. outer: for (int i = 0; i < IK; ++i) { for (int j = 0; j < JK; ++j) { continue; // passaggio a CONT1 continue outer; // passaggio a CONT2 // CONT1 } // CONT2 }
- È stata ampliata e inclusa nel standard l'implementazione del macro incorporato «__COUNTER__», progettato per generare nomi identificatori unici. È stato stabilito un limite di 2147483647 chiamate a questo macro, dopo il quale verrà visualizzato un errore.
- Rimosso il messaggio di avviso (-Wstatic-in-inline) durante l'uso di funzioni o variabili statiche all'interno di funzioni dichiarate come «extern inline».
- Funzionalità definite nello standard C23:
- Nel file di intestazione float.h sono stati aggiunti i macro FLT_SNAN, DBL_SNAN e LDBL_SNAN, che implementano valori NaN segnali (che generano eccezioni durante l'uso in operazioni aritmetiche) per i tipi float, double e long double.
- È stato corretto un errore che causava l'elaborazione di diversi tipi non nominati come compatibili all'interno di un'unità di traduzione, se avevano campi coincidenti.
- Il flag "-MG", utilizzato per ignorare l'assenza di file di intestazione durante la scansione delle dipendenze, è stato esteso alle direttive "#embed" e ora sopprime l'output dell'errore "file not found" in caso di assenza del file specificato nella direttiva "#embed".
- Funzionalità relative a C++:
- È stata aggiunta la funzionalità in fase di sviluppo nella specifica C++2c (C++26) che consente l'uso di binding strutturati nel contesto di "constexpr", ovvero i riferimenti a costanti ora possono essere essi stessi costanti. Il supporto è stato implementato per array e semplici strutture (i tuple non sono ancora supportati). constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
- In conformità con i requisiti dello standard C++20, è stata garantita la conversione delle restrizioni nella forma standard prima della verifica della loro esecuzione, consentendo così di emettere messaggi diagnostici più precisi e di gestire correttamente gli errori di sostituzione negli argomenti del template utilizzati solo nei concept-ids.
- È stata aggiunta la famiglia di funzioni integrate «__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship», che permette di verificare se gli operatori di confronto «», «=» sono stati sintetizzati dall'operatore «».
- Il parametro «-Wincompatible-pointer-types» ora genera un errore anziché un avviso. Per ripristinare il comportamento precedente, è necessario utilizzare l'opzione «-Wno-error=incompatible-pointer-types».
- Sono state aggiunte 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 comportamenti imprevisti tramite UBSan (-fsanitize=undefined -fsanitize-trap=undefined), è garantito l'inserimento di informazioni sui motivi degli errori nei dati di debug generati. È stato aggiunto il flag ‘-fsanitize-debug-trap-reasons’ per definire il livello di dettaglio delle informazioni sugli errori, che può assumere il valore ‘basic’ per descrizioni generali (ad esempio, ‘Overflow nell'addizione di interi’) e ‘detailed’ per includere informazioni dettagliate (ad esempio, ‘overflow nell'addizione di interi firmati in ‘a + b’).
- Sono stati aggiunti nuovi flag del compilatore:
- ‘-f[no-]sanitize-debug-trap-reasons’ per gestire l'inclusione delle cause degli errori (trap) nei dati di debug durante la compilazione in 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 gestire il posizionamento in memoria dei tipi matrice (ad esempio, column-major — per colonne, row-major — per righe).
- Per le funzioni è stato implementato l'attributo ‘malloc_span’, simile all'attributo malloc, ma applicato a funzioni che restituiscono strutture simili a span, contenenti un puntatore e un campo con una dimensione o un puntatore alla fine del blocco.
- È stato aggiunto l'attributo «modular_format» per la selezione dinamica della necessaria implementazione statica della funzione printf durante il link.
- Sono stati ampliati gli strumenti di diagnosi e analisi statica, con l'aggiunta di nuovi controlli (diverse dozzine di miglioramenti in ambito diagnostico).
- Nel backend per l'architettura X86 sono state aggiunte funzioni intrinseche addizionali per le estensioni SSE, AVX e AVX512. Sono stati introdotti i moduli di compilazione per processori Intel basati sulle microarchitetture Wildcat Lake (-march=wildcatlake) e Nova Lake (-march=novalake).
- Nel backend per l'architettura AArch64 è stato aggiunto il supporto per 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 funzioni intrinseche per le istruzioni FCVTZ[US], FCVTN[US], FCVTM[US], FCVTP[US], FCVTA[US]. È stato stabilizzato il supporto per FMV (Function Multi-Versioning). Gli utenti hanno la possibilità di ridefinire la priorità delle diverse versioni delle funzioni.
- È stato aggiunto il supporto per l'architettura LoongArch32 (LA32R, LA32S).
- Sono stati migliorati i backend per le architetture ARM, AMDGPU, RISC-V, LoongArch64, MIPS, WebAssembly e PowerPC.
Fonte: opennet.ru
