Llançament del conjunt de compiladors LLVM 11.0

Després de sis mesos de desenvolupament presentat llançament del projecte LLVM 11.0 — Eines compatibles amb GCC (compiladors, optimitzadors i generadors de codi), compilant programes en codi de bits intermedi d'instruccions virtuals semblants a RISC (màquina virtual de baix nivell amb un sistema d'optimització multinivell). El pseudocodi generat es pot convertir mitjançant un compilador JIT en instruccions de màquina directament en el moment de l'execució del programa.

El canvi clau en la nova versió va ser la inclusió de Flanc, frontend per a l'idioma Fortran. Flang és compatible amb Fortran 2018, OpenMP 4.5 i OpenACC 3.0, però el desenvolupament del projecte encara no s'ha completat i el front-end es limita a l'anàlisi de codi i la verificació de la correcció. La generació de codi intermedi LLVM encara no és compatible i per generar fitxers executables, es genera codi canònic i es passa a un compilador Fortran extern.

Millores a Clang 11.0:

  • S'ha afegit la possibilitat de restaurar l'arbre de sintaxi abstracta (AST) per al codi C++ trencat, que es pot utilitzar per ajudar a diagnosticar errors i proporcionar informació addicional a utilitats externes com ara clang-tidy i clangd. La funció està habilitada per defecte per al codi C++ i es controla mitjançant les opcions "-Xclang -f[no-]recovery-ast".
  • S'han afegit nous modes de diagnòstic:
    • "-Wpointer-to-int-cast" és un grup d'avisos sobre l'emissió de punters a un tipus enter int que no s'adapta a tots els valors possibles.
    • "-Wuninitialized-const-reference": advertència sobre el pas de variables no inicialitzades en paràmetres de funció que accepten arguments de referència amb l'atribut "const".
    • "-Wimplicit-const-int-float-conversion" - activat per defecte advertència sobre la conversió implícita d'una constant real a un tipus enter.
  • Per a la plataforma ARM, es proporcionen funcions C integrades al compilador (Intrínseques), substituïts per instruccions vectorials eficients Arm v8.1-M MVE i CDE. Les funcions disponibles es defineixen als fitxers de capçalera arm_mve.h i arm_cde.h.
  • Afegit un conjunt de tipus d'enters estesos _ExtInt(N), que us permeten crear tipus que no siguin múltiples de potències de dos, que es poden processar de manera eficient a FPGA/HLS. Per exemple, _ExtInt(7) defineix un tipus d'enter que consta de 7 bits.
  • S'han afegit macros que defineixen el suport per a funcions C integrades basades en instruccions ARM SVE (Extensió vectorial escalable):
    __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. Per exemple, la macro __ARM_FEATURE_SVE es defineix quan es genera codi AArch64 mitjançant l'opció de la línia d'ordres "-march=armv8-a+sve".

  • El senyalador "-O" ara s'identifica amb el mode d'optimització "-O1" en lloc de "-O2".
  • S'han afegit nous indicadors del compilador:
    • "-fstack-clash-protection" - permet la protecció contra interseccions de pila i pila.
    • "-ffp-exception-behavior={ignore,maytrap,strict}" - us permet seleccionar el mode de controlador d'excepcions per als números de coma flotant.
    • "-ffp-model={precise,strict,fast}" - Simplifica l'accés a una sèrie d'opcions especialitzades per als números de coma flotant.
    • "-fpch-codegen" i "-fpch-debuginfo" per generar una capçalera precompilada (PCH) amb fitxers objecte separats per al codi i debuginfo.
    • "-fsanitize-coverage-allowlist" i "-fsanitize-coverage-blocklist" per comprovar les proves de cobertura de les llistes blanques i negres.
    • "-mtls-size={12,24,32,48}" per seleccionar la mida TLS (emmagatzematge local del fil).
    • "-menable-experimental-extension" per habilitar extensions RISC-V experimentals.
  • El mode predeterminat per a C és "-fno-common", que permet un accés més eficient a les variables globals en algunes plataformes.
  • La memòria cau del mòdul per defecte s'ha mogut de /tmp al directori ~/.cache. Per substituir, podeu utilitzar el senyalador "-fmodules-cache-path=".
  • L'estàndard de llenguatge C predeterminat s'ha actualitzat de gnu11 a gnu17.
  • S'ha afegit suport preliminar per a l'extensió GNU C "asm en línia» per afegir insercions d'assemblador. L'extensió encara s'està analitzant, però no es processa de cap manera.
  • S'han ampliat les capacitats associades amb el suport OpenCL i CUDA. S'ha afegit suport per al diagnòstic de blocs d'OpenCL 2.0 i s'han implementat noves funcions d'OpenMP 5.0.
  • S'ha afegit l'opció IndentExternBlock a la utilitat Clang-format per a l'alineació dins dels blocs extern "C" i extern "C++".
  • L'analitzador estàtic ha millorat el maneig dels constructors heretats en C++. S'han afegit noves comprovacions alpha.core.C11Lock i alpha.fuchsia.Lock per comprovar si hi ha bloquejos, alpha.security.cert.pos.34c per detectar l'ús no segur de putenv, webkit.NoUncountedMemberChecker i webkit.RefCntblBaseVirtualDtor per detectar problemes amb tipus incomptables, alpha .cplusplus .SmartPtr per comprovar si hi ha desreferències de punter intel·ligent nul.
  • En linter clang-tidy afegit una gran part de nous xecs.
  • El servidor de memòria cau clangd (Clang Server) ha millorat el rendiment i ha afegit noves capacitats de diagnòstic.

El principal innovacions LLVM 11.0:

  • El sistema de compilació s'ha canviat a Python 3. Si Python 3 no està disponible, és possible tornar a utilitzar Python 2.
  • La portada amb el compilador de l'idioma Go (llgo) està exclosa de la versió, que es pot reestructurar en el futur.
  • L'atribut vector-function-abi-variant s'ha afegit a la representació intermèdia (IR) per descriure el mapeig entre les funcions escalars i vectorials per vectoritzar les trucades. Des de llvm::VectorType hi ha dos tipus de vectors separats llvm::FixedVectorType i llvm::ScalableVectorType.
  • La ramificació basada en valors udef i el pas de valors undef a funcions de biblioteca estàndard es reconeix com un comportament no definit. EN
    memset/memcpy/memmove permet passar punters undef, però si el paràmetre amb mida és zero.

  • LLJIT ha afegit suport per realitzar inicialitzacions estàtiques mitjançant els mètodes LLJIT::initialize i LLJIT::deinitialize. S'ha implementat la possibilitat d'afegir biblioteques estàtiques a JITDylib mitjançant la classe StaticLibraryDefinitionGenerator. S'ha afegit l'API C per ORCv2 (API per construir compiladors JIT).
  • S'ha afegit suport per als processadors Cortex-A64, Cortex-A34, Cortex-A77 i Cortex-X78 al backend per a l'arquitectura AArch1. S'han implementat les extensions ARMv8.2-BF16 (BFloat16) i ARMv8.6-A, incloent RMv8.6-ECV (virtualització de comptadors millorada), ARMv8.6-FGT (trampes de gra fi), ARMv8.6-AMU (virtualització de monitors d'activitat) i ARMv8.0-DGH (suggeriment per a la recollida de dades). S'ofereix la possibilitat de generar codi per a enllaços de funcions integrades a instruccions vectorials SVE.
  • S'ha afegit suport per als processadors Cortex-M55, Cortex-A77, Cortex-A78 i Cortex-X1 al backend per a l'arquitectura ARM. Extensions implementades
    Armv8.6-A Matrix Multiply i RMv8.2-AA32BF16 BFloat16.

  • S'ha afegit suport per a la generació de codi per als processadors POWER10 al backend de l'arquitectura PowerPC. S'han ampliat les optimitzacions de bucle i s'ha millorat el suport de coma flotant.
  • El backend per a l'arquitectura RISC-V permet l'acceptació de pedaços que admeten conjunts d'instruccions ampliades experimentals que encara no han estat aprovats oficialment.
  • El backend de l'arquitectura AVR s'ha transferit de la categoria experimental a estable, inclosa a la distribució bàsica.
  • El backend per a l'arquitectura x86 admet instruccions Intel AMX i TSXLDTRK. Protecció addicional contra atacs LVI (Injecció de valor de càrrega), i també implementa un mecanisme general de supressió d'efectes secundaris d'execució especulativa per bloquejar atacs causats per l'execució especulativa d'operacions a la CPU.
  • Al backend de l'arquitectura SystemZ, s'ha afegit suport per a MemorySanitizer i LeakSanitizer.
  • S'ha afegit suport per al fitxer de capçalera amb constants matemàtiques a Libc++ .
  • Ampliat Capacitats d'enllaç LLD. Suport millorat per al format ELF, incloses les opcions afegides "--lto-emit-asm", "--lto-whole-program-visibility", "-print-archive-stats", "-shuffle-sections", " -thinlto- mòdul únic", "-únic", "-rosegment", "-fils=N". S'ha afegit l'opció "--time-trace" per desar el rastre en un fitxer, que després es pot analitzar mitjançant la interfície chrome://tracing a Chrome.

Font: opennet.ru

Afegeix comentari