Rilascio della suite del compilatore LLVM 15.0

Dopo sei mesi di sviluppo, è stato presentato il rilascio del progetto LLVM 15.0: un toolkit compatibile con GCC (compilatori, ottimizzatori e generatori di codice) che compila programmi in bitcode intermedio di istruzioni virtuali simili a RISC (una macchina virtuale di basso livello con un sistema di ottimizzazione multilivello). Lo pseudocodice generato può essere convertito utilizzando un compilatore JIT in istruzioni macchina direttamente al momento dell'esecuzione del programma.

Principali miglioramenti in Clang 15.0:

  • Per i sistemi basati sull'architettura x86 è stato aggiunto il flag “-fzero-call-used-regs” che garantisce che tutti i registri della CPU utilizzati nella funzione vengano azzerati prima di restituire il controllo alla funzione. Questa opzione consente di proteggersi dalla fuga di informazioni dalle funzioni e di ridurre di circa il 20% il numero di blocchi adatti alla creazione di gadget ROP (Return-Oriented Programming) negli exploit.
  • È stata implementata la randomizzazione del posizionamento in memoria delle strutture per il codice C, il che complica l'estrazione dei dati dalle strutture in caso di sfruttamento delle vulnerabilità. La randomizzazione viene attivata e disattivata utilizzando gli attributi randomize_layout e no_randomize_layout e richiede l'impostazione di un seme utilizzando il flag "-fradomize-layout-seed" o "-fradomize-layout-seed-file".
  • Aggiunto il flag "-fstrict-flex-arrays=" ", con il quale è possibile controllare i limiti per un elemento di array flessibile nelle strutture (Membri dell'array flessibile, un array di dimensioni indefinite alla fine della struttura). Se impostato su 0 (impostazione predefinita), l'ultimo elemento della struttura con un array viene sempre elaborato come un array flessibile, 1 - solo le dimensioni [], [0] e [1] vengono elaborate come un array flessibile, 2 - solo le dimensioni [] e [0] vengono elaborati come un array flessibile.
  • Aggiunto supporto sperimentale per il linguaggio simile a C HLSL (High-Level Shader Language), utilizzato in DirectX per scrivere shader.
  • Aggiunto "-Warray-parameter" per avvisare della sovrascrittura di funzioni con dichiarazioni di argomenti incompatibili associate ad array a lunghezza fissa e variabile.
  • Compatibilità migliorata con MSVC. Aggiunto il supporto per "#pragma function" (indica al compilatore di generare una chiamata di funzione anziché un'espansione inline) e "#pragma alloc_text" (definisce il nome della sezione con il codice della funzione) fornito in MSVC. Aggiunto il supporto per i flag /JMC e /JMC compatibili con MSVC.
  • Il lavoro continua per supportare i futuri standard C2X e C++23. Per il linguaggio C sono implementati: l'attributo noreturn, le parole chiave false e true, il tipo _BitInt(N) per gli interi con una determinata profondità di bit, le macro *_WIDTH, il prefisso u8 per i caratteri codificati UTF-8.

    Per C++ sono implementati: unione dei moduli, isolamento ABI dei membri delle funzioni, inizializzazione dinamica ordinata di variabili non locali nei moduli, operatori di indice multidimensionali, auto(x), variabili non letterali, goto ed etichette nelle funzioni dichiarate come constexpr , sequenze di escape delimitate, caratteri di escape denominati.

  • Le funzionalità associate al supporto OpenCL e OpenMP sono state ampliate. Aggiunto il supporto per l'estensione OpenCL cl_khr_subgroup_rotate.
  • Per l'architettura x86 è stata aggiunta la protezione contro le vulnerabilità dei processori causate dall'esecuzione speculativa di istruzioni dopo operazioni di salto in avanti incondizionate. Il problema si verifica a causa dell'elaborazione preventiva delle istruzioni immediatamente successive all'istruzione di salto in memoria (SLS, Straight Line Speculation). Per abilitare la protezione, viene proposta l'opzione “-mharden-sls=[none|all|return|indirect-jmp]”.
  • Per le piattaforme che supportano l'estensione SSE2 è stato aggiunto il tipo _Float16 che viene emulato utilizzando il tipo float in caso di mancato supporto alle istruzioni AVX512-FP16.
  • Aggiunto il flag "-m[no-]rdpru" per controllare l'uso dell'istruzione RDPRU, supportato a partire dai processori AMD Zen2.
  • Aggiunto il flag "-mfunction-return=thunk-extern" per proteggersi dalla vulnerabilità RETBLEED, che funziona aggiungendo una sequenza di istruzioni che esclude il coinvolgimento del meccanismo di esecuzione speculativa per i rami indiretti.

Principali innovazioni in LLVM 15.0:

  • Aggiunto supporto per CPU Cortex-M85, architetture Armv9-A, Armv9.1-A e Armv9.2-A, estensioni Armv8.1-M PACBTI-M.
  • È stato aggiunto un backend sperimentale per DirectX che supporta il formato DXIL (DirectX Intermediate Language) utilizzato per gli shader DirectX. Il backend viene abilitato specificando il parametro "-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX" durante l'assemblaggio.
  • Libc++ continua a implementare nuove funzionalità degli standard C++20 e C++2b, incluso il completamento dell'implementazione della libreria “format” e la proposta di versione sperimentale della libreria “ranges”.
  • Backend migliorati per architetture x86, PowerPC e RISC-V.
  • Le funzionalità del linker LLD e del debugger LLDB sono state migliorate.

Fonte: opennet.ru

Aggiungi un commento