Rilascio della suite del compilatore LLVM 13.0

Dopo sei mesi di sviluppo, è stato presentato il rilascio del progetto LLVM 13.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.

Miglioramenti in Clang 13.0:

  • Implementato il supporto per le chiamate in coda garantite (chiamare una subroutine alla fine di una funzione, formando una ricorsione in coda se la subroutine chiama se stessa). Il supporto per le chiamate in coda garantite è fornito dall'attributo "[[clang::musttail]]" in C++ e "__attribute__((musttail))" in C, utilizzato in un'istruzione "return". La funzionalità consente di implementare ottimizzazioni distribuendo il codice in un'iterazione flat per ridurre il consumo dello stack.
  • Le dichiarazioni "using" e le estensioni clang forniscono supporto per la definizione di attributi in stile C++11 utilizzando il formato "[[]]".
  • Aggiunto il flag "-Wreserved-identifier" per visualizzare un avviso quando si specificano identificatori riservati nel codice utente.
  • Aggiunti i flag "-Wunused-but-set-parameter" e "-Wunused-but-set-variable" per visualizzare un avviso se un parametro o una variabile viene impostato ma non utilizzato.
  • Aggiunto il flag "-Wnull-pointer-subtraction" per emettere un avviso se il codice potrebbe introdurre un comportamento indefinito a causa dell'uso di un puntatore nullo nelle operazioni di sottrazione.
  • Aggiunto il flag "-fstack-usage" per generare per ciascun file di codice un file ".su" aggiuntivo contenente informazioni sulla dimensione degli stack frame per ciascuna funzione definita nel file in elaborazione.
  • All'analizzatore statico è stato aggiunto un nuovo tipo di output: "sarif-html", che porta alla generazione di report simultaneamente nei formati HTML e Sarif. Aggiunto nuovo controllo allocClassWithName. Quando si specifica l'opzione “-analyzer-display-progress”, viene visualizzato il tempo di analisi di ciascuna funzione. L'analizzatore di puntatori intelligenti (alpha.cplusplus.SmartPtr) è quasi pronto.
  • Le funzionalità associate al supporto OpenCL sono state ampliate. Aggiunto il supporto per le nuove estensioni cl_khr_integer_dot_product, cl_khr_extended_bit_ops, __cl_clang_bitfields e __cl_clang_non_portable_kernel_param_types. L'implementazione della specifica OpenCL 3.0 è continuata. Per C, la specifica OpenCL 1.2 viene utilizzata per impostazione predefinita a meno che non venga selezionata esplicitamente un'altra versione. Per C++ è stato aggiunto il supporto per i file con estensione “.clcpp”.
  • È stato implementato il supporto per le direttive di trasformazione del loop ("#pragma omp unrol" e "#pragma omp tile") definite nella specifica OpenMP 5.1.
  • Aggiunte opzioni all'utilità clang-format: SpacesInLineCommentPrefix per definire il numero di spazi prima dei commenti, IndentAccessModifiers, LambdaBodyIndentation e PPIndentWidth per controllare l'allineamento delle voci, espressioni lambda e direttive del preprocessore. Sono state ampliate le possibilità di ordinare l'enumerazione dei file header (SortIncludes). Aggiunto supporto per la formattazione dei file JSON.
  • Gran parte dei nuovi controlli sono stati aggiunti al linter clang-tidy.

Principali innovazioni in LLVM 13.0:

  • Aggiunta l'opzione "-ehcontguard" per utilizzare la tecnologia CET (Windows Control-flow Enforcement Technology) per proteggere dall'esecuzione di exploit creati utilizzando tecniche ROP (Return-Oriented Programming) nella fase di gestione delle eccezioni.
  • Il progetto debuginfo-test è stato rinominato cross-project-tests ed è progettato per testare componenti di diversi progetti, non limitato alle informazioni di debug.
  • Il sistema di assemblaggio fornisce supporto per la creazione di diverse distribuzioni, ad esempio una con utilità e l'altra con librerie per sviluppatori.
  • Nel backend dell'architettura AArch64, nell'assembler è implementato il supporto per le estensioni Armv9-A RME (Realm Management Extension) e SME (Scalable Matrix Extension).
  • Il supporto per ISA V68/HVX è stato aggiunto al backend per l'architettura Hexagon.
  • Il backend x86 ha migliorato il supporto per i processori AMD Zen 3.
  • Aggiunto il supporto per l'APU GFX1013 RDNA2 al backend AMDGPU.
  • Libc++ continua a implementare nuove funzionalità degli standard C++20 e C++2b, incluso il completamento della libreria “concepts”. Aggiunto il supporto per std::filesystem per la piattaforma Windows basata su MinGW. File di intestazione separati , E . Aggiunta l'opzione di build LIBCXX_ENABLE_INCOMPLETE_FEATURES per disabilitare i file di intestazione con funzionalità non completamente implementate.
  • Le capacità del linker LLD sono state ampliate, in cui è implementato il supporto per i processori Big-endian Aarch64 e il backend Mach-O è stato portato a uno stato che consente il collegamento di programmi regolari. Inclusi miglioramenti necessari per collegare Glibc utilizzando LLD.
  • L'utility llvm-mca (Machine Code Analyser) ha aggiunto il supporto per i processori che eseguono istruzioni in ordine (pipeline superscalare in ordine), come ARM Cortex-A55.
  • Il debugger LLDB per la piattaforma AArch64 fornisce il supporto completo per l'autenticazione del puntatore, MTE (MemTag, Memory Tagging Extension) e i registri SVE. Aggiunti comandi che permettono di associare tag ad ogni operazione di allocazione della memoria e organizzare un controllo del puntatore in accesso alla memoria, che deve essere associato al tag corretto.
  • Agli assembly binari generati dal progetto sono stati aggiunti il ​​debugger LLDB e il frontend per il linguaggio Fortran - Flang.

Fonte: opennet.ru

Aggiungi un commento