È stata rilasciata la suite di compilatori LLVM 11.0

Dopo sei mesi di sviluppo presentato rilascio del progetto LLVM 11.0 — strumenti compatibili con GCC (compilatori, ottimizzatori e generatori di codice) che compilano programmi in codice intermedio bitcode di istruzioni virtuali simili a RISC (una macchina virtuale a basso livello con un sistema di ottimizzazioni multilivello). Il pseudocodice generato può essere convertito mediante un compilatore JIT in istruzioni di macchina al momento dell'esecuzione del programma.

Una delle principali novità del nuovo rilascio è l'inclusione di Flang, un frontend per il linguaggio Fortran. Flang supporta Fortran 2018, OpenMP 4.5 e OpenACC 3.0, ma lo sviluppo del progetto non è ancora completato e il frontend si limita all'analisi del codice e alla verifica della sua correttezza. La generazione di codice intermedio LLVM non è ancora supportata e per formare file eseguibili viene generato un codice canonico, che viene passato a un compilatore Fortran esterno.

Miglioramenti in Clang 11.0:

  • È stata aggiunta la possibilità di recuperare l'albero sintattico astratto (AST) per codice non corretto in C++, che può essere utilizzato per semplificare la diagnosi degli errori e fornire informazioni aggiuntive a strumenti esterni come clang-tidy e clangd. Questa opzione è abilitata di default per il codice C++ ed è controllata tramite le opzioni '-Xclang -f[no-]recovery-ast'.
  • Sono stati aggiunti nuovi modi di diagnosi:
    • '-Wpointer-to-int-cast' — un gruppo di avvisi sulla conversione di puntatori a tipi interi int che non possono contenere tutti i possibili valori.
    • «-Wuninitialized-const-reference» — avviso sulla trasmissione di variabili non inizializzate come argomenti in funzioni che accettano riferimenti con la caratteristica «const».
    • «-Wimplicit-const-int-float-conversion» — avviso abilitato per impostazione predefinita relativo alla conversione implicita di una costante floating-point in un tipo intero.
  • Per la piattaforma ARM sono disponibili funzioni predefinite nel compilatore C (Intrinsics), sostituite da istruzioni vettoriali efficienti Arm v8.1-M MVE e CDE. Le funzioni disponibili sono definite nei file di intestazione arm_mve.h e arm_cde.h.
  • Aggiunto set di tipi interi estesi _ExtInt(N), che consentono la creazione di tipi non potenza di due, che possono essere elaborati in modo efficiente su FPGA/HLS. Ad esempio, _ExtInt(7) definisce un tipo intero composto da 7 bit.
  • Aggiunti macro che definiscono il supporto per le funzioni C integrate basate su istruzioni ARM SVE (Scalable Vector Extension):
    __ARM_FEATURE_SVE, __ARM_FEATURE_SVE_BF16,
    __ARM_FEATURE_SVE_MATMUL_FP32, __ARM_FEATURE_SVE_MATMUL_FP64,
    __ARM_FEATURE_SVE_MATMUL_INT8,
    __ARM_FEATURE_SVE2, __ARM_FEATURE_SVE2_AES,
    __ARM_FEATURE_SVE2_BITPERM,
    __ARM_FEATURE_SVE2_SHA3,
    __ARM_FEATURE_SVE2_SM4. Ad esempio, il macro __ARM_FEATURE_SVE è definito durante la generazione del codice AArch64 con l'opzione della riga di comando «-march=armv8-a+sve».
  • Il flag «-O» ora è associato alla modalità di ottimizzazione «-O1» invece di «-O2».
  • Sono stati aggiunti nuovi flag del compilatore:
    • «-fstack-clash-protection» — attiva la protezione contro intersezione tra stack e heap.
    • «-ffp-exception-behavior={ignore,maytrap,strict}» — consente di scegliere la modalità del gestore di eccezioni per numeri in virgola mobile.
    • «-ffp-model={precise,strict,fast}» — semplifica l'accesso a una serie di opzioni specializzate per numeri in virgola mobile.
    • «-fpch-codegen» e «-fpch-debuginfo» per generare un'intestazione precompilata (PCH) con file oggetto separati per il codice e debuginfo.
    • «-fsanitize-coverage-allowlist» e «-fsanitize-coverage-blocklist» per controllare le liste bianche e nere del testing di coverage.
    • «-mtls-size={12,24,32,48}» per scegliere la dimensione del TLS (thread-local storage).
    • «-menable-experimental-extension» per attivare estensioni sperimentali RISC-V.
  • Per impostazione predefinita, per C è attivata la modalità «-fno-common», che consente di migliorare l'efficienza dell'accesso alle variabili globali su alcune piattaforme.
  • La cache dei moduli di default è stata trasferita da /tmp alla directory ~/.cache. Per sovrascrivere, è possibile utilizzare il flag «-fmodules-cache-path=».
  • Lo standard di linguaggio C applicato per default è stato aggiornato da gnu11 a gnu17.
  • È stato aggiunto il supporto preliminare per l'estensione C di GNU «asm inline» per inserire segmenti di assembly. L'estensione è attualmente solo analizzata, ma non viene elaborata.
  • Ampliate le funzionalità relative al supporto di OpenCL e CUDA. Aggiunto il supporto per la diagnostica dei blocchi OpenCL 2.0 e implementate nuove funzionalità OpenMP 5.0.
  • Nell'utilità clang-format è stata aggiunta l'opzione IndentExternBlock per l'allineamento all'interno dei blocchi extern «C» e extern «C++».
  • Nel analizzatore statico sono state migliorate le operazioni con i costruttori ereditati in C++. Aggiunti nuovi controlli alpha.core.C11Lock e alpha.fuchsia.Lock per verificare i blocchi, alpha.security.cert.pos.34c per identificare l'uso non sicuro di putenv, webkit.NoUncountedMemberChecker e webkit.RefCntblBaseVirtualDtor per identificare problemi con i tipi non conteggiabili, alpha.cplusplus.SmartPtr per controllare la dereferenziazione di un puntatore intelligente nullo.
  • Nel linter clang-tidy aggiunta è stata introdotta una grande quantità di nuove verifiche.
  • Nel server di caching clangd (Clang Server) migliorata la prestazione e aggiunte nuove funzionalità di diagnostica.

Principali novità LLVM 11.0:

  • Il sistema di build è stato migrato all'uso di Python 3. Se Python 3 non è disponibile, è stata implementata la possibilità di tornare a Python 2.
  • Nel rilascio è stata esclusa la parte front-end del compilatore per il linguaggio Go (llgo), che potrebbe essere ristrutturata in futuro.
  • Nella rappresentazione intermedia (IR) è stato aggiunto l'attributo vector-function-abi-variant per descrivere il mapping tra funzioni scalari e vettoriali per la vettorializzazione delle chiamate. Sono stati distinti due tipi vettoriali separati da llvm::VectorType: llvm::FixedVectorType e llvm::ScalableVectorType.
  • È stato riconosciuto un comportamento indefinito quando il branching si basa su valori udef e quando vengono passati valori undef alle funzioni della libreria standard. In
    memset/memcpy/memmove è consentito passare puntatori undef, ma se il parametro di dimensione è pari a zero.
  • In LLJIT è stata aggiunta la supporto per l'esecuzione delle inizializzazioni statiche tramite i metodi LLJIT::initialize e LLJIT::deinitialize. È stata implementata la possibilità di aggiungere librerie statiche a JITDylib utilizzando la classe StaticLibraryDefinitionGenerator. È stata aggiunta un'API C per ORCv2 (API per la costruzione di compilatori JIT).
  • Nel backend per l'architettura AArch64 è stato aggiunto il supporto per i processori Cortex-A34, Cortex-A77, Cortex-A78 e Cortex-X1. Sono state implementate le estensioni ARMv8.2-BF16 (BFloat16) e ARMv8.6-A, comprese RMv8.6-ECV (Enhanced Counter Virtualization), ARMv8.6-FGT (Fine Grained Traps), ARMv8.6-AMU (virtualizzazione dei monitor di attività) e ARMv8.0-DGH (Data gathering hint). È stata garantita la possibilità di generare codice per funzioni di wrapping incorporate alle istruzioni vettoriali SVE.
  • Nel backend per l'architettura ARM è stata aggiunta la supporto per i processori Cortex-M55, Cortex-A77, Cortex-A78 e Cortex-X1. Sono state implementate estensioni
    Armv8.6-A Matrix Multiply e RMv8.2-AA32BF16 BFloat16.
  • Nel backend per l'architettura PowerPC è stata aggiunta la generazione di codice per i processori POWER10. Sono state ampliate le ottimizzazioni dei cicli e migliorato il supporto per le operazioni in virgola mobile.
  • Nel backend per l'architettura RISC-V è stata autorizzata la ricezione di patch con supporto per set di istruzioni estesi sperimentali, ancora non ufficialmente approvati.
  • Il backend per l'architettura AVR è stato spostato dalla categoria sperimentale a quella stabile, incluso nella fornitura di base.
  • Nel backend per l'architettura x86 è stato implementato il supporto per le istruzioni Intel AMX e TSXLDTRK. È stata aggiunta una protezione contro gli attacchi LVI (Load Value Injection), ed è stato realizzato un meccanismo comune di soppressione degli effetti collaterali di esecuzione speculativa per bloccare gli attacchi causati dall'esecuzione speculativa delle operazioni nella CPU.
  • Nel backend per l'architettura SystemZ è stato aggiunto il supporto per MemorySanitizer e LeakSanitizer.
  • In Libc++ è stato aggiunto il supporto per l'intestazione con costanti matematiche <numbers>.
  • Espansi funzionalità del linker LLD. Migliorato il supporto per il formato ELF, incluse le opzioni «—lto-emit-asm», «—lto-whole-program-visibility», «—print-archive-stats», «—shuffle-sections», «—thinlto-single-module», «—unique», «—rosegment», «—threads=N». Aggiunta l'opzione «—time-trace» per salvare la tracciabilità in un file, che può poi essere analizzato tramite l'interfaccia chrome://tracing in Chrome.

Fonte: opennet.ru

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