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:

  • Sono ora supportate le chiamate di coda garantite (una chiamata a una subroutine alla fine di una funzione, che crea una ricorsione di coda se la subroutine chiama se stessa). Le chiamate di coda garantite sono supportate utilizzando l'attributo "[[clang::musttail]]" in C++ e "__attribute__((musttail))" in C, utilizzato nell'istruzione "return". Questa funzionalità consente ottimizzazioni appiattisce il codice in un'iterazione piatta per risparmiare spazio nello stack.
  • Le definizioni degli attributi in stile C++11 sono ora supportate nelle dichiarazioni e nelle estensioni "using" di clang, 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 è impostato ma non utilizzato.
  • Aggiunto il flag "-Wnull-pointer-subtraction" per avvisare se il codice può causare un comportamento indefinito a causa dell'uso di un puntatore nullo nelle operazioni di sottrazione.
  • Aggiunto il flag "-fstack-usage" per generare per ogni file di codice un file ".su" aggiuntivo contenente informazioni sulla dimensione degli stack frame per ogni funzione definita nel file in fase di elaborazione.
  • L'analizzatore statico ha un nuovo tipo di output, "sarif-html", che genera report sia in formato HTML che Sarif. È stato aggiunto un nuovo controllo, allocClassWithName. L'opzione "-analyzer-display-progress" ora visualizza il tempo di analisi per ciascuna funzione. L'analizzatore di puntatori intelligenti (alpha.cplusplus.SmartPtr) è quasi completo.
  • Il supporto per OpenCL è stato ampliato. È stato 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. È stata proseguita l'implementazione della specifica OpenCL 3.0. Per C, OpenCL 1.2 viene utilizzato per impostazione predefinita, a meno che non venga selezionata esplicitamente una versione diversa. È stato aggiunto il supporto per i file con estensione ".clcpp" per C++.
  • È stato implementato il supporto per le direttive di trasformazione del ciclo ("#pragma omp unrol" e "#pragma omp tile") definite nella specifica OpenMP 5.1.
  • L'utilità clang-format è stata aggiornata con le seguenti opzioni: SpacesInLineCommentPrefix per specificare il numero di spazi prima dei commenti, IndentAccessModifiers, LambdaBodyIndentation e PPIndentWidth per controllare l'allineamento di record, espressioni lambda e direttive del preprocessore. Sono state ampliate le funzionalità di ordinamento dell'elenco dei file di intestazione (SortIncludes). È stato aggiunto il supporto per la formattazione dei file JSON.
  • Sono stati aggiunti numerosi nuovi controlli al linter clang-tidy.

Principali innovazioni in LLVM 13.0:

  • Aggiunta l'opzione "-ehcontrguard" per utilizzare la tecnologia CET (Windows Tecnologia di controllo del flusso (Control-flow Enforcement Technology) per la protezione, nella fase di gestione delle eccezioni, dall'esecuzione di exploit creati utilizzando tecniche di programmazione orientata al ritorno (ROP).
  • Il progetto debuginfo-test è stato rinominato cross-project-tests ed è progettato per testare componenti di progetti diversi, non limitandosi alle informazioni di debug.
  • Il sistema di compilazione supporta la creazione di più distribuzioni, ad esempio una con utilità e l'altra con librerie per sviluppatori.
  • Il backend per l'architettura AArch64 implementa il supporto per le estensioni Armv9-A RME (Realm Management Extension) e SME (Scalable Matrix Extension) nell'assembler.
  • È stato aggiunto il supporto per ISA V68/HVX al backend dell'architettura Hexagon.
  • Il backend x86 ha migliorato il supporto per i processori AMD Zen 3.
  • È stato 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". Per la piattaforma Windows Aggiunto il supporto per std::filesystem basato su MinGW. I file di intestazione sono stati separati. , E È stata aggiunta l'opzione di compilazione LIBCXX_ENABLE_INCOMPLETE_FEATURES per disabilitare i file di intestazione con funzionalità incomplete.
  • Il linker LLD è stato ampliato per supportare i processori Aarch64 Big-endian e il backend Mach-O è stato migliorato per consentire il linking di programmi standard. Sono stati inclusi i miglioramenti necessari per il linking di Glibc tramite LLD.
  • L'utilità llvm-mca (Machine Code Analyzer) è stata aggiornata per supportare i processori che eseguono istruzioni in ordine (pipeline superscalare in ordine), come ARM Cortex-A55.
  • Il debugger LLDB per la piattaforma AArch64 ora supporta pienamente l'autenticazione tramite puntatore, il meccanismo Memory Tagging Extension (MemTag) e i registri SVE. Sono stati aggiunti comandi per associare tag a ciascuna operazione di allocazione di memoria e per garantire che il puntatore sia associato al tag corretto durante l'accesso alla memoria.
  • Il debugger LLDB e il frontend Fortran, Flang, sono stati aggiunti agli assembly binari generati dal progetto.

Fonte: opennet.ru

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