LLVM 18.1.0 llega con mejoras de soporte, en backends y mas
El lanzamiento del proyecto LLVM 18.1.0 llega después de seis meses de desarrollo y presenta mejoras con GCC que abarcan compiladores, optimizadores y generadores de código. Un cambio notable en esta versión es el nuevo esquema para generar números de versión en el proyecto LLVM a partir de la rama 18.x. Siguiendo la práctica de proyectos como GCC y GDB, se ha adoptado el uso de la versión cero («N.0») durante el desarrollo, mientras que la primera versión estable lleva el número «N.1». Este cambio ofrece ventajas al separar las compilaciones basadas en la rama principal de las compilaciones de la rama de lanzamiento final.
Por ejemplo, en la preparación para la versión actual (18.1.0), el desarrollo se realizó utilizando la rama inestable de LLVM 18.0. Luego, la primera versión estable se lanzó con el número 18.1.0, marcando así la culminación de un ciclo de desarrollo y pruebas exhaustivas. Además, este nuevo esquema permite la generación de comunicados correctivos cada dos semanas si fuera necesario, bajo los números 18.1.1, 18.1.2, y así sucesivamente.
Es importante destacar que si se realizan cambios en la rama actual que afectan la ABI (Interfaz Binaria de Aplicación), la actualización se reflejará con un cambio en el segundo dígito de la versión, por ejemplo, 18.2.0. Esto garantiza una gestión coherente y transparente de las versiones, brindando a los usuarios la claridad necesaria sobre la estabilidad y las modificaciones realizadas en cada lanzamiento.
Principales novedades de LLVM 18.1.0
En esta nueva versión que se presenta de LLVM 18.1.0, en la arquitectura X86 se implementaron mejoras de soporte para extensiones ISA. En particular, se ha añadido soporte para las extensiones USER_MSR, AVX10.1-256 y AVX10.1-512. Además, se ha unificado el tipo i128 con el tipo __int128 de GCC y clang, lo que facilita una mayor compatibilidad binaria con proyectos externos como Rust.
Otro de los aspectos destacados en LLVM 18.1.0 fue para RISC-V, ya que se han realizado varias mejoras y adiciones significativas al estabilizar el soporte para extensiones, además se han agregado funciones integradas para las extensiones y se ha implementado soporte experimental para la generación de código en arquitecturas RV32E, RV64E, ilp32e y lp64e.
En el backend de la arquitectura LoongArch, se han agregado funciones integradas para las extensiones LSX (SIMD de 128 bits) y LASX (SIMD de 256 bits), se ha añadido soporte para nuevas instrucciones introducidas en la especificación 1.10 del Manual de referencia de LoongArch, y se ha implementado soporte inicial para la vectorización automática.
En AArch64, se ha ampliado la compatibilidad con procesadores como Cortex-A520, Cortex-A720 y Cortex-X4, y se ha implementado el soporte para el mecanismo Stack Clash Protection, que detecta desbordamientos de pila y bloquea métodos de ataque basados en la intersección de la pila y el montón.
Además de estas mejoras específicas en los backends de diversas arquitecturas, se han realizado mejoras generales en los backends para arquitecturas como WebAssembly, MIPS, PowerPC y AMDGPU. También se han ampliado las capacidades del enlazador LLD, se ha mejorado el soporte para arquitecturas RISC-V y AArch64, y se han implementado actualizaciones en la biblioteca Libc++ para seguir las capacidades de los estándares C++20, C++23 y C++26.
Por último, el depurador LLDB ha agregado soporte para extraer automáticamente símbolos y datos binarios de servidores externos que admiten el protocolo DEBUGINFOD, ampliando así la capacidad de depuración en diferentes arquitecturas y añadiendo soporte para extensiones como SME y SME2 (Scalable Matrix Extension) y es importante tener en cuenta que se han eliminado enlaces para el lenguaje Python en algunas áreas, lo que puede requerir ajustes en los procesos de desarrollo que dependan de estos enlaces.
Por las partes de las mejoras que se implementaron en Clang 18 incluyendo cambios relacionados con el lenguaje C:
- Ahora se permite el uso de estructuras, uniones y matrices con el atributo «const» como expresiones constantes, siguiendo la analogía con GCC.
- Las enumeraciones ahora se reflejan en los metadatos TBAA (Análisis de alias basado en tipos) como su tipo entero original en lugar de tratarse como un tipo «char».
- Se agregó soporte para el atributo «counted_by», que permite especificar un campo en una estructura con una matriz flexible para determinar la cantidad de elementos en la matriz flexible, mejorando la eficiencia de las comprobaciones de desbordamiento del búfer en clang.
- Se implementó soporte para la expresión «requiere c23» para vincular módulos y admitir el estándar C23.
- Se implementó una función experimental para utilizar tipos adicionales de argumentos sin tipo en plantillas, lo que permite la especificación de valores de punto flotante, punteros y referencias a subobjetos.
- Se agregó soporte experimental para el mecanismo «Deducing this», que permite usar parámetros con el atributo «this» en una plantilla y descubrir la categoría de la expresión para la que se llamó esta función.
Finalmente si estás interesado en poder conocer más al respecto, puedes consultar los detalles en el siguiente enlace.