Lanzamento do paquete de compiladores LLVM 15.0

Despois de seis meses de desenvolvemento, presentouse o lanzamento do proxecto LLVM 15.0: un conxunto de ferramentas compatible con GCC (compiladores, optimizadores e xeradores de código) que compila programas en código de bits intermedio de instrucións virtuais tipo RISC (unha máquina virtual de baixo nivel cun sistema de optimización multinivel). O pseudocódigo xerado pódese converter mediante un compilador JIT en instrucións de máquina directamente no momento da execución do programa.

Melloras principais en Clang 15.0:

  • Para os sistemas baseados na arquitectura x86, engadiuse a marca "-fzero-call-used-regs", que garante que todos os rexistros da CPU utilizados na función se restablezan a cero antes de devolver o control da función. Esta opción permítelle protexerse contra a fuga de información das funcións e reducir aproximadamente un 20 % o número de bloques axeitados para construír gadgets ROP (Return-Oriented Programming) en exploits.
  • Implementouse a aleatorización da colocación da memoria de estruturas para o código C, o que dificulta a extracción de datos das estruturas en caso de explotación de vulnerabilidades. A aleatorización está activada e desactivada mediante os atributos randomize_layout e no_randomize_layout, e require configurar unha semente usando a marca "-frandomize-layout-seed" ou "-frandomize-layout-seed-file".
  • Engadiuse a marca "-fstrict-flex-arrays=" ", co cal pode controlar os límites dun elemento de matriz flexible nas estruturas (Membros de matriz flexibles, unha matriz de tamaño indefinido ao final da estrutura). Cando se establece en 0 (predeterminado), o último elemento da estrutura cunha matriz sempre se procesa como unha matriz flexible, 1 - só os tamaños [], [0] e [1] se procesan como unha matriz flexible, 2 - só os tamaños [] e [0] son ​​procesados ​​como unha matriz flexible.
  • Engadiuse soporte experimental para a linguaxe C-like HLSL (High-Level Shader Language), usada en DirectX para escribir sombreadores.
  • Engadiuse "-Warray-parameter" para advertir sobre a anulación de funcións con declaracións de argumentos incompatibles asociadas con matrices de lonxitude fixa e variable.
  • Compatibilidade mellorada con MSVC. Engadiuse soporte para a "función #pragma" (instruíndolle ao compilador que xere unha chamada de función en lugar da expansión en liña) e "#pragma alloc_text" (define o nome da sección co código da función) proporcionada en MSVC. Engadido soporte para bandeiras /JMC e /JMC compatibles con MSVC.
  • O traballo segue apoiando os futuros estándares C2X e C++23. Para a linguaxe C, impléntanse o seguinte: o atributo noreturn, as palabras clave false e true, o tipo _BitInt(N) para os enteiros dunha determinada profundidade de bits, as macros *_WIDTH, o prefixo u8 para os caracteres codificados en UTF-8.

    Para C++, impléntanse o seguinte: fusión de módulos, illamento ABI dos membros da función, inicialización dinámica ordenada de variables non locais en módulos, operadores de índice multidimensionais, auto(x), variables non literais, goto e etiquetas en funcións declaradas como constexpr , secuencias de escape delimitadas, caracteres de escape con nome.

  • Ampliáronse as capacidades asociadas co soporte OpenCL e OpenMP. Engadido soporte para a extensión OpenCL cl_khr_subgroup_rotate.
  • Para a arquitectura x86, engadiuse protección contra vulnerabilidades dos procesadores causadas pola execución especulativa de instrucións despois de operacións de salto adiante incondicionais. O problema prodúcese debido ao procesamento preventivo das instrucións inmediatamente despois da instrución da rama na memoria (SLS, Straight Line Speculation). Para habilitar a protección, proponse a opción "-mharden-sls=[none|all|return|indirect-jmp]".
  • Para as plataformas que admiten a extensión SSE2, engadiuse o tipo _Float16, que se emula mediante o tipo flotante no caso de falta de compatibilidade coas instrucións AVX512-FP16.
  • Engadiuse a bandeira "-m[no-]rdpru" para controlar o uso da instrución RDPRU, compatible a partir dos procesadores AMD Zen2.
  • Engadiuse a bandeira "-mfunction-return=thunk-extern" para protexerse contra a vulnerabilidade RETBLEED, que funciona engadindo unha secuencia de instrucións que exclúe a implicación do mecanismo de execución especulativa para ramas indirectas.

Innovacións clave en LLVM 15.0:

  • Engadido soporte para as arquitecturas Cortex-M85 CPU, Armv9-A, Armv9.1-A e Armv9.2-A, extensións Armv8.1-M PACBTI-M.
  • Engadiuse un backend experimental para DirectX que admite o formato DXIL (DirectX Intermediate Language) usado para os sombreadores de DirectX. O backend habilitase especificando o parámetro "-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX" durante a montaxe.
  • Libc++ segue implementando novas funcións dos estándares C++20 e C++2b, incluíndo a finalización da implementación da biblioteca "formato" e a versión experimental proposta da biblioteca "rangos".
  • Backends mellorados para arquitecturas x86, PowerPC e RISC-V.
  • Melloráronse as capacidades do enlazador LLD e do depurador LLDB.

Fonte: opennet.ru

Engadir un comentario