LLVM 15.0 llega con mejoras para diferentes backend, mayor soporte y mas
Después de seis meses de desarrollo, se dio a conocer el lanzamiento del proyecto LLVM 15.0, en el cual se han realizado una gran cantidad de cambios importantes, así como también que se ha añadido el soporte para nuevos procesadores, arquitecturas y más.
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 15.0
En esta nueva versión que se presenta se destaca que se agregó el soporte para los procesadores Cortex-M85, así como para las arquitecturas Armv9-A, Armv9.1-A y Armv9.2-A, extensiones Armv8.1-M PACBTI-M.
Otro de los cambios que se destaca es que se ha agregado un backend experimental de DirectX que admite el formato DXIL (DirectX Intermediate Language) utilizado para los sombreadores de DirectX. El backend se habilita a través de la opción de compilación «-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX».
Libc++ continúa implementando nuevas funciones de los estándares C++20 y C++2b , incluida la finalización de la implementación de la biblioteca «format» y la versión experimental propuesta de la biblioteca «ranges».
Por la parte de los cambios relacionados con Clang 15.0 se menciona que se agregó soporte experimental para el lenguaje similar a C HLSL (Lenguaje de sombreado de alto nivel), que se usa para escribir sombreadores a partir de DirectX 9, así como también la traducción de sombreadores HLSL al formato binario DXIL (Lenguaje intermedio de DirectX) compatible con DirectX 12, así como en el formato SPIR-V utilizado por Vulkan. En el futuro, planean implementar soporte para el formato DXBC (DirectX Bytecode) utilizado en DirectX 9-11. La implementación la proporciona Microsoft y se basa en el compilador DirectX Shader Compiler, abierto en 2017, creado sobre la base de LLVM 3.7.
También se menciona que se continúa con el trabajo para admitir futuros estándares C2X y C++23. Implementado para el lenguaje C: el atributo noreturn , las palabras clave false y true, el tipo _BitInt(N) para enteros de una profundidad de bits dada, las macros *_WIDTH , el prefijo u8 para caracteres UTF-8.
Además de ello, se ha implementado para C++: fusión de módulos, aislamiento ABI de miembros de funciones, inicialización dinámica ordenada de variables no locales en módulo, operadores de índices multidimensionales, auto(x), variables no literales, goto y etiquetas en funciones declaradas como constexpr, secuencias de escape delimitadas, caracteres de escape con nombre.
Para los sistemas basados en la arquitectura x86, se agregó el indicador «-fzero-call-used-regs», que proporciona la puesta a cero de todos los registros de la CPU utilizados en la función antes de devolver el control desde la función. Esta opción permite protegerse contra la fuga de información de las funciones y reducir la cantidad de bloques adecuados para crear dispositivos ROP (programación orientada al retorno) en exploits en aproximadamente un 20 %.
Se ha implementado la aleatorización de la ubicación de la memoria de las estructuras para el código C, lo que complica la extracción de datos de las estructuras en caso de explotación de vulnerabilidades. La aleatorización se activa y desactiva con los atributos randomize_layout y no_randomize_layout, y requiere que la semilla se configure con el indicador «-frandomize-layout-seed» o «-frandomize-layout-seed-file» para garantizar compilaciones repetibles.
De los demás cambios que se destacan:
- Capacidades ampliadas relacionadas con la compatibilidad con OpenCL y OpenMP. Se agregó soporte para la extensión de OpenCL cl_khr_subgroup_rotate.
- Backends mejorados para arquitecturas x86, PowerPC y RISC-V.
Capacidades mejoradas del enlazador LLD y el depurador LLDB. - Se agregó el indicador «-fstrict-flex-arrays=<arg>» con el que puede controlar los límites de un elemento de matriz flexible en estructuras (Miembros de matriz flexibl, una matriz de tamaño indefinido al final de la estructura).
- Se agregó la opción «-Warray-parameter» para advertir sobre la anulación de funciones con declaraciones de argumentos no coincidentes asociadas con matrices de longitud fija y variable.
- Compatibilidad mejorada con MSVC.
- Se agregó soporte para la «función #pragma y «#pragma alloc_text» proporcionada en MSVC.
- Se agregó soporte para banderas /JMC y /JMC compatibles con MSVC.
- Se agregó el indicador «-m[no-]rdpru» para controlar el uso de la instrucción RDPRU, compatible desde los procesadores AMD Zen2.
- Se agregó el indicador «-mfunction-return=thunk-extern» para proteger contra la vulnerabilidad RETBLEED , que funciona agregando una secuencia de instrucciones que excluye la participación del mecanismo de ejecución especulativa para saltos indirectos.
Finalmente si estás interesado en poder conocer más al respecto, puedes consultar los detalles en el siguiente enlace.