Rilascio del set di compilatori LLVM 21

Dopo sei mesi di sviluppo, è stato rilasciato il progetto LLVM 21.1.0, che sviluppa strumenti (compilatori, ottimizzatori e generatori di codice) per compilare programmi in codice intermedio di istruzioni virtuali simili a RISC (una macchina virtuale a basso livello con un sistema di ottimizzazioni multilivello). Il pseudocodice generato può essere trasformato in codice macchina per una piattaforma target specifica o utilizzato da un compilatore JIT per generare istruzioni macchina direttamente durante l'esecuzione del programma. Basato sulle tecnologie LLVM, il progetto sviluppa il compilatore Clang, che supporta i linguaggi di programmazione C, C++ e Objective-C. A partire dalla versione 18.x, il progetto ha adottato un nuovo schema per la numerazione delle versioni, secondo il quale la versione iniziale («N.0») è utilizzata durante lo sviluppo, mentre la prima versione stabile è contrassegnata con il numero «N.1».

Tra i miglioramenti in Clang 21:

  • Funzionalità relative a C++:
    • In analogia con GCC, è stata implementata la possibilità di utilizzare espressioni costanti nelle inserzioni di assembly definite dalla direttiva «asm»: int foo() { asm((std::string_view(«nop»)) ::: (std::string_view(«memory»))); }
    • Sono state aggiunte opzioni avanzate per le espressioni «new» e «delete», che supportano l'argomento «std::type_identity», attraverso il quale è possibile specificare informazioni sul tipo di oggetto per il quale viene allocata o deallocata memoria.
    • È stata aggiunta la possibilità di calcolare funzioni lambda che catturano legami strutturati (structured binding) in fase di compilazione nel contesto di un'espressione costante.
  • Funzionalità legate al futuro standard C++2c (C++26):
    • Nelle strutture di binding è stata aggiunta la possibilità di utilizzare la sintassi «…» per specificare pacchetti (pack), che raccolgono il numero rimanente di elementi dalla sequenza assegnata. auto [x,y,z] = f(); // nelle variabili x, y, z verranno memorizzati i tre elementi restituiti da f(). auto […xs] = f(); // nel pacchetto xs verranno memorizzati tutti gli elementi restituiti da f(). auto [x, …rest] = f(); // In x verrà memorizzato il primo elemento e in rest i restanti. auto [x, y, …rest] = f(); // In x verrà memorizzato il primo elemento, in y il secondo e in rest il terzo. auto [x, …rest, z] = f(); // in x il primo, in rest il secondo, in z il terzo.
    • È stata aggiunta la supporto per la «trivial relocation» di tipi (Trivial Relocatability), consentendo di ottimizzare gli spostamenti di oggetti di un dato tipo attraverso la loro clonazione in memoria senza invocare costruttori o distruttori. Per le classi sono state implementate le proprietà memberwise_trivially_relocatable e memberwise_replaceable, e per il movimento a basso livello di uno o più oggetti sono state aggiunte le funzioni trivially_relocate_at e trivially_relocate.
    • Possibilità di utilizzare il binding strutturato (structured binding) come condizione negli operatori if e switch.
    • È stata implementata la possibilità di collegare la funzione main a un modulo globale e di definire la funzione main in moduli nominati.
  • Funzionalità in sviluppo per il futuro standard C2y:
    • È stato risolto il comportamento indefinito nell'uso di espressioni con tipo void in alcuni contesti, ad esempio, «(void)(void)1;».
    • È consentito non terminare il file di codice sorgente con il carattere di nuova riga.
    • Sono stati aggiunti nuovi prefissi per i letterali ottali — 0o e 0O, così come sequenze di escape ottali e esadecimali «\o{…}» e \x{…}. Il supporto per i letterali ottali 0xxx è stato deprecato. Ad esempio, «0o123» e «\o{123}» invece di «0123».
    • Aggiunto l'operatore «_Countof» per determinare il numero di elementi in un array. È stato inoltre aggiunto il file di intestazione stdcountof.h, che definisce la variante del macro «countof», implementata tramite «_Countof».
  • Funzionalità definite nello standard C23:
    • Consentito il ridefinimento dei tipi di tag (struct, union, enum) all'interno di un solo blocco di traduzione, se le definizioni ripetute sono structuralmente equivalenti (stesso numero di membri, stessi tipi e nomi dei tag).
    • Semplificato l'uso di elenchi con numero variabile di argomenti (variadic). Consentito utilizzare un singolo parametro variadico nel nome del tipo.
    • Aggiunta la funzione incorporata compatibile con GCC «__builtin_c23_va_start()», che migliora il comportamento diagnostico per il macro va_start() in modalità C23.
  • In modalità di compatibilità con il compilatore MSVC, consentito l'uso del modificatore inline nella dichiarazione del tipo di funzione tramite typedef, ad esempio, «typedef int inline Foo(int);».
  • Consentita l'uso del qualificatore «restrict» per i tipi di array con elementi puntatori.
  • Nuove avvertenze del compilatore:
    • «-Wdefault-const-init-var» e «-Wdefault-const-init-field» — identificazione delle variabili e dei campi contrassegnati come const, definiti senza inizializzazione esplicita.
    • «-Wimplicit-void-ptr-cast» — emesso durante la conversione implicita da tipo «void*» a un altro tipo di puntatore.
    • «-Wc++-keyword» — emesso durante l'uso delle parole chiave «C++» come identificatori in «C».
    • «-Wc++-hidden-decl» — identifica l'uso di tipi di tag visibili in «C», ma non visibili in «C++» a causa delle limitazioni di visibilità.
    • «-Wimplicit-int-enum-cast» — identifica le conversioni implicite nel codice C da tipi interi a tipi enumerati incompatibili con «C++».
    • «-Wtentative-definition-compat» — diagnostica definizioni preliminari in «C» con più definizioni incompatibili con «C++».
    • «-Wunterminated-string-initialization» e «-Wc++-unterminated-string-initialization» — identificano situazioni di inizializzazione da un letterale stringa, dove non è possibile conservare un delimitatore con codice nullo. Per segnare i campi e le variabili nel codice C che non richiedono un carattere nullo finale, è stato aggiunto l'attributo «nonstring».
    • «-Wjump-misses-init» — diagnostica un passaggio attraverso goto o switch/case che salta l'inizializzazione di una variabile locale.
    • «-Wundef-true» — avverte sull'uso del valore «true» nel preprocessore C senza definizione.
    • «-Wnrvo» — diagnostica per NRVO (Named Return Value Optimization) mancanti.
  • Nuovi flag del compilatore:
    • «-fprofile-continuous» — abilitazione della sincronizzazione continua del profilo nel file.
    • «-ftime-report-json» — output delle informazioni sui tempi di compilazione in formato JSON.
    • «-ignore-pch» — disabilitazione delle intestazioni precompilate.
    • «-fthinlto-distributor» e «-Xthinlto-distributor» — per applicare DTLTO (Integrated Distributed ThinLTO).
    • «-static-libclosure» — per il collegamento statico delle estensioni runtime Blocks su piattaforma Windows.
  • Ampliate le risorse di diagnostica e analisi statica, aggiunti nuovi controlli (oltre centinaio di miglioramenti legati alla diagnostica).
  • Migliorati i backend per le architetture ARM, Aarch64, AMDGPU, x86, RISC-V, LoongArch, MIPS e PowerPC. Nel backend per RISC-V è stata aggiunta il supporto sperimentale per l'assemblatore per [[https://llvm.org/docs/RISCVUsage.html le estensioni Qualcomm uC, Andes e SiFive.

Fonte: opennet.ru

Acquista un hosting affidabile per siti con protezione DDoS, server VPS VDS 🔥 Acquista un hosting affidabile per siti con protezione DDoS, server VPS VDS | ProHoster