Lanzamiento del conjunto de compiladores LLVM 9.0

Después de seis meses de desarrollo presentado lanzamiento del proyecto LLVM 9.0 — Herramientas compatibles con GCC (compiladores, optimizadores y generadores de código), que compilan programas en códigos de bits intermedios de instrucciones virtuales tipo RISC (máquina virtual de bajo nivel con un sistema de optimización multinivel). El pseudocódigo generado se puede convertir mediante un compilador JIT en instrucciones de máquina directamente en el momento de la ejecución del programa.

Las nuevas características de LLVM 9.0 incluyen la eliminación de la etiqueta de diseño experimental de la plataforma RISC-V de destino, compatibilidad con C++ para OpenCL, la capacidad de dividir un programa en partes cargadas dinámicamente en LLD y la implementación de "ir a asm", utilizado en el código del kernel de Linux. libc++ agregó soporte para WASI (Interfaz del sistema WebAssembly) y LLD agregó soporte inicial para enlaces dinámicos de WebAssembly.

Mejoras en Sonido metálico 9.0:

  • Añadido por implementación de la expresión específica del CCG "ir a asm“, que le permite pasar de un bloque en línea de ensamblador a una etiqueta en código C. Esta característica es necesaria para construir el kernel de Linux en el modo “CONFIG_JUMP_LABEL=y” usando Clang en sistemas con arquitectura x86_64. Teniendo en cuenta los cambios agregados en versiones anteriores, el kernel de Linux ahora se puede compilar en Clang para la arquitectura x86_64 (anteriormente solo se admitía la compilación para las arquitecturas arm, aarch64, ppc32, ppc64le y mips). Además, los proyectos de Android y ChromeOS ya se han convertido para utilizar Clang para la creación de núcleos, y Google está probando Clang como la plataforma principal para crear núcleos para sus sistemas Linux de producción. En el futuro, se podrán utilizar otros componentes LLVM en el proceso de compilación del kernel, incluidos LLD, llvm-objcopy, llvm-ar, llvm-nm y llvm-objdump;
  • Se agregó soporte experimental para usar C++ 17 en OpenCL. Las características específicas incluyen soporte para atributos de espacio de direcciones, bloqueo de la conversión del espacio de direcciones mediante operadores de conversión de tipos, provisión de tipos de vectores como en OpenCL para C, la presencia de tipos OpenCL específicos para imágenes, eventos, canales, etc.
  • Se agregaron nuevos indicadores del compilador “-ftime-trace” y “-ftime-trace-granularity=N” para generar un informe sobre el tiempo de ejecución de varias etapas del frontend (análisis, inicialización) y backend (etapas de optimización). El informe se guarda en formato json, compatible con chrome://tracing y speedscope.app;
  • Se agregó procesamiento del especificador “__declspec(allocator)” y generación de información de depuración adjunta que le permite monitorear el consumo de memoria en el entorno de Visual Studio;
  • Para el lenguaje C, se agregó soporte para la macro “__FILE_NAME__”, que se parece a la macro “__FILE__”, pero incluye solo el nombre del archivo sin la ruta completa;
  • C++ ha ampliado el soporte para atributos de espacio de direcciones para cubrir varias características de C++, incluidos patrones de parámetros y argumentos, tipos de referencia, inferencia de tipos de retorno, objetos, funciones generadas automáticamente, operadores integrados y más.
  • Se han ampliado las capacidades asociadas con el soporte para OpenCL, OpenMP y CUDA. Esto incluye soporte inicial para la inclusión implícita de funciones OpenCL integradas (se agregó el indicador “-fdeclare-opencl-builtins”), se implementó la extensión cl_arm_integer_dot_product y se ampliaron las herramientas de diagnóstico;
  • Se mejoró el trabajo del analizador estático y se agregó documentación sobre cómo realizar análisis estáticos. Se agregaron indicadores para mostrar los módulos de verificación disponibles y las opciones admitidas (“-analyzer-checker[-option]-help”, “-analyzer-checker[-option]-help-alpha” y “-analyzer-checker[-option]-help "-desarrollador"). Se agregó el indicador "-analyzer-werror" para tratar las advertencias como errores.
    Se agregaron nuevos modos de verificación:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling para identificar prácticas inseguras para trabajar con buffers;
    • osx.MIGChecker para buscar violaciones de las reglas de llamada MIG (Mach Interface Generator);
    • optin.osx.OSObjectCStyleCast para encontrar conversiones incorrectas de objetos XNU libkern;
    • apiModeling.llvm con un conjunto de funciones de verificación de modelado para detectar errores en el código base de LLVM;
    • Código estabilizado para comprobar objetos C++ no inicializados (UninitializedObject en el paquete optin.cplusplus);
  • La utilidad clang-format ha agregado soporte para formatear código en el lenguaje C# y brinda soporte para el estilo de formato de código utilizado por Microsoft;
  • clang-cl, una interfaz de línea de comandos alternativa que proporciona compatibilidad a nivel de opciones con el compilador cl.exe incluido en Visual Studio, ha agregado heurísticas para tratar archivos inexistentes como opciones de línea de comandos y mostrar la advertencia correspondiente (por ejemplo, al ejecutar "clang-cl /diagnostic :caret /c test.cc");
  • Se ha agregado una gran parte de nuevas comprobaciones a linter clang-tidy, incluidas comprobaciones adicionales específicas de la API OpenMP;
  • Expandido capacidades del servidor sonido metálico (Clang Server), en el que el modo de creación de índices en segundo plano está habilitado de forma predeterminada, se ha agregado soporte para acciones contextuales con código (recuperación de variables, expansión de definiciones automáticas y macro, conversión de cadenas con escape a sin escape), la capacidad de mostrar advertencias de Clang-tidy, diagnóstico ampliado de errores en archivos de encabezado y agregó la capacidad de mostrar información sobre la jerarquía de tipos;

El principal innovaciones LLVM 9.0:

  • Se ha agregado una función de partición experimental al vinculador LLD, que le permite dividir un programa en varias partes, cada una de las cuales se encuentra en un archivo ELF separado. Esta función le permite iniciar la parte principal del programa, que cargará otros componentes según sea necesario durante la operación (por ejemplo, puede separar el visor de PDF integrado en un archivo separado, que se cargará solo cuando el usuario abra el PDF). archivo).

    Vinculador LLD traído a un estado adecuado para vincular el kernel de Linux para las arquitecturas arm32_7, arm64, ppc64le y x86_64.
    Nuevas opciones "-" (salida a stdout), "-[no-]allow-shlib-undefinido", "-undefinido-glob", "-nmagic", "-omagic", "-dependent-library", " - z ifunc-noplt" y "-z tamaño de página común". Para la arquitectura AArch64, se agregó soporte para las instrucciones BTI (Indicador de destino de rama) y PAC (Código de autenticación de puntero). Se ha mejorado significativamente la compatibilidad con las plataformas MIPS, RISC-V y PowerPC. Se agregó soporte inicial para enlaces dinámicos para WebAssembly;

  • En libc++ implementado funciones ssize, std::is_constant_evaluated, std::midpoint y std::lerp, se han agregado los métodos “front” y “back” a std::span, se han agregado atributos de tipos std::is_unbounded_array y std::is_bounded_array , se han ampliado las capacidades estándar: :atomic. Se ha interrumpido la compatibilidad con GCC 4.9 (se puede utilizar con GCC 5.1 y versiones más recientes). Soporte agregado WASI (Interfaz del sistema WebAssembly, una interfaz para usar WebAssembly fuera del navegador);
  • Se han agregado nuevas optimizaciones. Se habilitó la conversión de llamadas memcmp a bcmp en algunas situaciones. Se implementó la omisión de la verificación de rango para tablas de salto en las que los bloques de interruptores inferiores son inaccesibles o cuando no se usan instrucciones, por ejemplo, al llamar a funciones con tipo void;
  • Se ha estabilizado el backend de la arquitectura RISC-V, que ya no se posiciona como experimental y se construye de forma predeterminada. Proporciona soporte completo de generación de código para variantes de conjuntos de instrucciones RV32I y RV64I con extensiones MAFDC;
  • Se han realizado numerosas mejoras en los backends para las arquitecturas X86, AArch64, ARM, SystemZ, MIPS, AMDGPU y PowerPC. Por ejemplo, para la arquitectura.
    AArch64 agregó soporte para las instrucciones SVE2 (Scalable Vector Extension 2) y MTE (Memory Tagging Extensions); en el backend ARM, se agregó soporte para la arquitectura Armv8.1-M y la extensión MVE (M-Profile Vector Extension). Se agregó soporte para la arquitectura GFX10 (Navi) al backend de AMDGPU, las capacidades de llamada de funciones están habilitadas de forma predeterminada y se activa un pase combinado. DPP (Primitivas de datos paralelos).

  • El depurador LLDB ahora tiene resaltado de color para seguimientos inversos y soporte agregado para los bloques DWARF4 debug_types y DWARF5 debug_info;
  • Se ha agregado soporte para archivos objeto y ejecutables en formato COFF a las utilidades llvm-objcopy y llvm-strip.

Fuente: opennet.ru

Añadir un comentario