Lanzamiento del conjunto de compiladores LLVM 16.0

Después de seis meses de desarrollo, se presentó el lanzamiento del proyecto LLVM 16.0: un conjunto de herramientas compatible con GCC (compiladores, optimizadores y generadores de código) que compila programas en códigos de bits intermedios de instrucciones virtuales tipo RISC (una máquina virtual de bajo nivel con 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.

Mejoras importantes en Clang 16.0:

  • El estándar predeterminado de C++/ObjC++ es gnu++17 (anteriormente gnu++14), lo que significa que las funciones de C++17 con extensiones GNU son compatibles de forma predeterminada. Para devolver el comportamiento anterior, puede utilizar la opción "-std=gnu++14".
  • Funciones avanzadas implementadas relacionadas con el estándar C++20:
    • Funciones miembro especiales condicionalmente triviales,
    • capturar enlaces estructurados en funciones lambda,
    • Operador de igualdad dentro de expresiones,
    • Opción para omitir la palabra clave typename en algunos contextos,
    • Inicialización agregada válida entre paréntesis (“Aggr(val1, val2)”).
  • Se han implementado las características definidas en el futuro estándar C++2b:
    • Se permite colocar etiquetas al final de expresiones compuestas,
    • operador estático(),
    • operador estático [],
    • Se garantiza la compatibilidad con el tipo char8_t,
    • Se ha ampliado el rango de caracteres permitidos para su uso en "\N{...}"
    • Se agregó la capacidad de usar variables declaradas como "constexpr estática" en funciones declaradas como constexpr.
  • Se han implementado las características definidas en el futuro C-estándar C2x:
    • Para deshabilitar la advertencia "-Wunused-label", se permite aplicar el atributo "[[maybe_unused]]" a las etiquetas
    • Está permitido colocar etiquetas en cualquier lugar dentro de expresiones compuestas,
    • Se agregaron operadores typeof y typeof_unqual,
    • Un nuevo tipo nullptr_t y una constante nullptr para definir punteros nulos que se pueden convertir a cualquier tipo de puntero y representar una variante de NULL que no está vinculada a tipos enteros y void*.
    • En el modo C2x, se permite llamar a la macro va_start con un número variable de argumentos (variádicos).
  • En los modos de cumplimiento C99, C11 y C17, las opciones predeterminadas "-Wimplicit-function-declaration" y "-Wimplicit-int" ahora producen un error en lugar de una advertencia.
  • El uso indirecto de "void *" (por ejemplo, "void func(void *p) { *p; }") en modo C++ ahora genera un error, similar a ISO C++, GCC, ICC y MSVC.
  • Especificar campos de bits como operandos de instrucción (por ejemplo, "__asm ​​​​{ mov eax, s.bf }") en bloques de ensamblaje en línea estilo Microsoft ahora genera un error.
  • Se agregaron diagnósticos por la presencia de diferentes estructuras y uniones con los mismos nombres en diferentes módulos.
  • Se han ampliado las capacidades asociadas con la compatibilidad con OpenCL y OpenMP. Diagnóstico mejorado para plantillas C++ utilizadas en argumentos del kernel OpenCL. Soporte de bloque de cola mejorado para AMDGPU. El atributo nounwind se agrega implícitamente a todas las funciones. Soporte mejorado para funciones integradas.
  • Se agregó la capacidad de usar la variable de entorno CLANG_CRASH_DIAGNOSTICS_DIR para definir el directorio en el que se guardan los datos de diagnóstico de fallas.
  • La compatibilidad con Unicode se ha actualizado a la especificación Unicode 15.0. Se permiten algunos símbolos matemáticos en los identificadores, como "₊" (por ejemplo, "doble xₖ₊₁").
  • Se agregó soporte para cargar múltiples archivos de configuración (los archivos de configuración predeterminados se cargan primero y luego los especificados mediante el indicador “--config=", que ahora se puede especificar varias veces). Se cambió el orden de carga predeterminado de los archivos de configuración: clang intenta cargar el archivo primero - .cfg, y si no lo encuentra intenta cargar dos archivos .cfg y .cfg. Para deshabilitar la carga de archivos de configuración de forma predeterminada, se agregó el indicador “--no-default-config”.
  • Para garantizar compilaciones repetibles, es posible reemplazar los valores de fecha y hora actuales en las macros __DATE__, __TIME__ y __TIMESTAMP__ con la hora especificada en la variable de entorno SOURCE_DATE_EPOCH.
  • Para verificar la presencia de funciones integradas (integradas) que se pueden usar en el contexto de constantes, se agregó la macro "__has_constexpr_builtin".
  • Se agregó un nuevo indicador de compilación "-fcoro-aligned-allocation" para la asignación de marcos de rutina alineados.
  • El indicador “-fstrict-flex-arrays=" implementa soporte para el tercer nivel de verificación de elementos de matriz flexible en estructuras (miembros de matriz flexible, una matriz de tamaño indefinido al final de la estructura). En el tercer nivel, sólo el tamaño "[]" (por ejemplo, "int b[]") se trata como una matriz flexible, pero el tamaño "[0]" (por ejemplo, "int b[0]") no es.
  • Se agregó el indicador "-fmodule-output" para habilitar el modelo de compilación monofásico para módulos estándar de C++.
  • Se agregó el modo "-Rpass-analysis=stack-frame-layout" para ayudar a diagnosticar problemas con el diseño del marco de pila.
  • Se agregó un nuevo atributo __attribute__((target_version("cpu_features"))) y se extendió la funcionalidad del atributo __attribute__((target_clones("cpu_features1","cpu_features2",...))) para seleccionar versiones específicas de funciones proporcionadas por AArch64. CPU.
  • Herramientas de diagnóstico ampliadas:
    • Se agregó la advertencia "-Wsingle-bit-bitfield-constant-conversion" para detectar el truncamiento implícito al asignar uno a un campo de bits con signo de un solo bit.
    • Se ha ampliado el diagnóstico de variables constexpr no inicializadas.
    • Se agregaron advertencias "-Wcast-function-type-strict" y "-Wincompatible-function-pointer-types-strict" para identificar posibles problemas con la conversión de tipos de funciones.
    • Se agregaron diagnósticos para el uso de nombres de módulos reservados o incorrectos en bloques de exportación.
    • Detección mejorada de palabras clave "automáticas" faltantes en las definiciones.
    • La implementación de la advertencia "-Winteger-overflow" ha agregado comprobaciones para situaciones adicionales que provocan desbordamientos.
  • Se implementó soporte para la arquitectura del conjunto de instrucciones LoongArch (-march=loongarch64 o -march=la464), utilizada en los procesadores Loongson 3 5000 e implementando el nuevo RISC ISA, similar a MIPS y RISC-V.

Innovaciones clave en LLVM 16.0:

  • El código LLVM puede utilizar elementos definidos en el estándar C++17.
  • Se han aumentado los requisitos ambientales para construir LLVM. Las herramientas de compilación ahora deberían ser compatibles con el estándar C++17, es decir. Para compilar, necesita al menos GCC 7.1, Clang 5.0, Apple Clang 10.0 o Visual Studio 2019 16.7.
  • El backend para la arquitectura AArch64 agrega soporte para CPU Cortex-A715, Cortex-X3 y Neoverse V2, ensamblador para RME MEC (Contextos de cifrado de memoria), extensiones Armv8.3 (Número complejo) y control de versiones múltiples de funciones.
  • En el backend de la arquitectura ARM se suspendió el soporte para las plataformas de destino Armv2, Armv2A, Armv3 y Armv3M, para las cuales no se garantizaba la generación de código correcto. Se agregó la capacidad de generar código para instrucciones para trabajar con números complejos.
  • El backend para la arquitectura X86 ha agregado soporte para arquitecturas de conjunto de instrucciones (ISA) AMX-FP16, CMPCCXADD, AVX-IFMA, AVX-VNNI-INT8, AVX-NE-CONVERT. Se agregó soporte para las instrucciones RDMSRLIST, RMSRLIST y WRMSRNS. Opciones implementadas "-mcpu=raptorlake", "-mcpu=meteorlake", "-mcpu=emeraldrapids", "-mcpu=sierraforest", "-mcpu=graniterapids" y "-mcpu=grandridge".
  • Se agregó soporte oficial para la plataforma LoongArch.
  • Backends mejorados para arquitecturas MIPS, PowerPC y RISC-V
  • Se agregó soporte para depurar ejecutables de 64 bits para la arquitectura LoongArch al depurador LLDB. Manejo mejorado de los símbolos de depuración de COFF. Se proporcionó filtrado de archivos DLL duplicados en la lista de módulos de Windows cargados.
  • En la biblioteca Libc++, el trabajo principal se centró en implementar soporte para nuevas características de los estándares C++20 y C++23.
  • El vinculador LDD reduce significativamente el tiempo de vinculación al paralelizar el escaneo de reubicación de direcciones y las operaciones de inicialización de secciones. Se agregó soporte para la compresión de secciones usando el algoritmo ZSTD.

Fuente: opennet.ru

Añadir un comentario