Lanzamiento del conjunto de compiladores LLVM 15.0

Después de seis meses de desarrollo, se presentó el lanzamiento del proyecto LLVM 15.0: un conjunto de herramientas compatible con GCC (compiladores, optimizadores y generadores de código) que compila programas en códigos de bits intermedios de instrucciones virtuales tipo RISC (una máquina virtual de bajo nivel con sistema de optimización multinivel). El pseudocódigo generado se puede convertir mediante un compilador JIT en instrucciones de máquina directamente en el momento de la ejecución del programa.

Mejoras importantes en Clang 15.0:

  • Para los sistemas basados ​​en la arquitectura x86, se agregó el indicador “-fzero-call-used-regs”, que garantiza que todos los registros de la CPU utilizados en la función se restablezcan a cero antes de devolver el control de la función. Esta opción le permite protegerse contra la fuga de información de las funciones y reducir la cantidad de bloques adecuados para construir dispositivos ROP (programación orientada al retorno) en exploits en aproximadamente un 20%.
  • Se ha implementado la aleatorización de la ubicación en 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 utilizando los atributos randomize_layout y no_randomize_layout, y requiere configurar una semilla usando el indicador "-frandomize-layout-seed" o "-frandomize-layout-seed-file".
  • Se agregó la bandera "-fstrict-flex-arrays=" ", con el que puede controlar los límites de un elemento de matriz flexible en estructuras (miembros de matriz flexible, una matriz de tamaño indefinido al final de la estructura). Cuando se establece en 0 (predeterminado), el último elemento de la estructura con una matriz siempre se procesa como una matriz flexible, 1: solo los tamaños [], [0] y [1] se procesan como una matriz flexible, 2: solo los tamaños [] y [0] se procesan como una matriz flexible.
  • Se agregó soporte experimental para el lenguaje tipo C HLSL (lenguaje de sombreado de alto nivel), utilizado en DirectX para escribir sombreadores.
  • Se agregó "-Warray-parameter" para advertir sobre funciones anuladas con declaraciones de argumentos incompatibles asociadas con matrices de longitud fija y variable.
  • Compatibilidad mejorada con MSVC. Se agregó soporte para la "función #pragma" (instruye al compilador a generar una llamada de función en lugar de una expansión en línea) y "#pragma alloc_text" (define el nombre de la sección con el código de función) proporcionada en MSVC. Se agregó soporte para indicadores /JMC y /JMC compatibles con MSVC.
  • Se continúa trabajando para respaldar los futuros estándares C2X y C++23. Para el lenguaje C, se implementa lo siguiente: el atributo noreturn, las palabras clave false y true, el tipo _BitInt(N) para números enteros de una profundidad de bits determinada, macros *_WIDTH, el prefijo u8 para caracteres codificados en UTF-8.

    Para C++, se implementa lo siguiente: fusión de módulos, aislamiento ABI de miembros de funciones, inicialización dinámica ordenada de variables no locales en módulos, operadores de índice multidimensionales, auto(x), variables no literales, goto y etiquetas en funciones declaradas como constexpr. , secuencias de escape delimitadas, caracteres de escape nombrados.

  • Se han ampliado las capacidades asociadas con la compatibilidad con OpenCL y OpenMP. Se agregó soporte para la extensión OpenCL cl_khr_subgroup_rotate.
  • Para la arquitectura x86, se ha agregado protección contra vulnerabilidades en los procesadores causadas por la ejecución especulativa de instrucciones después de operaciones de salto hacia adelante incondicionales. El problema se produce debido al procesamiento preventivo de instrucciones inmediatamente después de la instrucción de bifurcación en la memoria (SLS, Straight Line Speculation). Para habilitar la protección se propone la opción “-mharden-sls=[none|all|return|indirect-jmp]”.
  • Para plataformas que soportan la extensión SSE2, se ha agregado el tipo _Float16, que se emula usando el tipo float en caso de falta de soporte para instrucciones AVX512-FP16.
  • Se agregó el indicador "-m[no-]rdpru" para controlar el uso de la instrucción RDPRU, compatible a partir de 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 ramas indirectas.

Innovaciones clave en LLVM 15.0:

  • Se agregó soporte para CPU Cortex-M85, arquitecturas Armv9-A, Armv9.1-A y Armv9.2-A, extensiones Armv8.1-M PACBTI-M.
  • Se ha agregado un backend experimental para DirectX que admite el formato DXIL (DirectX Intermediate Language) utilizado para los sombreadores de DirectX. El backend se habilita especificando el parámetro "-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX" durante el ensamblaje.
  • Libc++ continúa implementando nuevas características de los estándares C++20 y C++2b, incluida la finalización de la implementación de la biblioteca de "formatos" y la versión experimental propuesta de la biblioteca de "rangos".
  • Backends mejorados para arquitecturas x86, PowerPC y RISC-V.
  • Se han mejorado las capacidades del vinculador LLD y del depurador LLDB.

Fuente: opennet.ru

Añadir un comentario