Dopo sei mesi di sviluppo, è stato presentato il rilascio del progetto LLVM 13.0, un insieme di strumenti compatibili con GCC (compilatori, ottimizzatori e generatori di codice), che compila i programmi in codice intermedio a istruzioni virtuali simili a RISC (una macchina virtuale a basso livello con un sistema di ottimizzazione multi-livello). Il codice pseudogenerato può essere trasformato tramite un compilatore JIT in istruzioni di macchina al momento dell'esecuzione del programma.
Miglioramenti in Clang 13.0:
- È stata implementata la supporto delle chiamate di coda garantite (una chiamata a una sottoprogramma alla fine di una funzione, che forma una ricorsione a coda se la sottoprogramma chiama se stessa). Il supporto per le chiamate di coda garantite è stato fornito tramite l’attributo «[[clang::musttail]]» in C++ e «__attribute__((musttail))» in C, usati nell’espressione «return». Questa possibilità consente di implementare ottimizzazioni attraverso lo sviluppo del codice in un’iterazione piatta per risparmiare sull’uso dello stack.
- Nelle dichiarazioni «using» e nelle estensioni, clang ha implementato il supporto per la definizione di attributi in stile C++11, utilizzando il formato «[[]]».
- È stato aggiunto il flag «-Wreserved-identifier» per emettere un avviso quando si specificano identificatori riservati nel codice dell'utente.
- Sono stati aggiunti i flag «-Wunused-but-set-parameter» e «-Wunused-but-set-variable» per emettere un avviso se un parametro o una variabile sono impostati ma non utilizzati.
- È stato aggiunto il flag «-Wnull-pointer-subtraction» per emettere un avviso se il codice può portare a comportamenti indefiniti a causa dell'uso di un puntatore nullo nelle operazioni di sottrazione.
- È stato aggiunto il flag «-fstack-usage» per generare un file aggiuntivo «.su» per ciascun file di codice, contenente informazioni sulle dimensioni dello stack per ogni funzione definita nel file elaborato.
- Nel analizzatore statico è stato aggiunto un nuovo tipo di output — «sarif-html», che genera rapporti simultaneamente nei formati HTML e Sarif. È stata aggiunta una nuova verifica allocClassWithName. Specificando l'opzione «-analyzer-display-progress» si garantisce l'output del tempo di analisi di ogni funzione. L'analizzatore dei puntatori intelligenti (alpha.cplusplus.SmartPtr) è quasi pronto.
- Sono state ampliate le funzionalità relative al supporto OpenCL. Aggiunto il supporto per nuove estensioni cl_khr_integer_dot_product, cl_khr_extended_bit_ops, __cl_clang_bitfields e __cl_clang_non_portable_kernel_param_types. Continuata l'implementazione della specifica OpenCL 3.0. Per C, la specifica OpenCL 1.2 è utilizzata per impostazione predefinita, a meno che non venga selezionata esplicitamente un'altra versione. Per C++, è stato aggiunto il supporto per file con estensione «.clcpp».
- Implementato il supporto per le direttive di trasformazione dei cicli («#pragma omp unrol» e «#pragma omp tile») definite nella specifica OpenMP 5.1.
- Nell'utility clang-format sono state aggiunte opzioni: SpacesInLineCommentPrefix per definire il numero di spazi prima dei commenti, IndentAccessModifiers, LambdaBodyIndentation e PPIndentWidth per gestire l'allineamento delle dichiarazioni, delle espressioni lambda e delle direttive del preprocessore. Ampliate le funzionalità di ordinamento delle inclusioni di file header (SortIncludes). Aggiunto il supporto per il formato dei file JSON.
- Nel linter clang-tidy è stata aggiunta una grande serie di nuove verifiche.
Novità principali di LLVM 13.0:
- È stata aggiunta l'opzione «-ehcontguard» per l'utilizzo della tecnologia CET (Windows Control-flow Enforcement Technology) per proteggere il processo di gestione delle eccezioni dall'esecuzione di exploit basati su tecniche di programmazione orientata al ritorno (ROP, Return-Oriented Programming).
- Il progetto debuginfo-test è stato rinominato in cross-project-tests ed è progettato per testare componenti di diversi progetti, senza limitarsi alle informazioni di debug.
- Nel sistema di build è stata garantita la supporto per la costruzione di più distribuzioni, ad esempio, una con strumenti e un'altra con librerie per sviluppatori.
- Nel backend per architettura AArch64 è stato implementato il supporto per le estensioni Armv9-A RME (Realm Management Extension) e SME (Scalable Matrix Extension) nell'assembly.
- Nel backend per architettura Hexagon è stato aggiunto il supporto ISA V68/HVX.
- Nel backend per architettura x86 è stato migliorato il supporto per i processori AMD Zen 3.
- Nel backend AMDGPU è stato aggiunto il supporto per APU GFX1013 RDNA2.
- In Libc++, è proseguita l'implementazione delle nuove funzionalità degli standard C++20 e C++2b, inclusa la conclusione dell'implementazione della libreria "concepts". Per la piattaforma Windows basata su MinGW è stato aggiunto il supporto per std::filesystem. I file di intestazione , e sono stati separati. È stata aggiunta un'opzione di compilazione LIBCXX_ENABLE_INCOMPLETE_FEATURES per disabilitare i file di intestazione con funzionalità non completamente implementate.
- Le funzionalità del linker LLD sono state ampliate, con il supporto per i processori Big-endian Aarch64, mentre il backend Mach-O è stato portato a uno stato che consente di collegare programmi normali. Sono stati inclusi miglioramenti necessari per il collegamento di Glibc utilizzando LLD.
- Nell'utility llvm-mca (Machine Code Analyzer) è stato aggiunto il supporto per i processori che eseguono istruzioni in ordine (in-order superscalar pipeline), come ARM Cortex-A55.
- Nel debugger LLDB per la piattaforma AArch64 è implementato un supporto completo per l'autenticazione dei puntatori, il meccanismo MTE (MemTag, Memory Tagging Extension) e i registri SVE. Sono state aggiunte comandi che consentono di collegare i tag a ogni operazione di allocazione di memoria e di organizzare una verifica del puntatore durante l'accesso alla memoria, il quale deve essere associato al tag corretto.
- Nella composizione delle build binarie generate dal progetto sono stati aggiunti il debugger LLDB e il frontend per il linguaggio Fortran — Flang.
Fonte: opennet.ru
