Lançamento do conjunto de compiladores LLVM 15.0

Após seis meses de desenvolvimento, foi apresentado o lançamento do projeto LLVM 15.0 - um kit de ferramentas compatível com GCC (compiladores, otimizadores e geradores de código) que compila programas em bitcode intermediário de instruções virtuais do tipo RISC (uma máquina virtual de baixo nível com um sistema de otimização multinível). O pseudocódigo gerado pode ser convertido usando um compilador JIT em instruções de máquina diretamente no momento da execução do programa.

Principais melhorias no Clang 15.0:

  • Para sistemas baseados na arquitetura x86, foi adicionado o sinalizador “-fzero-call-used-regs”, que garante que todos os registros da CPU usados ​​na função sejam zerados antes de retornar o controle da função. Esta opção permite proteger contra vazamento de informações de funções e reduzir o número de blocos adequados para a construção de gadgets ROP (Programação Orientada a Retorno) em explorações em aproximadamente 20%.
  • Foi implementada a randomização da colocação de estruturas na memória para código C, o que dificulta a extração de dados de estruturas em caso de exploração de vulnerabilidades. A randomização é ativada e desativada usando os atributos randomize_layout e no_randomize_layout e requer a configuração de uma semente usando o sinalizador "-frandomize-layout-seed" ou "-frandomize-layout-seed-file".
  • Adicionado o sinalizador "-fstrict-flex-arrays=", com o qual você pode controlar os limites do elemento de array flexível em estruturas (Flexible Array Members, um array de tamanho indefinido no final da estrutura). Quando definido como 0 (padrão), o último elemento da estrutura com uma matriz é sempre processado como uma matriz flexível, 1 - apenas os tamanhos [], [0] e [1] são processados ​​como uma matriz flexível, 2 - apenas os tamanhos [] e [0] são processados ​​como uma matriz flexível.
  • Adicionado suporte experimental para a linguagem HLSL (High-Level Shader Language), semelhante a C, usada no DirectX para escrever shaders.
  • Adicionado "-Warray-parameter" para alertar sobre a substituição de funções com declarações de argumentos incompatíveis associadas a matrizes de comprimento fixo e variável.
  • Compatibilidade aprimorada com MSVC. Adicionado suporte para "#pragma function" (instrui o compilador a gerar uma chamada de função em vez de expansão embutida) e "#pragma alloc_text" (define o nome da seção com o código de função) fornecido no MSVC. Adicionado suporte para sinalizadores /JMC e /JMC compatíveis com MSVC.
  • O trabalho continua para oferecer suporte aos futuros padrões C2X e C++23. Para a linguagem C, são implementados: o atributo noreturn, as palavras-chave false e true, o tipo _BitInt(N) para números inteiros de uma determinada profundidade de bits, macros *_WIDTH, o prefixo u8 para caracteres codificados em UTF-8.

    Para C++, são implementados: fusão de módulos, isolamento ABI de membros de função, inicialização dinâmica ordenada de variáveis ​​não locais em módulos, operadores de índice multidimensionais, auto(x), variáveis ​​não literais, goto e rótulos em funções declaradas como constexpr , sequências de escape delimitadas, denominadas caracteres de escape.

  • Os recursos associados ao suporte OpenCL e OpenMP foram expandidos. Adicionado suporte para a extensão OpenCL cl_khr_subgroup_rotate.
  • Para a arquitetura x86, foi adicionada proteção contra vulnerabilidades em processadores causadas pela execução especulativa de instruções após operações de avanço incondicional. O problema ocorre devido ao processamento preventivo de instruções imediatamente após a instrução de desvio na memória (SLS, Straight Line Speculation). Para habilitar a proteção, é proposta a opção “-mharden-sls=[none|all|return|indirect-jmp]”.
  • Para plataformas que suportam a extensão SSE2, foi adicionado o tipo _Float16, que é emulado usando o tipo float no caso de falta de suporte para instruções AVX512-FP16.
  • Adicionado sinalizador "-m[no-]rdpru" para controlar o uso da instrução RDPRU, compatível a partir dos processadores AMD Zen2.
  • Adicionado o sinalizador "-mfunction-return=thunk-extern" para proteção contra a vulnerabilidade RETBLEED, que funciona adicionando uma sequência de instruções que exclui o envolvimento do mecanismo de execução especulativa para ramificações indiretas.

Principais inovações no LLVM 15.0:

  • Adicionado suporte para CPU Cortex-M85, arquiteturas Armv9-A, Armv9.1-A e Armv9.2-A, extensões Armv8.1-M PACBTI-M.
  • Foi adicionado um backend experimental para DirectX que suporta o formato DXIL (DirectX Intermediate Language) usado para shaders DirectX. O backend é habilitado especificando o parâmetro “-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX” durante a montagem.
  • Libc++ continua a implementar novos recursos dos padrões C++20 e C++2b, incluindo a conclusão da implementação da biblioteca “format” e a versão experimental proposta da biblioteca “ranges”.
  • Back-ends aprimorados para arquiteturas x86, PowerPC e RISC-V.
  • Os recursos do vinculador LLD e do depurador LLDB foram aprimorados.

Fonte: opennet.ru

Adicionar um comentário