Llançament del conjunt de compiladors LLVM 10.0

Després de sis mesos de desenvolupament presentat llançament del projecte LLVM 10.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.

Les noves característiques de LLVM 10.0 inclouen suport per a conceptes C++, ja no s'executa Clang com un procés separat, suport per a comprovacions CFG (control de flux de control) per a Windows i suport per a noves capacitats de CPU.

Millores a Clang 10.0:

  • S'ha afegit suport per a "conceptes", una extensió de plantilla de C++ que s'inclourà al següent estàndard, amb el nom en codi C++2a (activat per la marca -std=c++2a).
    Els conceptes us permeten definir un conjunt de requisits de paràmetres de plantilla que, en el moment de la compilació, limiten el conjunt d'arguments que es poden acceptar com a paràmetres de plantilla. Els conceptes es poden utilitzar per evitar inconsistències lògiques entre les propietats dels tipus de dades utilitzats a la plantilla i les propietats del tipus de dades dels paràmetres d'entrada.

    plantilla
    concepte IgualtatComparable = requereix(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Per defecte, s'atura el llançament d'un procés separat ("clang -cc1") en què es realitza la compilació. La compilació es fa ara al procés principal i l'opció "-fno-integrated-cc1" es pot utilitzar per restaurar el comportament antic.
  • Nous modes de diagnòstic:
    • "-Wc99-designator" i "-Wreorder-init-list" adverteixen contra l'ús d'inicialitzadors C99 en mode C++ en els casos en què són correctes en C99 però no en C++20.
    • "-Wsizeof-array-div" - captura situacions com ara "int arr[10]; …sizeof(arr) / sizeof(short)...” (hauria de ser “sizeof(arr) / sizeof(int)”).
    • "-Wxor-used-as-po" - adverteix contra l'ús de construccions com l'ús de l'operador "^" (xor) en operacions que es poden confondre amb exponenciació (2^16).
    • "-Wfinal-dtor-non-final-class": adverteix sobre les classes que no estan marcades amb l'especificador "final", però tenen un destructor amb l'atribut "final".
    • "-Wtautological-bit-compare" és un grup d'avisos per diagnosticar comparacions tautològiques entre una operació bit a bit i una constant, i per identificar comparacions sempre certes en què l'operació OR bit a bit s'aplica a un nombre no negatiu.
    • "-Wbitwise-conditional-parentheses" adverteix de problemes quan es barregen els operadors lògics AND (&) i OR (|) amb l'operador condicional (?:).
    • "-Wmisleading-indentation" és un anàleg de la comprovació del mateix nom de GCC, que adverteix sobre les expressions sagnades com si formessin part d'un bloc if/else/for/while, però de fet no estan incloses en aquest bloc .
    • Quan s'especifica "-Wextra", la comprovació "-Wdeprecated-copy" està activada, advertint sobre l'ús de constructors
      "mou" i "copia" a les classes amb una definició explícita de destructor.

    • S'han ampliat les comprovacions "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-analysis".
    • Les comprovacions "-Wbitwise-op-parentheses" i "-Wlogical-op-parentheses" estan desactivades per defecte.
  • En codi C i C++, les operacions aritmètiques de punter només es permeten en matrius. El desinfectador de comportaments no definits en mode "-fsanitize=pointer-overflow" ara detecta casos com ara afegir un desplaçament diferent de zero a un punter nul o crear un punter nul en restar un nombre enter d'un punter no nul.
  • El mode "-fsanitize=implicit-conversion" (Implicit Conversion Sanitizer) està adaptat per identificar problemes amb operacions d'increment i decrement per a tipus amb una mida de bits més petita que la del tipus "int".
  • Quan seleccioneu arquitectures de destinació x86 "-march=skylake-avx512", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" i "-march=cooperlake" per defecte en vectoritzat el codi ha deixat d'utilitzar registres zmm de 512 bits, excepte la seva indicació directa al codi font. El motiu és que la freqüència de la CPU disminueix quan es realitzen operacions de 512 bits, cosa que pot afectar negativament el rendiment general. Per canviar el nou comportament, es proporciona l'opció "-mprefer-vector-width=512".
  • El comportament del senyalador "-flax-vector-conversions" és similar al GCC: les conversions de bits vectorials implícites entre vectors enters i de coma flotant estan prohibides. Per eliminar aquesta limitació, es proposa utilitzar la bandera
    "-flax-vector-conversions=all", que és el valor predeterminat.

  • Suport millorat per a les CPU MIPS de la família Octeon. S'ha afegit "octeon+" a la llista de tipus de CPU vàlids.
  • Quan s'assembla al codi intermedi de WebAssembly, l'optimitzador wasm-opt es crida automàticament, si està disponible al sistema.
  • Per als sistemes basats en l'arquitectura RISC-V, es permet l'ús de registres que emmagatzemen valors de coma flotant en blocs condicionals d'insercions en línia d'assemblador.
  • S'han afegit nous indicadors del compilador: "-fgnuc-version" per establir el valor de la versió per a "__GNUC__" i macros similars; "-fmacro-prefix-map=OLD=NEW" per substituir el prefix del directori OLD per NEW en macros com ara "__FILE__"; "-fpatchable-function-entry=N[,M]" per generar un cert nombre d'instruccions NOP abans i després del punt d'entrada de la funció. Per a RISC-V
    S'ha afegit suport per a les marques "-ffixed-xX", "-mcmodel=medany" i "-mcmodel=medlow".

  • S'ha afegit suport per a l'atribut "__attribute__((target ("branch-protection=..."))), l'efecte del qual és similar a l'opció -protecció-branch.
  • A la plataforma Windows, quan s'especifica el senyalador "-cfguard", s'implementa la substitució de les comprovacions d'integritat del flux d'execució (Control Flow Guard) per trucades indirectes a funcions. Per desactivar la substitució de xecs, podeu utilitzar el senyalador "-cfguard-nochecks" o el modificador "__declspec(guard(nocf))".
  • El comportament de l'atribut gnu_inline és similar al GCC en els casos en què s'utilitza sense la paraula clau "extern".
  • S'han ampliat les capacitats associades amb el suport OpenCL i CUDA. S'ha afegit suport per a les noves funcions d'OpenMP 5.0.
  • S'ha afegit una opció Estàndard a la utilitat clang-format, que us permet determinar la versió de l'estàndard C++ que s'utilitza en analitzar i formatar el codi (Darrer, Auto, c++03, c++11, c++14, c++17, c++20).
  • S'han afegit noves comprovacions a l'analitzador estàtic: alpha.cplusplus.PlacementNew per determinar si hi ha prou espai d'emmagatzematge, fuchsia.HandleChecker per detectar fuites relacionades amb els gestors de Fuchsia, security.insecureAPI.decodeValueOfObjCType per detectar possibles desbordaments de memòria intermèdia quan s'utilitza [NSCoder decodebValuepeOf. :a:] .
  • L'Undefined Behavior Sanitizer (UBSan) ha ampliat les seves comprovacions de desbordament del punter per detectar l'aplicació de desplaçaments diferents de zero als punters NULL o l'addició resultant d'un desplaçament del punter NULL.
  • En linter clang-tidy afegit una gran part de nous xecs.

El principal innovacions LLVM 10.0:

  • Al marc Atribuïdor S'han afegit noves optimitzacions i analitzadors interprocediments. Es preveu l'estat de 19 atributs diferents, inclosos 12 atributs, 12 LLVM IR i 7 atributs abstractes com ara la vivacitat.
  • S'han afegit noves funcions matemàtiques de matriu integrades al compilador (Intrínseques), que es substitueixen per instruccions vectorials eficients durant la compilació.
  • S'han fet nombroses millores als backends per a les arquitectures X86, AArch64, ARM, SystemZ, MIPS, AMDGPU i PowerPC. S'ha afegit suport de CPU
    Cortex-A65, Cortex-A65AE, Neoverse E1 i Neoverse N1. Per a ARMv8.1-M, ​​s'ha optimitzat el procés de generació de codi (per exemple, ha aparegut suport per a bucles amb una sobrecàrrega mínima) i s'ha afegit suport per a l'autovectorització mitjançant l'extensió MVE. Compatibilitat amb CPU MIPS Octeon millorada. Per a PowerPC, s'habilita la vectorització de subrutines matemàtiques mitjançant la biblioteca MASSV (Mathematical Acceleration SubSystem), es millora la generació de codi i s'optimitza l'accés a la memòria des de bucles. Per a x86, s'ha canviat el maneig dels tipus vectorials v2i32, v4i16, v2i16, v8i8, v4i8 i v2i8.

  • Generador de codi millorat per a WebAssembly. S'ha afegit suport per a instruccions TLS (Thread-Local Storage) i atomic.fence. El suport SIMD s'ha ampliat significativament. Els fitxers d'objectes WebAssembly ara tenen la capacitat d'utilitzar signatures de funcions amb valors múltiples.
  • L'analitzador s'utilitza quan es processen bucles MemorySSA, que permet definir dependències entre diferents operacions de memòria. MemorySSA pot reduir el temps de compilació i execució o es pot utilitzar en lloc d'AliasSetTracker sense pèrdua de rendiment.
  • El depurador LLDB ha millorat significativament el suport per al format DWARF v5. Suport millorat per construir amb MinGW
    i ha afegit la capacitat inicial per depurar els executables de Windows per a arquitectures ARM i ARM64. S'han afegit descripcions de les opcions que s'ofereixen quan s'ha completat automàticament l'entrada prement la pestanya.

  • Ampliat Capacitats d'enllaç LLD. Suport millorat per al format ELF, inclosa la garantia de la compatibilitat total de les plantilles glob amb l'enllaçador GNU, afegint suport per a seccions de depuració comprimides ".zdebug", afegint la propietat PT_GNU_PROPERTY per definir la secció .note.gnu.property (es pot utilitzar en el futur). nuclis de Linux),
    S'han implementat els modes "-z noseparate-code", "-z separat-code" i "-z separat-loadable-segments". Suport millorat per a MinGW i WebAssembly.

Font: opennet.ru

Afegeix comentari