Lanzamiento del conjunto de compiladores LLVM 10.0

Después de seis meses de desarrollo presentado lanzamiento del proyecto LLVM 10.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 10.0 incluyen soporte para C++ Concepts, ya no ejecuta Clang como un proceso separado, soporte para comprobaciones CFG (protección de flujo de control) para Windows y soporte para nuevas capacidades de CPU.

Mejoras en Sonido metálico 10.0:

  • Se agregó soporte para "conceptos", una extensión de plantilla de C++ que se incluirá en el próximo estándar, cuyo nombre en código es C++2a (activado por el indicador -std=c++2a).
    Los conceptos le permiten definir un conjunto de requisitos de parámetros de plantilla que, en el momento de la compilación, limitan el conjunto de argumentos que se pueden aceptar como parámetros de plantilla. Los conceptos se pueden utilizar para evitar inconsistencias lógicas entre las propiedades de los tipos de datos utilizados dentro de la plantilla y las propiedades del tipo de datos de los parámetros de entrada.

    plantilla
    concepto IgualdadComparable = requiere(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • De forma predeterminada, se detiene el inicio de un proceso separado ("clang -cc1") en el que se realiza la compilación. La compilación ahora se realiza en el proceso principal y se puede usar la opción "-fno-integrated-cc1" para restaurar el comportamiento anterior.
  • Nuevos modos de diagnóstico:
    • "-Wc99-designator" y "-Wreorder-init-list" advierten contra el uso de inicializadores C99 en modo C++ en los casos en que sean correctos en C99 pero no en C++20.
    • "-Wsizeof-array-div" - detecta situaciones como "int arr[10]; …tamañode(arr) / tamañode(corto)…” (debe ser “tamañode(arr) / tamañode(int)”).
    • "-Wxor-used-as-po": advierte contra el uso de construcciones como el uso del operador "^" (xor) en operaciones que pueden confundirse con la exponenciación (2^16).
    • "-Wfinal-dtor-non-final-class": advierte sobre clases que no están marcadas con el especificador "final", pero que tienen un destructor con el atributo "final".
    • "-Wtautological-bitwise-compare" es un grupo de advertencias para diagnosticar comparaciones tautológicas entre una operación bit a bit y una constante, y para identificar comparaciones siempre verdaderas en las que la operación bit a bit OR se aplica a un número no negativo.
    • "-Wbitwise-conditional-parentheses" advierte de problemas al mezclar los operadores lógicos AND (&) y OR (|) con el operador condicional (?:).
    • "-Wmisleading-indentation" es un análogo de la verificación del mismo nombre de GCC, que advierte sobre expresiones sangradas como si fueran parte de un bloque if/else/for/ while, pero en realidad no están incluidas en este bloque. .
    • Al especificar “-Wextra”, se habilita la verificación “-Wdeprecated-copy”, advirtiendo sobre el uso de constructores
      "mover" y "copiar" en clases con una definición de destructor explícita.

    • Se han ampliado las comprobaciones "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-analysis".
    • Las comprobaciones "-Wbitwise-op-parentheses" y "-Wlogic-op-parentheses" están deshabilitadas de forma predeterminada.
  • En código C y C++, las operaciones aritméticas de punteros sólo se permiten en matrices. El desinfectante de comportamiento indefinido en modo "-fsanitize=pointer-overflow" ahora detecta casos como agregar un desplazamiento distinto de cero a un puntero nulo o crear un puntero nulo al restar un número entero de un puntero no nulo.
  • El modo "-fsanitize=implicit-conversion" (Implicit Conversion Sanitizer) está adaptado para identificar problemas con operaciones de incremento y decremento para tipos con un tamaño de bits menor que el del tipo "int".
  • Al seleccionar arquitecturas de destino x86, "-march=skylake-avx512", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" y "-march=cooperlake" de forma predeterminada en vectorizado El código ha dejado de utilizar registros zmm de 512 bits, excepto por su indicación directa en el código fuente. La razón es que la frecuencia de la CPU disminuye al realizar operaciones de 512 bits, lo que puede afectar negativamente al rendimiento general. Para cambiar el nuevo comportamiento, se proporciona la opción "-mprefer-vector-width=512".
  • El comportamiento del indicador "-flax-vector-conversions" es similar al de GCC: las conversiones implícitas de bits vectoriales entre vectores enteros y de punto flotante están prohibidas. Para eliminar esta limitación, se propone utilizar la bandera.
    "-flax-vector-conversions=all", que es el valor predeterminado.

  • Soporte mejorado para CPU MIPS de la familia Octeon. Se agregó "octeon+" a la lista de tipos de CPU válidos.
  • Al ensamblar en código intermedio WebAssembly, se llama automáticamente al optimizador wasm-opt, si está disponible en el sistema.
  • Para sistemas basados ​​​​en la arquitectura RISC-V, se permite el uso de registros que almacenan valores de punto flotante en bloques condicionales de inserciones en línea de ensamblador.
  • Se agregaron nuevos indicadores del compilador: "-fgnuc-version" para establecer el valor de versión para "__GNUC__" y macros similares; "-fmacro-prefix-map=OLD=NEW" para reemplazar el prefijo de directorio ANTIGUO por NUEVO en macros como "__FILE__"; "-fpatchable-function-entry=N[,M]" para generar una cierta cantidad de instrucciones NOP antes y después del punto de entrada de la función. Para RISC-V
    Se agregó soporte para los indicadores "-ffixed-xX", "-mcmodel=medany" y "-mcmodel=medlow".

  • Se agregó soporte para el atributo '__attribute__((target(“branch-protection=..."))), cuyo efecto es similar a la opción -protección-de-rama.
  • En la plataforma Windows, al especificar el indicador "-cfguard", se implementa la sustitución de comprobaciones de integridad del flujo de ejecución (Control Flow Guard) por llamadas a funciones indirectas. Para deshabilitar la sustitución de cheques, puede usar el indicador “-cfguard-nochecks” o el modificador “__declspec(guard(nocf))”.
  • El comportamiento del atributo gnu_inline es similar al de GCC en los casos en que se utiliza sin la palabra clave "extern".
  • Se han ampliado las capacidades asociadas con el soporte de OpenCL y CUDA. Se agregó soporte para nuevas funciones de OpenMP 5.0.
  • Se ha agregado una opción Estándar a la utilidad clang-format, que le permite determinar la versión del estándar C++ utilizado al analizar y formatear el código (Latest, Auto, c++03, c++11, c++14, c++17,c++20).
  • Se han agregado nuevas comprobaciones al analizador estático: alpha.cplusplus.PlacementNew para determinar si hay suficiente espacio de almacenamiento, fuchsia.HandleChecker para detectar fugas relacionadas con los controladores Fuchsia, security.insecureAPI.decodeValueOfObjCType para detectar posibles desbordamientos del búfer al usar [NSCoder decodeValueOfObjCType :en:] .
  • El desinfectante de comportamiento indefinido (UBSan) ha ampliado sus comprobaciones de desbordamiento de puntero para detectar la aplicación de compensaciones distintas de cero a punteros NULL o la adición resultante de un desplazamiento de puntero NULL.
  • En linter clang-tidy agregado una gran parte de los nuevos cheques.

El principal innovaciones LLVM 10.0:

  • al marco Atribuidor Se han agregado nuevas optimizaciones y analizadores interprocedimientos. Se predice el estado de 19 atributos diferentes, incluidos 12 atributos, 12 LLVM IR y 7 atributos abstractos como la vida.
  • Se agregaron nuevas funciones matemáticas matriciales integradas en el compilador (intrínsecos), que se reemplazan por instrucciones vectoriales eficientes durante la compilación.
  • Se han realizado numerosas mejoras en los backends para las arquitecturas X86, AArch64, ARM, SystemZ, MIPS, AMDGPU y PowerPC. Se agregó soporte para CPU
    Cortex-A65, Cortex-A65AE, Neoverse E1 y Neoverse N1. Para ARMv8.1-M, ​​​​se optimizó el proceso de generación de código (por ejemplo, apareció soporte para bucles con una sobrecarga mínima) y se agregó soporte para la autovectorización utilizando la extensión MVE. Soporte mejorado para CPU MIPS Octeon. Para PowerPC, se habilita la vectorización de subrutinas matemáticas utilizando la biblioteca MASSV (Mathematical Acceleration SubSystem), se mejora la generación de código y se optimiza el acceso a la memoria desde los bucles. Para x86, se ha cambiado el manejo de los tipos de vectores v2i32, v4i16, v2i16, v8i8, v4i8 y v2i8.

  • Generador de código mejorado para WebAssembly. Se agregó soporte para TLS (almacenamiento local de subprocesos) y las instrucciones atomic.fence. El soporte SIMD se ha ampliado significativamente. Los archivos de objetos de WebAssembly ahora tienen la capacidad de utilizar firmas de funciones de valores múltiples.
  • El analizador se utiliza al procesar bucles. MemoriaSSA, que le permite definir dependencias entre diferentes operaciones de memoria. MemorySSA puede reducir el tiempo de compilación y ejecución o puede usarse en lugar de AliasSetTracker sin pérdida de rendimiento.
  • El depurador LLDB ha mejorado significativamente la compatibilidad con el formato DWARF v5. Soporte mejorado para construir con MinGW
    y se agregó la capacidad inicial de depurar ejecutables de Windows para arquitecturas ARM y ARM64. Se agregaron descripciones de las opciones ofrecidas al completar automáticamente la entrada presionando la pestaña.

  • Expandido Capacidades del enlazador LLD. Soporte mejorado para el formato ELF, incluida la garantía de compatibilidad total de las plantillas globales con el vinculador GNU, agregando soporte para secciones de depuración comprimidas ".zdebug", agregando la propiedad PT_GNU_PROPERTY para definir la sección .note.gnu.property (se puede usar en el futuro núcleos de Linux),
    Se han implementado los modos “-z código separado”, “-z código separado” y “-z segmentos-cargables separados”. Soporte mejorado para MinGW y WebAssembly.

Fuente: opennet.ru

Añadir un comentario