Rilascio della suite del compilatore LLVM 9.0

Dopo sei mesi di sviluppo presentata rilascio del progetto LLVM 9.0 - Strumenti compatibili con GCC (compilatori, ottimizzatori e generatori di codice) che compilano programmi in un bitcode intermedio di istruzioni virtuali simili a RISC (una macchina virtuale di basso livello con un sistema di ottimizzazione multilivello). Lo pseudo-codice generato può essere convertito dal compilatore JIT in istruzioni macchina proprio al momento dell'esecuzione del programma.

Le nuove funzionalità di LLVM 9.0 includono la rimozione del tag di progettazione sperimentale dalla piattaforma RISC-V di destinazione, il supporto C++ per OpenCL, la possibilità di dividere un programma in parti caricate dinamicamente in LLD e l'implementazione del "asm vai a", utilizzato nel codice del kernel Linux. libc++ ha aggiunto il supporto per WASI (WebAssembly System Interface) e LLD ha aggiunto il supporto iniziale per il collegamento dinamico WebAssembly.

Miglioramenti in Clang 9.0:

  • Aggiunto da implementazione dell'espressione specifica del GCC "asm vai a“, che permette di passare da un blocco inline assembler a un’etichetta in codice C. Questa funzionalità è necessaria per compilare il kernel Linux in modalità “CONFIG_JUMP_LABEL=y” utilizzando Clang su sistemi con architettura x86_64. Tenendo conto delle modifiche aggiunte nelle versioni precedenti, il kernel Linux ora può essere compilato in Clang per l'architettura x86_64 (in precedenza era supportata solo la compilazione per le architetture arm, aarch64, ppc32, ppc64le e mips). Inoltre, i progetti Android e ChromeOS sono già stati convertiti per utilizzare Clang per la creazione del kernel e Google sta testando Clang come piattaforma principale per la creazione di kernel per i suoi sistemi Linux di produzione. In futuro, altri componenti LLVM potranno essere utilizzati nel processo di compilazione del kernel, inclusi LLD, llvm-objcopy, llvm-ar, llvm-nm e llvm-objdump;
  • Aggiunto supporto sperimentale per l'utilizzo di C++17 in OpenCL. Le caratteristiche specifiche includono il supporto per gli attributi dello spazio degli indirizzi, il blocco della conversione dello spazio degli indirizzi da parte degli operatori di casting del tipo, la fornitura di tipi vettoriali come in OpenCL per C, la presenza di tipi OpenCL specifici per immagini, eventi, canali, ecc.
  • Aggiunti nuovi flag del compilatore “-ftime-trace” e “-ftime-trace-granularity=N” per generare un report sul tempo di esecuzione delle varie fasi del frontend (analisi, inizializzazione) e backend (fasi di ottimizzazione). Il report viene salvato in formato json, compatibile con chrome://tracing e speedscope.app;
  • Aggiunta l'elaborazione dell'identificatore "__declspec(allocator)" e la generazione di informazioni di debug associate che consentono di monitorare il consumo di memoria nell'ambiente Visual Studio;
  • Per il linguaggio C è stato aggiunto il supporto per la macro “__FILE_NAME__”, che assomiglia alla macro “__FILE__”, ma include solo il nome del file senza il percorso completo;
  • C++ ha ampliato il supporto per gli attributi dello spazio degli indirizzi per coprire varie funzionalità C++, inclusi modelli di parametri e argomenti, tipi di riferimento, inferenza del tipo restituito, oggetti, funzioni generate automaticamente, operatori incorporati e altro ancora.
  • Le funzionalità associate al supporto per OpenCL, OpenMP e CUDA sono state ampliate. Ciò include il supporto iniziale per l'inclusione implicita delle funzioni OpenCL integrate (è stato aggiunto il flag "-fdeclare-opencl-builtins"), l'estensione cl_arm_integer_dot_product è stata implementata e gli strumenti diagnostici sono stati ampliati;
  • Il lavoro dell'analizzatore statico è stato migliorato ed è stata aggiunta la documentazione sull'esecuzione dell'analisi statica. Aggiunti flag per visualizzare i moduli di controllo disponibili e le opzioni supportate (“-analyzer-checker[-option]-help”, “-analyzer-checker[-option]-help-alpha” e “-analyzer-checker[-option]-help " -sviluppatore"). Aggiunto il flag "-analyzer-werror" per trattare gli avvisi come errori.
    Aggiunte nuove modalità di verifica:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling per identificare pratiche non sicure per lavorare con i buffer;
    • osx.MIGChecker per ricercare violazioni delle regole di chiamata MIG (Mach Interface Generator);
    • optin.osx.OSObjectCStyleCast per trovare conversioni errate di oggetti libkern XNU;
    • apiModeling.llvm con una serie di funzioni di controllo della modellazione per rilevare errori nella codebase LLVM;
    • Codice stabilizzato per il controllo di oggetti C++ non inizializzati (UninitializedObject nel pacchetto optin.cplusplus);
  • L'utilità clang-format ha aggiunto il supporto per la formattazione del codice nel linguaggio C# e fornisce supporto per lo stile di formattazione del codice utilizzato da Microsoft;
  • clang-cl, un'interfaccia della riga di comando alternativa che fornisce compatibilità a livello di opzione con il compilatore cl.exe incluso in Visual Studio, ha aggiunto l'euristica per trattare i file inesistenti come opzioni della riga di comando e visualizzare un avviso corrispondente (ad esempio, durante l'esecuzione di "clang-cl /diagnostic :caret /c test.cc");
  • Gran parte dei nuovi controlli sono stati aggiunti a linter clang-tidy, inclusi controlli aggiuntivi specifici per l'API OpenMP;
  • allargato capacità del server clangd (Clang Server), in cui la modalità di creazione dell'indice in background è abilitata per impostazione predefinita, è stato aggiunto il supporto per azioni contestuali con codice (recupero di variabili, espansione delle definizioni automatiche e macro, conversione di stringhe con escape in stringhe senza escape), la possibilità di visualizzare avvisi da Clang-tidy, diagnostica estesa degli errori nei file di intestazione e aggiunta la possibilità di visualizzare informazioni sulla gerarchia dei tipi;

Il principale innovazioni LLVM 9.0:

  • Al linker LLD è stata aggiunta una funzionalità di partizionamento sperimentale che consente di dividere un programma in più parti, ciascuna delle quali si trova in un file ELF separato. Questa funzione ti consente di avviare la parte principale del programma, che caricherà altri componenti secondo necessità durante il funzionamento (ad esempio, puoi separare il visualizzatore PDF integrato in un file separato, che verrà caricato solo quando l'utente apre il PDF file).

    Collegamento LLD non dichiarata ad uno stato adatto per collegare il kernel Linux per le architetture arm32_7, arm64, ppc64le e x86_64.
    Nuove opzioni "-" (output su stdout), "-[no-]allow-shlib-unfine", "-unfine-glob", "-nmagic", "-omagic", "-dependent-library", " - z ifunc-noplt" e "-z dimensione-pagina-comune". Per l'architettura AArch64 è stato aggiunto il supporto per le istruzioni BTI (Branch Target Indicator) e PAC (Pointer Authentication Code). Il supporto per le piattaforme MIPS, RISC-V e PowerPC è stato notevolmente migliorato. Aggiunto supporto iniziale per il collegamento dinamico per WebAssembly;

  • In libc++ implementato le funzioni ssize, std::is_constant_evaluated, std::midpoint e std::lerp, i metodi “front” e “back” sono stati aggiunti a std::span, gli attributi dei tipi std::is_unbounded_array e std::is_bounded_array sono stati aggiunti , le funzionalità std sono state ampliate: :atomic. Il supporto per GCC 4.9 è stato interrotto (può essere utilizzato con GCC 5.1 e versioni più recenti). Aggiunto supporto ERO IO (WebAssembly System Interface, un'interfaccia per l'utilizzo di WebAssembly al di fuori del browser);
  • Sono state aggiunte nuove ottimizzazioni. Abilitata la conversione delle chiamate memcmp a bcmp in alcune situazioni. Implementata l'omissione del controllo dell'intervallo per le tabelle di salto in cui i blocchi di interruttori inferiori non sono raggiungibili o quando le istruzioni non vengono utilizzate, ad esempio quando si chiamano funzioni con tipo void;
  • È stato stabilizzato il backend per l'architettura RISC-V, che non è più posizionata come sperimentale ed è costruita per impostazione predefinita. Fornisce il supporto completo per la generazione di codice per le varianti del set di istruzioni RV32I e RV64I con estensioni MAFDC;
  • Sono stati apportati numerosi miglioramenti ai backend per le architetture X86, AArch64, ARM, SystemZ, MIPS, AMDGPU e PowerPC. Ad esempio, per l'architettura
    AArch64 ha aggiunto il supporto per le istruzioni SVE2 (Scalable Vector Extension 2) e MTE (Memory Tagging Extensions); nel backend ARM è stato aggiunto il supporto per l'architettura Armv8.1-M e l'estensione MVE (M-Profile Vector Extension). Il supporto per l'architettura GFX10 (Navi) è stato aggiunto al backend AMDGPU, le funzionalità di chiamata alle funzioni sono abilitate per impostazione predefinita e viene attivato un pass combinato DPP (Primitive dati-parallele).

  • Il debugger LLDB ora dispone di un'evidenziazione a colori per i backtrace e ha aggiunto il supporto per i blocchi debug_types DWARF4 e debug_info DWARF5;
  • Il supporto per file oggetto ed eseguibili in formato COFF è stato aggiunto alle utilità llvm-objcopy e llvm-strip.

Fonte: opennet.ru

Aggiungi un commento