Después de seis meses de desarrollo se ha presentado la nueva versión de LLVM 17.0, en la cual se han implementado diversas mejoras, cambios, correcciones de errores y sobre todo diversos aspectos importantes en Clang 17.0.
Para quienes desconocen de LLVM, deben saber que este es un compilador compatible con GCC (compiladores, optimizadores y generadores de código) que compila programas en un código de bits 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 ser convertido por el compilador JIT en instrucciones de máquina justo en el momento de la ejecución del programa.
Principales novedades de LLVM 17.0
En esta nueva versión que se presenta de LLVM 17.0 hay diversos aspectos relevantes a tomar en cuenta, de los cuales están por ejemplo las mejoras en el backend X86, pues ha agregado soporte para extensiones de arquitectura de conjunto de instrucciones ISA SHA512, ISA SM3, ISA SM4 e ISA AVX-VNNI-INT16.
Ademas de ello, también se destaca las mejoras en las capacidades de backend para la arquitectura RISC-V que se han ampliado significativamente, pues agregó soporte para el procesador sifive-x280.
Otro de los cambios que podremos encontrar, es el soporte implementado para extensiones de procesador XTH*, asi como compatibilidad con las extensiones LSX, LASX, LVZ y LBT ISA al backend de la arquitectura LoongArch.
Se han mejorado los backends para arquitecturas AArch64, ARM, WebAssembly, MIPS, PowerPC, AMDGPU, se han ampliado las capacidades del enlazador LLD y se agregó un nuevo comando de «register info» al depurador LLDB para mostrar toda la información conocida sobre un registro.
Por la parte de las mejoras en Clang 17.0 se destaca que se han implementado las características definidas en el futuro C-estándar C2x tales como las palabras clave bool, static_assert, aligns, alignof y thread_local, también la capacidad de especificar corchetes vacíos «{}» para la inicialización a valores cero.
El código C proporciona la capacidad de reenviar la expresión «goto» dentro de bloques «asm» mediante etiquetas seleccionadas indirectamente, se agregó soporte para una extensión de C que permite usar un tipo en lugar de una expresión como primer operando en «_Generic», ademas de que en expresiones constantes en lenguaje C se permite el uso de estructuras, uniones y arrays declarados con el atributo «const».
Por la parte de las mejoras relacionadas con el estándar C++20, se menciona que ahora en todas las plataformas, excepto Windows, se tienen soporte completo para Coroutines, ademas de que se han implementado los requisitos adicionales para operaciones de comparación de expresiones constantes.
También se destaca que ahora se garantiza el análisis correcto de las plantillas lambda especificadas inmediatamente después de los parámetros de la plantilla y que contienen una variable con un tipo dependiente en el bloque. Se reservó el uso de guiones bajos dobles en literales de usuario y se desaconsejó el uso de la palabra clave «operator» en definiciones de funciones con identificadores reservados en el nombre
En cuanto a las mejoras a tomar en relacionadas con el estándar C++23 , se menciona que se encuentra en la etapa final de aprobación por parte de ISO, pues se cambió el alcance del tipo de retorno final en las funciones lambda para observar primero los ganchos y luego el texto circundante.
De los demás cambios que se destacan:
- Se agregó la capacidad de definir matrices multidimensionales usando
- Al compilar aplicaciones C++ usando el modo de optimización «-O0», se ha mejorado la generación de código para llamadas.
- Se agregó soporte para la variable de entorno NO_COLOR para deshabilitar el color de salida.
- Las herramientas de diagnóstico y análisis estático se han ampliado significativamente, por ejemplo, se han agregado nuevas comprobaciones de desbordamiento de enteros con signo, corrección de plantillas lambda, expresiones constexpr, comparaciones con punteros nulos, uso de estructuras no inicializadas, etc.
- La biblioteca Libc++ continúa implementando soporte para las capacidades de los estándares C++20 y C++23, y también se ha comenzado a trabajar para brindar soporte para la especificación C++26.
- Se agregó soporte para la expresión «requires cplusplus23» en las descripciones de conexiones entre archivos de encabezado y módulos.
Finalmente si estás interesado en poder conocer más al respecto, puedes consultar los detalles en el siguiente enlace.