Lansarea suitei de compilare LLVM 11.0

După șase luni de dezvoltare prezentat lansarea proiectului LLVM 11.0 — Instrumente compatibile cu GCC (compilatoare, optimizatoare și generatoare de cod), compilarea programelor în coduri de biți intermediare ale instrucțiunilor virtuale asemănătoare RISC (mașină virtuală de nivel scăzut cu un sistem de optimizare pe mai multe niveluri). Pseudocodul generat poate fi convertit folosind un compilator JIT în instrucțiuni de mașină direct în momentul execuției programului.

Schimbarea cheie în noua versiune a fost includerea Flanșă, frontend pentru limba Fortran. Flang acceptă Fortran 2018, OpenMP 4.5 și OpenACC 3.0, dar dezvoltarea proiectului nu a fost încă finalizată, iar front-end-ul este limitat la analizarea codului și verificarea corectitudinii. Generarea codului intermediar LLVM nu este încă acceptată și pentru a genera fișiere executabile, codul canonic este generat și transmis unui compilator Fortran extern.

Îmbunătățiri în Clang 11.0:

  • S-a adăugat capacitatea de a restabili arborele de sintaxă abstractă (AST) pentru codul C++ rupt, care poate fi folosit pentru a ajuta la diagnosticarea erorilor și oferă informații suplimentare utilităților externe, cum ar fi clang-tidy și clangd. Caracteristica este activată implicit pentru codul C++ și este controlată prin opțiunile „-Xclang -f[no-]recovery-ast”.
  • S-au adăugat noi moduri de diagnosticare:
    • „-Wpointer-to-int-cast” este un grup de avertismente despre turnarea de pointeri către un tip întreg int care nu găzduiește toate valorile posibile.
    • „-Wuninitialized-const-reference” - avertisment despre trecerea variabilelor neinițializate în parametrii funcției care acceptă argumente de referință cu atributul „const”.
    • „-Wimplicit-const-int-float-conversion” - activat în mod implicit avertisment despre conversia implicită a unei constante reale într-un tip întreg.
  • Pentru platforma ARM, sunt furnizate funcții C încorporate în compilator (Intrinseci), înlocuite cu instrucțiuni vectoriale eficiente Arm v8.1-M MVE și CDE. Funcțiile disponibile sunt definite în fișierele de antet arm_mve.h și arm_cde.h.
  • Adăugat un set de tipuri de numere întregi extinse _ExtInt(N), permițându-vă să creați tipuri care nu sunt multipli de puteri de doi, care pot fi procesate eficient pe FPGA/HLS. De exemplu, _ExtInt(7) definește un tip întreg format din 7 biți.
  • S-au adăugat macrocomenzi care definesc suportul pentru funcțiile C încorporate pe baza instrucțiunilor 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. De exemplu, macrocomanda __ARM_FEATURE_SVE este definită la generarea codului AArch64 prin setarea opțiunii de linie de comandă „-march=armv8-a+sve”.

  • Indicatorul „-O” este acum identificat cu modul de optimizare „-O1” în loc de „-O2”.
  • S-au adăugat noi steaguri de compilator:
    • „-fstack-clash-protection” - permite protecția împotriva intersecții dintre stiva și grămada.
    • „-ffp-exception-behavior={ignore,maytrap,strict}” - vă permite să selectați modul de gestionare a excepțiilor pentru numerele cu virgulă mobilă.
    • „-ffp-model={precise,strict,fast}” - Simplifica accesul la o serie de opțiuni specializate pentru numere în virgulă mobilă.
    • „-fpch-codegen” și „-fpch-debuginfo” pentru a genera un antet precompilat (PCH) cu fișiere obiect separate pentru cod și debuginfo.
    • „-fsanitize-coverage-allowlist” și „-fsanitize-coverage-blocklist” pentru verificarea listelor albe și negre de testare a acoperirii.
    • „-mtls-size={12,24,32,48}” pentru a selecta dimensiunea TLS (stocare locală de fir).
    • „-menable-experimental-extension” pentru a activa extensiile experimentale RISC-V.
  • Modul implicit pentru C este „-fno-common”, ceea ce permite un acces mai eficient la variabilele globale pe unele platforme.
  • Cache-ul implicit al modulului a fost mutat din /tmp în directorul ~/.cache. Pentru a înlocui, puteți utiliza indicatorul „-fmodules-cache-path=".
  • Standardul implicit al limbajului C a fost actualizat de la gnu11 la gnu17.
  • S-a adăugat suport preliminar pentru extensia GNU C "asm inline» pentru a adăuga inserții de asamblare. Extensia este încă în analiză, dar nu este procesată în niciun fel.
  • Capacitățile asociate cu suportul OpenCL și CUDA au fost extinse. S-a adăugat suport pentru diagnosticarea blocurilor OpenCL 2.0 și s-au implementat noi caracteristici OpenMP 5.0.
  • S-a adăugat opțiunea IndentExternBlock la utilitarul Clang-format pentru alinierea în blocurile extern „C” și extern „C++”.
  • Analizorul static a îmbunătățit gestionarea constructorilor moșteniți în C++. S-au adăugat noi verificări alpha.core.C11Lock și alpha.fuchsia.Lock pentru a verifica dacă există încuietori, alpha.security.cert.pos.34c pentru a detecta utilizarea nesigură a putenv, webkit.NoUncountedMemberChecker și webkit.RefCntblBaseVirtualDtor pentru a detecta probleme cu tipuri nenumărate, alpha .cplusplus .SmartPtr pentru a verifica dacă nu există nicio referire la indicatorul inteligent.
  • In linter clang-tidy adăugat o mare parte a noilor cecuri.
  • Serverul de cache clangd (Clang Server) a îmbunătățit performanța și a adăugat noi capabilități de diagnosticare.

Principalul inovații LLVM 11.0:

  • Sistemul de compilare a fost comutat la utilizarea Python 3. Dacă Python 3 nu este disponibil, este posibil să reveniți la utilizarea Python 2.
  • Partea frontală cu compilatorul pentru limbajul Go (llgo) este exclusă din versiune, care poate fi restructurată în viitor.
  • Atributul vector-function-abi-variant a fost adăugat la reprezentarea intermediară (IR) pentru a descrie maparea dintre funcțiile scalare și vectoriale pentru a vectoriza apelurile. Din llvm::VectorType există două tipuri de vectori separate llvm::FixedVectorType și llvm::ScalableVectorType.
  • Ramificarea pe baza valorilor udef și transmiterea valorilor undef la funcțiile standard ale bibliotecii este recunoscută ca un comportament nedefinit. ÎN
    memset/memcpy/memmove permite trecerea de pointeri undef, dar dacă parametrul cu dimensiunea este zero.

  • LLJIT a adăugat suport pentru efectuarea inițializărilor statice prin metodele LLJIT::initialize și LLJIT::deinitialize. A implementat capacitatea de a adăuga biblioteci statice la JITDylib folosind clasa StaticLibraryDefinitionGenerator. S-a adăugat C API pentru ORCv2 (API pentru construirea de compilatoare JIT).
  • Suportul pentru procesoarele Cortex-A64, Cortex-A34, Cortex-A77 și Cortex-X78 a fost adăugat la backend pentru arhitectura AArch1. Implementarea extensiilor ARMv8.2-BF16 (BFloat16) și ARMv8.6-A, inclusiv RMv8.6-ECV (virtualizare îmbunătățită a contorului), ARMv8.6-FGT (capcane cu granulație fină), ARMv8.6-AMU (virtualizarea monitoarelor de activitate) și ARMv8.0-DGH (hint pentru colectarea datelor). Este oferită capacitatea de a genera cod pentru funcții încorporate-legături la instrucțiunile vectoriale SVE.
  • Suportul pentru procesoarele Cortex-M55, Cortex-A77, Cortex-A78 și Cortex-X1 a fost adăugat la backend pentru arhitectura ARM. Extensii implementate
    Armv8.6-A Matrix Multiply și RMv8.2-AA32BF16 BFloat16.

  • Suport pentru generarea de cod pentru procesoarele POWER10 a fost adăugat la backend pentru arhitectura PowerPC. Optimizările buclei au fost extinse și suportul în virgulă mobilă a fost îmbunătățit.
  • Backend-ul pentru arhitectura RISC-V permite acceptarea patch-urilor care acceptă seturi de instrucțiuni extinse experimentale care nu au fost încă aprobate oficial.
  • Backend-ul pentru arhitectura AVR a fost transferat din categoria experimentală la stabilă, inclusă în distribuția de bază.
  • Backend-ul pentru arhitectura x86 acceptă instrucțiuni Intel AMX și TSXLDTRK. Protecție adăugată împotriva atacurilor LVI (Load Value Injection) și, de asemenea, implementează un mecanism general de suprimare a efectelor secundare de execuție speculativă pentru a bloca atacurile cauzate de execuția speculativă a operațiunilor pe CPU.
  • În backend-ul pentru arhitectura SystemZ, a fost adăugat suport pentru MemorySanitizer și LeakSanitizer.
  • S-a adăugat suport pentru fișierul antet cu constante matematice la Libc++ .
  • Extins Capabilitati de linker LLD. Suport îmbunătățit pentru formatul ELF, inclusiv opțiunile adăugate „--lto-emit-asm”, „--lto-tot-program-vizibilitate”, „-print-archive-stats”, „-shuffle-sections”, „ -thinlto- single-module”, „-unique”, „-rosegment”, „-threads=N”. S-a adăugat opțiunea „--time-trace” pentru a salva urma într-un fișier, care poate fi apoi analizat prin interfața chrome://tracing din Chrome.

Sursa: opennet.ru

Adauga un comentariu