Lanzamento do paquete de compiladores LLVM 9.0

Despois de seis meses de desenvolvemento presentado lanzamento do proxecto LLVM 9.0 - Ferramentas compatibles con GCC (compiladores, optimizadores e xeradores de código) que compilan programas nun código de bits intermedio de instrucións virtuais tipo RISC (unha máquina virtual de baixo nivel cun sistema de optimización multinivel). O pseudocódigo xerado pode ser convertido polo compilador JIT en instrucións de máquina xusto no momento da execución do programa.

As novas características de LLVM 9.0 inclúen a eliminación da etiqueta de deseño experimental da plataforma RISC-V de destino, compatibilidade con C++ para OpenCL, a capacidade de dividir un programa en partes cargadas dinámicamente en LLD e a implementación do "asm goto", usado no código do núcleo de Linux. libc++ engadiu soporte para WASI (WebAssembly System Interface) e LLD engadiu soporte inicial para vinculación dinámica de WebAssembly.

Melloras en Clang 9.0:

  • Engadido implementación da expresión específica de GCC "asm goto", que che permite pasar dun bloque en liña do ensamblador a unha etiqueta en código C. Esta función é necesaria para construír o núcleo de Linux no modo "CONFIG_JUMP_LABEL=y" usando Clang en sistemas con arquitectura x86_64. Tendo en conta os cambios engadidos en versións anteriores, o núcleo de Linux agora pódese construír en Clang para a arquitectura x86_64 (anteriormente só se admitía a construción para as arquitecturas arm, aarch64, ppc32, ppc64le e mips). Ademais, os proxectos de Android e ChromeOS xa se converteron para usar Clang para a construción do núcleo, e Google está a probar Clang como a plataforma principal para construír núcleos para os seus sistemas Linux de produción. No futuro, outros compoñentes LLVM pódense usar no proceso de construción do núcleo, incluíndo LLD, llvm-objcopy, llvm-ar, llvm-nm e llvm-objdump;
  • Engadido soporte experimental para usar C++17 en OpenCL. As características específicas inclúen soporte para atributos de espazo de enderezos, bloqueo da conversión de espazo de enderezos por operadores de emisión de tipos, provisión de tipos de vectores como en OpenCL para C, presenza de tipos OpenCL específicos para imaxes, eventos, canles, etc.
  • Engadíronse novas marcas do compilador "-ftime-trace" e "-ftime-trace-granularity=N" para xerar un informe sobre o tempo de execución de varias fases do frontend (análise, inicialización) e do backend (fases de optimización). O informe gárdase en formato json, compatible con chrome://tracing e speedscope.app;
  • Engadiuse o procesamento do especificador "__declspec(allocator)" e a xeración de información de depuración acompañante que lle permite supervisar o consumo de memoria no contorno de Visual Studio;
  • Para a linguaxe C, engadiuse soporte para a macro “__FILE_NAME__”, que se asemella á macro “__FILE__”, pero inclúe só o nome do ficheiro sen a ruta completa;
  • C++ ampliou o soporte para atributos de espazo de enderezos para cubrir varias funcións de C++, incluíndo patróns de parámetros e argumentos, tipos de referencia, inferencia de tipo de retorno, obxectos, funcións xeradas automaticamente, operadores integrados e moito máis.
  • Ampliáronse as capacidades asociadas ao soporte para OpenCL, OpenMP e CUDA. Isto inclúe soporte inicial para a inclusión implícita de funcións integradas de OpenCL (engadiuse a bandeira "-fdeclare-opencl-builtins"), implementouse a extensión cl_arm_integer_dot_product e expandíronse as ferramentas de diagnóstico;
  • Mellorouse o traballo do analizador estático e engadiuse documentación sobre a realización de análises estáticas. Engadíronse marcas para mostrar os módulos de verificación dispoñibles e as opcións admitidas ("-analyzer-checker[-option]-help", "-analyzer-checker[-option]-help-alpha" e "-analyzer-checker[-option]-help "-desenvolvedor"). Engadiuse a marca "-analyzer-werror" para tratar os avisos como erros.
    Engadíronse novos modos de verificación:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling para identificar prácticas inseguras para traballar con búfers;
    • osx.MIGChecker para buscar violacións das regras de chamada MIG (Mach Interface Generator);
    • optin.osx.OSObjectCStyleCast para atopar conversións incorrectas de obxectos XNU libkern;
    • apiModeling.llvm cun conxunto de funcións de verificación de modelado para detectar erros na base de código LLVM;
    • Código estabilizado para comprobar obxectos C++ non inicializados (UninitializedObject no paquete optin.cplusplus);
  • A utilidade clang-format engadiu soporte para o formato de código na linguaxe C# e ofrece soporte para o estilo de formato de código usado por Microsoft;
  • clang-cl, unha interface de liña de comandos alternativa que ofrece compatibilidade a nivel de opción co compilador cl.exe incluído en Visual Studio, engadiu unha heurística para tratar os ficheiros inexistentes como opcións de liña de comandos e mostrar unha advertencia correspondente (por exemplo, ao executar "clang-cl /diagnostic :caret /c test.cc");
  • Engadíronse unha gran parte das novas comprobacións a linter clang-tidy, incluídas as comprobacións engadidas específicas para a API de OpenMP;
  • Ampliado capacidades do servidor clangd (Clang Server), no que o modo de creación de índices en segundo plano está activado de forma predeterminada, engadiuse soporte para accións contextuais con código (recuperación de variables, expansión de definicións automáticas e macro, conversión de cadeas escapadas a cadeas sen escape), a capacidade de mostrar avisos de Clang-tidy, diagnósticos expandidos de erros nos ficheiros de cabeceira e engadiu a posibilidade de mostrar información sobre a xerarquía de tipos;

O principal innovacións LLVM 9.0:

  • Engadiuse unha función de partición experimental ao enlazador LLD, que permite dividir un programa en varias partes, cada unha delas situada nun ficheiro ELF separado. Esta función permítelle iniciar a parte principal do programa, que cargará outros compoñentes segundo sexa necesario durante o funcionamento (por exemplo, pode separar o visor de PDF integrado nun ficheiro separado, que se cargará só cando o usuario abra o PDF). arquivo).

    Enlace LLD posto en primeiro plano a un estado axeitado para ligar o núcleo de Linux para as arquitecturas arm32_7, arm64, ppc64le e x86_64.
    Novas opcións "-" (saída a stdout), "-[no-]allow-shlib-undefined", "-undefined-glob", "-nmagic", "-omagic", "-dependent-library", "- z ifunc-noplt" e "-z common-page-size". Para a arquitectura AArch64, engadiuse soporte para instrucións BTI (Branch Target Indicator) e PAC (Pointer Authentication Code). Mellorouse significativamente o soporte para plataformas MIPS, RISC-V e PowerPC. Engadido soporte inicial para a ligazón dinámica para WebAssembly;

  • En libc++ implementado funcións ssize, std::is_constant_evaluated, std::midpoint e std::lerp, os métodos "front" e "back" foron engadidos a std::span, atributos de tipos std::is_unbounded_array e std::is_bounded_array. , as capacidades estándar foron ampliadas: :atomic. O soporte para GCC 4.9 foi descontinuado (pódese usar con GCC 5.1 e versións máis recentes). Soporte engadido WASI (WebAssembly System Interface, unha interface para usar WebAssembly fóra do navegador);
  • Engadíronse novas optimizacións. Activouse a conversión de chamadas memcmp a bcmp nalgunhas situacións. Implementouse a omisión da comprobación de rango para as táboas de salto nas que non se poden acceder aos bloques de interruptores inferiores ou cando non se usan instrucións, por exemplo, cando se chaman funcións co tipo void;
  • Estabilizouse o backend para a arquitectura RISC-V, que xa non se sitúa como experimental e está construído por defecto. Ofrece soporte completo para a xeración de código para as variantes do conxunto de instrucións RV32I e RV64I con extensións MAFDC;
  • Realizáronse numerosas melloras nos backends para as arquitecturas X86, AArch64, ARM, SystemZ, MIPS, AMDGPU e PowerPC. Por exemplo, para arquitectura
    AArch64 engadiu soporte para instrucións SVE2 (Extensión vectorial escalable 2) e MTE (Extensións de etiquetado de memoria); no backend ARM, engadiuse soporte para a arquitectura Armv8.1-M e a extensión MVE (M-Profile Vector Extension). Engadiuse a compatibilidade coa arquitectura GFX10 (Navi) ao backend de AMDGPU, as capacidades de chamada de funcións están habilitadas de forma predeterminada e un pase combinado está activado DPP (Datos-Primitivos paralelos).

  • O depurador LLDB agora ten resaltado de cores para as trazas de retroceso e soporte adicional para os bloques DWARF4 debug_types e DWARF5 debug_info;
  • Engadiuse soporte para ficheiros obxecto e executables en formato COFF ás utilidades llvm-objcopy e llvm-strip.

Fonte: opennet.ru

Engadir un comentario