Después de seis meses de desarrollo se presentó el lanzamiento de la nueva versión del proyecto LLVM 12.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 podremos encontrar diversas mejoras y novedades, de las cuales podemos destacar un nuevo atributo de función «tune-cpu» para admitir -mtune como gcc, asi como también mejoras a las diferentes plataformas.
Principales novedades de LLVM 12.0
En esta nueva versión, podremos encontrar que el soporte para el juego de herramientas de compilación llvm-build escrito en Python se ha descontinuado, en lugar de lo cual el proyecto ha cambiado por completo al uso del sistema de compilación CMake.
El backend para la arquitectura AArch64 ha mejorado el soporte para la plataforma Windows: se proporciona la generación correcta de salida del ensamblador para los sistemas Windows de destino, se ha optimizado la generación de datos sobre llamadas de desenrollado (el tamaño de dichos datos se ha reducido en un 60%), se ha agregado la capacidad de crear datos de desenrollado utilizando las directivas seh.
Mientras que el backend de la arquitectura PowerPC incluye nuevas optimizaciones para implementaciones en bucle y en línea, mejoras en el soporte para procesadores Power10, soporte adicional para instrucciones MMA para manipular matrices y soporte mejorado para el sistema operativo AIX.
Para x86 se agrega soporte para procesadores AMD Zen 3, Intel Alder Lake e Intel Sapphire Rapids, así como instrucciones para procesadores HRESET, UINTR y AVXVNNI. Se eliminó el soporte para extensiones MPX (extensiones de protección de memoria) para verificar punteros contra los límites del área de memoria (esta tecnología no se ha utilizado ampliamente y ya se ha eliminado de GCC y clang). El ensamblador ha agregado soporte para los prefijos {disp32} y {disp8} y los sufijos .d32 y .d8 para controlar el tamaño del desplazamiento de operandos y transiciones. Se agregó un nuevo atributo «tune-cpu» para controlar la habilitación de optimizaciones de microarquitectura.
Otro de los cambios que se destaca es que se ha agregado un nuevo modo «-fsanitize=unsigned-shift-base» para detectar desbordamientos de enteros sin signo después de un desplazamiento de bits hacia la izquierda. Para el formato Mach-O (macOS), se implementa el soporte para las arquitecturas arm64, arm e i386, optimización en la etapa de vinculación (LTO) y desenrollado de pila cuando se manejan excepciones.
También se destaca un nuevo atributo de función «tune-cpu» que permite que las optimizaciones de microarquitectura se apliquen independientemente del atributo «target-cpu» o de la CPU TargetMachine que se utilizará para seleccionar el conjunto de instrucciones. Si el atributo no está presente, la CPU de ajuste seguirá a la CPU de destino.
Libc++ implementa nuevas características del estándar C++ 20 y comenzó a desarrollar características de la especificación C++ 2b, además de que se agregó soporte para ensamblar con deshabilitación de soporte para localización («-DLIBCXX_ENABLE_LOCALIZATION = OFF») y dispositivos para generar números pseudoaleatorios.
Mientras que de las mejoras para Clang 12, para la arquitectura AArch64, se han agregado nuevos indicadores del compilador «-moutline-atomics» y «-mno-outline-atomics» para habilitar y deshabilitar funciones de ayuda atómica como «__aarch64_cas8_relax». Dichas funciones en tiempo de ejecución determinan si hay soporte para Large System Extensions (LSE) y usan las instrucciones del procesador atómico proporcionadas o la reversión para usar instrucciones LL/SC (Load-link/store-conditional) para la sincronización.
El puntero ‘this’ ahora se procesa con comprobaciones no nulas y desreferenciables (N). La opción «-fdelete-null-pointer-checks» se puede utilizar para eliminar el atributo no nulo cuando se requieren valores nulos.
En Linux para las arquitecturas AArch64 y PowerPC, «-fasynchronous -wind-tables» está habilitado para generar tablas de llamadas de desenrollado, como en GCC.
En «#pragma clang loop vectorize_width» se agregó la capacidad de especificar las opciones «fija» (predeterminada) y «escalable» para seleccionar el método de vectorización.
En el servidor de almacenamiento en caché clangd (Clang Server) en Linux, el consumo de memoria durante el funcionamiento a largo plazo se reduce significativamente (se proporciona una llamada periódica a malloc_trim para devolver las páginas de memoria libres al sistema operativo).
Finalmente si estás interesado en conocer más al respecto sobre esta nueva versión, puedes consultar los detalles en el siguiente. enlace.