LLVM 13.0 llega con mejoras de soporte y mas
Después de seis meses de desarrollo, se acaba de presenta el lanzamiento de la nueva versión del proyecto «LLVM 13.0» compatible con GCC (compiladores, optimizadores y generadores de código) que compila programas en un código de bits intermedio de instrucciones virtuales similares a RISC (una máquina virtual de bajo nivel con un sistema de optimización multinivel).
En esta nueva versión se han añadido diversos cambios y novedades de las cuales se destacan las mejoras de soporte asi como también la implementación de las nuevas características de C++ 20 y C++ 2b entre otras cosas más.
Principales novedades de LLVM 13.0
En esta nueva versión podremos encontrar que se agregó la opción «-ehcontguard» para usar la tecnología CET (Windows Control-flow Enforcement Technology) para proteger en la etapa de manejo de excepciones de la ejecución de exploits construidos usando técnicas de Programación Orientada al Retorno (ROP).
Además, el proyecto debuginfo-test ha sido renombrado a cross-project-tests y está diseñado para probar componentes de varios proyectos, sin limitarse a la información de depuración y el sistema de compilación proporciona soporte para compilar varias distribuciones, por ejemplo, una con utilidades y la otra con bibliotecas para desarrolladores.
Por otra parte Libc++ continúa implementando nuevas características de los estándares C++ 20 y C++ 2b, incluida la finalización de la biblioteca «concepts», además de que se agregó soporte para std :filesystem para Windows basada en MinGW, también archivos de encabezado separados <algorithm>, <iterator> y <utility> y se agregó la opción de compilacion LIBCXX_ENABLE_INCOMPLETE_FEATURES para deshabilitar los archivos de encabezado con una funcionalidad implementada de manera incompleta.
Mientras que el backend para la arquitectura AArch64 admite las extensiones Armv9-A RME (Realm Management Extension) y SME (Scalable Matrix Extension) en ensamblador, se agregó compatibilidad con ISA V68/HVX al backend de la arquitectura Hexagon y el backend x86 ha mejorado la compatibilidad con los procesadores AMD Zen 3 y se agregó soporte para APU GFX1013 RDNA2 al backend AMDGPU.
También se han ampliado las capacidades del enlazador LLD, que implementa el soporte para procesadores Big-endian Aarch64, y el backend Mach-O se ha llevado a un estado que permite enlazar programas ordinarios. Incluye las mejoras necesarias para vincular Glibc mediante LLD.
La utilidad llvm-mca (Machine Code Analyzer) agrega soporte para procesadores de tubería superescalares en orden, como ARM Cortex-A55.
El depurador LLDB para la plataforma AArch64 proporciona soporte completo para la autenticación de puntero, MTE (MemTag, Memory Tagging Extension) y registros SVE, además de que se han agregado comandos que le permiten vincular etiquetas a cada operación de asignación de memoria y organizar, al acceder a la memoria, verificando el puntero que debe estar asociado con la etiqueta correcta.
El depurador LLDB y la interfaz Fortran – Flang se han agregado a los ensamblados binarios generados por el proyecto.
En cuanto a las mejoras que se destacan de Clang 13.0:
- Se ha implementado soporte para llamadas de cola garantizadas (una llamada de subrutina al final de una función, que forma una recursividad de cola si la subrutina se llama a sí misma).
- Se agregaron las banderas «-Wunused-but-set-parameter» y «-Wunused-but-set-variable» para mostrar una advertencia si un parámetro o variable se establece pero no se usa.
- Se agregó la bandera «-Wnull-pointer-subtraction» para mostrar una advertencia si el código puede llevar a un comportamiento indefinido debido al uso de un puntero nulo en las operaciones de resta.
- Se agregó el indicador «-fstack-use» para generar para cada archivo de código un archivo «.su» adicional que contiene información sobre el tamaño de los marcos de la pila para cada función definida en el archivo procesado.
- Se ha agregado un nuevo tipo de salida al analizador estático, «sarif-html», que da como resultado la generación de informes simultáneamente en formatos HTML y Sarif.
- Se agregó una nueva verificación para allocClassWithName. Cuando se especifica la opción «-analyzer-display-progress», se muestra el tiempo de análisis de cada función. El analizador de puntero inteligente (alpha.cplusplus.SmartPtr) está casi listo.
- Se implementó el soporte para las directivas de transformación de bucle («#pragma omp unrol» y «#pragma omp tile»), definidas en la especificación OpenMP 5.1.
- Se ha agregado una gran parte de los nuevos cheques a linter clang-tidy.
Finalmente si estás interesado en poder conocer más al respecto, puedes consultar los detalles en el siguiente enlace.