Llançament del conjunt de compiladors LLVM 9.0

Després de sis mesos de desenvolupament presentat llançament del projecte LLVM 9.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 9.0 inclouen l'eliminació de l'etiqueta de disseny experimental de la plataforma RISC-V objectiu, el suport de C++ per a OpenCL, la capacitat de dividir un programa en parts carregades dinàmicament a LLD i la implementació del "asm goto", utilitzat al codi del nucli de Linux. libc++ va afegir suport per a WASI (WebAssembly System Interface) i LLD va afegir suport inicial per a l'enllaç dinàmic de WebAssembly.

Millores a Clang 9.0:

  • Afegit implementació de l'expressió específica de GCC "asm goto", que us permet passar d'un bloc en línia d'assemblador a una etiqueta en codi C. Aquesta característica és necessària per construir el nucli de Linux en el mode "CONFIG_JUMP_LABEL=y" mitjançant Clang en sistemes amb arquitectura x86_64. Tenint en compte els canvis afegits en versions anteriors, el nucli de Linux ara es pot construir a Clang per a l'arquitectura x86_64 (abans només es suportava la construcció per a les arquitectures arm, aarch64, ppc32, ppc64le i mips). A més, els projectes Android i ChromeOS ja s'han convertit per utilitzar Clang per a la creació de nuclis, i Google està provant Clang com a plataforma principal per crear nuclis per als seus sistemes Linux de producció. En el futur, altres components LLVM es poden utilitzar en el procés de creació del nucli, inclosos LLD, llvm-objcopy, llvm-ar, llvm-nm i llvm-objdump;
  • S'ha afegit suport experimental per utilitzar C++17 a OpenCL. Les característiques específiques inclouen suport per als atributs d'espai d'adreces, bloqueig de la conversió d'espai d'adreces per operadors de càsting de tipus, subministrament de tipus vectorials com a OpenCL per a C, presència de tipus OpenCL específics per a imatges, esdeveniments, canals, etc.
  • S'han afegit nous indicadors del compilador "-ftime-trace" i "-ftime-trace-granularity=N" per generar un informe sobre el temps d'execució de diverses etapes de la interfície (anàlisi, inicialització) i backend (etapes d'optimització). L'informe es guarda en format json, compatible amb chrome://tracing i speedscope.app;
  • S'ha afegit el processament de l'especificador "__declspec(allocator)" i la generació d'informació de depuració acompanyada que us permet controlar el consum de memòria a l'entorn de Visual Studio;
  • Per al llenguatge C, s'ha afegit suport per a la macro "__FILE_NAME__", que s'assembla a la macro "__FILE__", però només inclou el nom del fitxer sense el camí complet;
  • C++ ha ampliat el suport per als atributs d'espai d'adreces per cobrir diverses característiques de C++, com ara patrons de paràmetres i arguments, tipus de referència, inferència de tipus de retorn, objectes, funcions generades automàticament, operadors integrats i molt més.
  • S'han ampliat les capacitats associades al suport per a OpenCL, OpenMP i CUDA. Això inclou suport inicial per a la inclusió implícita de funcions OpenCL integrades (s'ha afegit el senyalador "-fdeclare-opencl-builtins"), s'ha implementat l'extensió cl_arm_integer_dot_product i s'han ampliat les eines de diagnòstic;
  • S'ha millorat el treball de l'analitzador estàtic i s'ha afegit documentació sobre la realització de l'anàlisi estàtica. S'han afegit marques per mostrar els mòduls de verificador disponibles i les opcions admeses (“-analyzer-checker[-option]-help”, “-analyzer-checker[-option]-help-alpha” i “-analyzer-checker[-option]-help "-desenvolupador"). S'ha afegit la marca "-analyzer-werror" per tractar els avisos com a errors.
    S'han afegit nous modes de verificació:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling per identificar pràctiques no segures per treballar amb memòries;
    • osx.MIGChecker per cercar infraccions de les regles de trucada MIG (Mach Interface Generator);
    • optin.osx.OSObjectCStyleCast per trobar conversions incorrectes d'objectes XNU libkern;
    • apiModeling.llvm amb un conjunt de funcions de verificació de modelatge per detectar errors a la base de codi LLVM;
    • Codi estabilitzat per comprovar objectes C++ no inicialitzats (UninitializedObject al paquet optin.cplusplus);
  • La utilitat clang-format ha afegit suport per al format de codi en llenguatge C# i proporciona suport per a l'estil de format de codi utilitzat per Microsoft;
  • clang-cl, una interfície de línia d'ordres alternativa que proporciona compatibilitat a nivell d'opcions amb el compilador cl.exe inclòs a Visual Studio, ha afegit heurístiques per tractar els fitxers inexistents com a opcions de línia d'ordres i mostrar un avís corresponent (per exemple, quan s'executa "clang-cl /diagnostic :caret /c test.cc");
  • S'ha afegit una gran part de noves comprovacions a linter clang-tidy, incloses les comprovacions afegides específiques de l'API d'OpenMP;
  • Ampliat capacitats del servidor clangd (Servidor Clang), en què el mode de creació d'índex de fons està activat de manera predeterminada, s'ha afegit suport per a accions contextuals amb codi (recuperació de variables, ampliació de definicions automàtiques i macro, conversió de cadenes escapades a cadenes sense escape), la capacitat de mostrar advertències de Clang-tidy, diagnòstics ampliats d'errors en fitxers de capçalera i la possibilitat de mostrar informació sobre la jerarquia de tipus;

El principal innovacions LLVM 9.0:

  • S'ha afegit una funció de partició experimental a l'enllaç LLD, que us permet dividir un programa en diverses parts, cadascuna de les quals es troba en un fitxer ELF independent. Aquesta funció us permet iniciar la part principal del programa, que carregarà altres components segons sigui necessari durant el funcionament (per exemple, podeu separar el visualitzador de PDF integrat en un fitxer independent, que només es carregarà quan l'usuari obriu el PDF). dossier).

    Enllaçador LLD portat a primer pla a un estat adequat per enllaçar el nucli de Linux per a arquitectures arm32_7, arm64, ppc64le i x86_64.
    Noves opcions "-" (sortida a stdout), "-[no-]allow-shlib-undefined", "-undefined-glob", "-nmagic", "-omagic", "-dependent-library", "- z ifunc-noplt" i "-z common-page-size". Per a l'arquitectura AArch64, s'ha afegit suport per a instruccions BTI (Branch Target Indicator) i PAC (Pointer Authentication Code). S'ha millorat significativament el suport per a plataformes MIPS, RISC-V i PowerPC. S'ha afegit suport inicial per a l'enllaç dinàmic per a WebAssembly;

  • En libc++ implementat les funcions ssiize, std::is_constant_evaluated, std::midpoint i std::lerp, els mètodes "front" i "back" s'han afegit a std::span, els atributs dels tipus std::is_unbounded_array i std::is_bounded_array s'han afegit , les capacitats std s'han ampliat: :atomic. El suport per a GCC 4.9 s'ha interromput (es pot utilitzar amb GCC 5.1 i versions més recents). Suport afegit Wasi (WebAssembly System Interface, una interfície per utilitzar WebAssembly fora del navegador);
  • S'han afegit noves optimitzacions. S'ha activat la conversió de les trucades memcmp a bcmp en algunes situacions. S'ha implementat l'omissió de la comprovació d'abast per a taules de salt en què els blocs d'interruptors inferiors no són accessibles o quan no s'utilitzen instruccions, per exemple, quan es criden a funcions amb el tipus void;
  • S'ha estabilitzat el backend de l'arquitectura RISC-V, que ja no es posiciona com a experimental i es construeix per defecte. Proporciona suport complet de generació de codi per a les variants del conjunt d'instruccions RV32I i RV64I amb extensions MAFDC;
  • S'han fet nombroses millores als backends per a les arquitectures X86, AArch64, ARM, SystemZ, MIPS, AMDGPU i PowerPC. Per exemple, per a l'arquitectura
    AArch64 va afegir suport per a instruccions SVE2 (Extensió vectorial escalable 2) i MTE (Extensions d'etiquetatge de memòria); al backend ARM, es va afegir suport per a l'arquitectura Armv8.1-M i l'extensió MVE (M-Profile Vector Extension). S'ha afegit suport per a l'arquitectura GFX10 (Navi) al backend AMDGPU, les capacitats de trucada de funcions estan habilitades de manera predeterminada i s'activa una passada combinada DPP (Primitius paral·lels de dades).

  • El depurador LLDB ara té ressaltat en color per a traces enrere i suport afegit per als blocs DWARF4 debug_types i DWARF5 debug_info;
  • S'ha afegit suport per a fitxers d'objectes i executables en format COFF a les utilitats llvm-objcopy i llvm-strip.

Font: opennet.ru

Afegeix comentari