Tras seis meses de desarrollo, se ha publicado LLVM 22.1.0. Desarrolla herramientas (compiladores, optimizadores y generadores de código) que compilan programas en código binario intermedio de instrucciones virtuales tipo RISC (una máquina virtual de bajo nivel con un sistema de optimización multinivel). El pseudocódigo generado puede convertirse en código máquina para una plataforma de destino determinada o utilizarse mediante un compilador JIT (justo a tiempo) para generar instrucciones máquina directamente durante la ejecución del programa. Basado en las tecnologías de LLVM, el proyecto desarrolla el compilador Clang, compatible con los lenguajes de programación C, C++ y Objective-C. A partir de la rama 18.x, el proyecto adoptó un nuevo sistema de numeración de versiones, según el cual se utiliza la versión 0 ("N.0") durante el desarrollo, y la primera versión estable se numera como "N.1".
Las mejoras en Clang 22 incluyen:
- Se añadió compatibilidad con tokens de asignación de memoria (Tokens de Asignación) para marcar las operaciones de asignación de memoria realizadas con funciones como malloc con un identificador único. Los tokens de asignación permiten estructurar la información del montón, simplificar la detección de fugas de memoria y agrupar objetos según su propósito o patrones de modificación (por ejemplo, separar datos "calientes" de "fríos"). Para habilitarlos, utilice el indicador "-fsanitize=alloc-token".
- Características relacionadas con el lenguaje C:
- Se ha implementado un borrador de especificación que define el mecanismo de ejecución diferida "defer", que permite ejecutar acciones al salir del ámbito actual. Se ha añadido el indicador "-fdefer-ts" para habilitar la compatibilidad con "defer".
- Se ha añadido la función integrada __builtin_stack_address(), similar a la función similar de GCC. Esta función devuelve la dirección de pila que separa el área de pila de la función actual que llamó a __builtin_stack_address() y las funciones posteriores que llama.
- Capacidades que se están desarrollando para el futuro estándar C2y:
- Se agregó soporte para bucles con nombre, lo que le permite asignar nombres a bucles y sentencias switch, que se pueden especificar en sentencias break y continue para definir explícitamente el bucle del que salir. external: for (int i = 0; i < IK; ++ i) { for (int j = 0; j < JK; ++ j) { continue; // ir a CONT1 continue external; // ir a CONT2 // CONT1 } // CONT2 }
- La implementación de la macro integrada "__COUNTER__", diseñada para generar nombres de identificadores únicos, se ha ampliado e incluido en el estándar. Se ha establecido un límite de 2147483647 llamadas a esta macro; si se excede este límite, se generará un error.
- Se eliminó la advertencia (-Wstatic-in-inline) al utilizar funciones estáticas o variables dentro de funciones declaradas como "extern inline".
- Capacidades definidas en el estándar C23 C:
- El archivo de encabezado float.h ahora admite las macros FLT_SNAN, DBL_SNAN y LDBL_SNAN, que implementan valores NaN señalados (lo que provoca una excepción cuando se usan en operaciones aritméticas) para tipos float, double y long double.
- Se corrigió un error en el que diferentes tipos sin nombre se trataban como compatibles dentro de la misma unidad de traducción si tenían los mismos campos.
- El indicador "-MG" utilizado para ignorar los archivos de encabezado faltantes durante el escaneo de dependencia se ha extendido a las directivas "#embed" y ahora suprime el error "archivo no encontrado" cuando falta un archivo especificado en una directiva "#embed".
- Características relacionadas con C++:
- Se ha añadido la capacidad de usar enlaces estructurados en el contexto "constexpr", tal como se desarrolló en la especificación C++2c (C++26). Esto significa que las referencias a expresiones constantes ahora pueden ser, en sí mismas, expresiones constantes. Se implementa la compatibilidad con matrices y estructuras simples (aún no se admiten tuplas). constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
- Como lo exige el estándar C++20, las restricciones ahora se convierten a formato estándar antes de verificarse, lo que permite mensajes de diagnóstico más precisos y un manejo adecuado de errores de sustitución en argumentos de plantilla utilizados solo en identificaciones de conceptos.
- Se agregó una familia de funciones integradas "__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship" para averiguar si los operadores de comparación "<", ">", "<=" y ">=" se sintetizaron a partir del operador "<=>".
- El parámetro "-Wincompatible-pointer-types" se ha modificado para que muestre un error en lugar de una advertencia. Para volver al comportamiento anterior, utilice la opción "-Wno-error=incompatible-pointer-types".
- Se añadieron las funciones integradas __builtin_bswapg, __builtin_elementwise_ldexp, __builtin_elementwise_fshl, __builtin_elementwise_fshr, __builtin_elementwise_minnumnum, __builtin_elementwise_maxnumnum, __builtin_masked_load, __builtin_masked_expand_load, __builtin_masked_store, __builtin_masked_compress_store, __builtin_masked_gather, __builtin_masked_scatter y __builtin_dedup_pack. Por ejemplo, builtin_dedup_pack permite eliminar duplicados de una lista de tipos: usando MyTypeList = TypeList<__builtin_dedup_pack …>; // el tipo resultante será TypeList
- Al depurar un comportamiento indefinido con UBSan (-fsanitize=undefined -fsanitize-trap=undefined), la información sobre la causa del error ahora se incluye en la información de depuración generada. Se ha añadido el indicador "-fsanitize-debug-trap-reasons" para especificar el nivel de detalle de la información del error. Puede configurarse como "básica" para descripciones generales (p. ej., "Desbordamiento de suma de enteros") y como "detallada" para incluir información detallada (p. ej., "Desbordamiento de suma de enteros con signo en 'a + b'").
- Se agregaron nuevas banderas del compilador:
- "-f[no-]sanitize-debug-trap-reasons" para controlar si los motivos de las trampas de excepción se incorporan en la información de depuración al compilar con el modo "-fsanitize-trap".
- "-fsanitize=alloc-token", "-falloc-token-max", "-fsanitize-alloc-token-fast-abi" y "-fsanitize-alloc-token-extended" para administrar tokens de asignación de memoria.
- "-fmatrix-memory-layout" para controlar la disposición de la memoria de los tipos de matriz (por ejemplo, column-major para column-major, row-major para row-major).
- Las funciones ahora tienen un atributo "malloc_span", similar al atributo malloc pero aplicable a funciones que devuelven estructuras tipo span que contienen un puntero y un campo con el tamaño o un puntero al final del bloque.
- Se agregó el atributo "modular_format" para seleccionar dinámicamente la implementación vinculada estáticamente requerida de la función printf en el momento del enlace.
- Se han ampliado las herramientas de diagnóstico y análisis estático y se han añadido nuevos controles (varias docenas de mejoras relacionadas con el diagnóstico).
- Se han añadido funciones intrínsecas adicionales para las extensiones SSE, AVX y AVX512 al backend X86. Se han añadido modos de compilación para CPU Intel basadas en las microarquitecturas Wildcat Lake (-march=wildcatlake) y Nova Lake (-march=novalake).
- El backend de AArch64 ahora es compatible con los procesadores Ampere Computing Ampere1C (ampere1c), Arm C1-Nano (c1-nano), Arm C1-Pro (c1-pro), Arm C1-Premium (c1-premium) y Arm C1-Ultra (c1-ultra). Se han añadido funciones integradas adicionales para las instrucciones FCVTZ[US], FCVTN[US], FCVTM[US], FCVTP[US] y FCVTA[US]. Se ha estabilizado la compatibilidad con el Multiversionado de Funciones (FMV). Los usuarios ahora pueden anular la prioridad de las diferentes versiones de funciones.
- Se agregó soporte para la arquitectura LoongArch32 (LA32R, LA32S).
- Backends mejorados para arquitecturas ARM, AMDGPU, RISC-V, LoongArch64, MIPS, WebAssembly y PowerPC.
Fuente: opennet.ru
