Lanzamiento del conjunto de compiladores LLVM 11.0

Después de seis meses de desarrollo presentado lanzamiento del proyecto LLVM 11.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.

El cambio clave en la nueva versión fue la inclusión de reborde, interfaz para el lenguaje Fortran. Flang es compatible con Fortran 2018, OpenMP 4.5 y OpenACC 3.0, pero el desarrollo del proyecto aún no se ha completado y la interfaz se limita al análisis del código y la verificación de su corrección. Aún no se admite la generación de código intermedio LLVM y, para generar archivos ejecutables, se genera código canónico y se pasa a un compilador externo de Fortran.

Mejoras en Sonido metálico 11.0:

  • Se agregó la capacidad de restaurar el árbol de sintaxis abstracta (AST) para código C++ roto, que puede usarse para ayudar a diagnosticar errores y proporciona información adicional a utilidades externas como clang-tidy y clangd. La función está habilitada de forma predeterminada para el código C++ y se controla mediante las opciones "-Xclang -f[no-]recovery-ast".
  • Se agregaron nuevos modos de diagnóstico:
    • "-Wpointer-to-int-cast" es un grupo de advertencias sobre la conversión de punteros a un tipo entero int que no se adapta a todos los valores posibles.
    • “-Wuninitialized-const-reference”: advertencia sobre el paso de variables no inicializadas en parámetros de función que aceptan argumentos de referencia con el atributo “const”.
    • "-Wimplicit-const-int-float-conversion": habilitado de forma predeterminada, advierte sobre la conversión implícita de una constante real a un tipo entero.
  • Para la plataforma ARM, se proporcionan funciones C integradas en el compilador (intrínsecos), reemplazado por instrucciones vectoriales eficientes Arm v8.1-M MVE y CDE. Las funciones disponibles se definen en los archivos de encabezado arm_mve.h y arm_cde.h.
  • Добавлен un conjunto de tipos de enteros extendidos _ExtInt(N), que le permiten crear tipos que no son múltiplos de potencias de dos, que se pueden procesar de manera eficiente en FPGA/HLS. Por ejemplo, _ExtInt(7) define un tipo entero que consta de 7 bits.
  • Se agregaron macros que definen el soporte para funciones C integradas basadas en instrucciones ARM SVE (Scalable Vector Extension):
    __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. Por ejemplo, la macro __ARM_FEATURE_SVE se define al generar código AArch64 configurando la opción de línea de comando "-march=armv8-a+sve".

  • El indicador "-O" ahora se identifica con el modo de optimización "-O1" en lugar de "-O2".
  • Se agregaron nuevas banderas del compilador:
    • "-fstack-clash-protection" - habilita la protección contra intersecciones de pila y montón.
    • "-ffp-exception-behavior={ignore,maytrap,strict}": le permite seleccionar el modo de controlador de excepciones para números de punto flotante.
    • "-ffp-model={precise,strict,fast}": simplifica el acceso a una serie de opciones especializadas para números de punto flotante.
    • "-fpch-codegen" y "-fpch-debuginfo" para generar un encabezado precompilado (PCH) con archivos objeto separados para código e información de depuración.
    • “-fsanitize-coverage-allowlist” y “-fsanitize-coverage-blocklist” para verificar las listas blancas y negras de pruebas de cobertura.
    • “-mtls-size={12,24,32,48}” para seleccionar el tamaño de TLS (almacenamiento local de subprocesos).
    • "-menable-experimental-extension" para habilitar extensiones RISC-V experimentales.
  • El modo predeterminado para C es "-fno-common", que permite un acceso más eficiente a las variables globales en algunas plataformas.
  • El caché del módulo predeterminado se ha movido de /tmp al directorio ~/.cache. Para anular, puede utilizar el indicador "-fmodules-cache-path=".
  • El estándar de lenguaje C predeterminado se actualizó de gnu11 a gnu17.
  • Se agregó soporte preliminar para la extensión GNU C "conjunto en línea» para agregar inserciones de ensamblador. La extensión aún está siendo analizada, pero no procesada de ninguna manera.
  • Se han ampliado las capacidades asociadas con el soporte de OpenCL y CUDA. Se agregó soporte para el diagnóstico de bloques de OpenCL 2.0 e implementó nuevas funciones de OpenMP 5.0.
  • Se agregó la opción IndentExternBlock a la utilidad clang-format para alinear dentro de bloques externos "C" y externos "C++".
  • El analizador estático ha mejorado el manejo de constructores heredados en C++. Se agregaron nuevas comprobaciones alpha.core.C11Lock y alpha.fuchsia.Lock para buscar bloqueos, alpha.security.cert.pos.34c para detectar el uso inseguro de putenv, webkit.NoUncountedMemberChecker y webkit.RefCntblBaseVirtualDtor para detectar problemas con tipos incontables, alpha .cplusplus .SmartPtr para verificar la desreferencia nula del puntero inteligente.
  • En linter clang-tidy agregado una gran parte de los nuevos cheques.
  • El servidor de almacenamiento en caché clangd (Clang Server) ha mejorado el rendimiento y ha agregado nuevas capacidades de diagnóstico.

El principal innovaciones LLVM 11.0:

  • El sistema de compilación ha pasado a utilizar Python 3. Si Python 3 no está disponible, es posible volver a utilizar Python 2.
  • La interfaz con el compilador para el lenguaje Go (llgo) está excluida de la versión, que puede ser reestructurada en el futuro.
  • El atributo vector-function-abi-variant se ha agregado a la representación intermedia (IR) para describir el mapeo entre funciones escalares y vectoriales para vectorizar llamadas. Desde llvm::VectorType hay dos tipos de vectores separados llvm::FixedVectorType y llvm::ScalableVectorType.
  • La bifurcación basada en valores udef y el paso de valores undef a funciones de biblioteca estándar se reconoce como un comportamiento indefinido. EN
    memset/memcpy/memmove permite pasar punteros undef, pero si el parámetro con tamaño es cero.

  • LLJIT ha agregado soporte para realizar inicializaciones estáticas a través de los métodos LLJIT::initialize y LLJIT::deinitialize. Se ha implementado la capacidad de agregar bibliotecas estáticas a JITDylib utilizando la clase StaticLibraryDefinitionGenerator. API C agregada para ORCv2 (API para construir compiladores JIT).
  • Se ha agregado compatibilidad con los procesadores Cortex-A64, Cortex-A34, Cortex-A77 y Cortex-X78 al backend de la arquitectura AArch1. Se implementaron extensiones ARMv8.2-BF16 (BFloat16) y ARMv8.6-A, incluidas RMv8.6-ECV (virtualización de contador mejorada), ARMv8.6-FGT (trampas de grano fino), ARMv8.6-AMU (virtualización de monitores de actividad) y ARMv8.0-DGH (pista de recopilación de datos). Se proporciona la capacidad de generar código para enlaces de funciones integradas a instrucciones vectoriales SVE.
  • Se ha agregado compatibilidad con los procesadores Cortex-M55, Cortex-A77, Cortex-A78 y Cortex-X1 al backend de la arquitectura ARM. Extensiones implementadas
    Armv8.6-A Matrix Multiply y RMv8.2-AA32BF16 BFloat16.

  • Se ha agregado soporte para la generación de código para procesadores POWER10 al backend de la arquitectura PowerPC. Se han ampliado las optimizaciones de bucle y se ha mejorado la compatibilidad con punto flotante.
  • El backend de la arquitectura RISC-V permite la aceptación de parches que admiten conjuntos de instrucciones extendidas experimentales que aún no han sido aprobados oficialmente.
  • El backend de la arquitectura AVR se ha transferido de la categoría experimental a la estable, incluida en la distribución básica.
  • El backend para la arquitectura x86 admite instrucciones Intel AMX y TSXLDTRK. Protección adicional contra ataques HVAC (Inyección de valor de carga), y también implementa un mecanismo general de supresión de efectos secundarios de ejecución especulativa para bloquear ataques causados ​​por la ejecución especulativa de operaciones en la CPU.
  • En el backend de la arquitectura SystemZ, se agregó soporte para MemorySanitizer y LeakSanitizer.
  • Se agregó soporte para archivos de encabezado con constantes matemáticas a Libc++ .
  • Expandido Capacidades del enlazador LLD. Soporte mejorado para el formato ELF, incluidas las opciones agregadas "--lto-emit-asm", "--lto-whole-program-visibility", "-print-archive-stats", "-shuffle-sections", " -thinlto- módulo único", "-unique", "-rosegment", "-threads=N". Se agregó la opción "--time-trace" para guardar el seguimiento en un archivo, que luego se puede analizar a través de la interfaz chrome://tracing en Chrome.

Fuente: opennet.ru

Añadir un comentario