Lançamento do conjunto de compiladores LLVM 13.0

Após seis meses de desenvolvimento, foi apresentado o lançamento do projeto LLVM 13.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.

Melhorias no Clang 13.0:

  • Implementado suporte para chamadas finais garantidas (chamar uma sub-rotina no final de uma função, formando uma recursão final se a sub-rotina chamar a si mesma). O suporte para chamadas finais garantidas é fornecido pelo atributo "[[clang::musttail]]" em C++ e "__attribute__((musttail))" em C, usado em uma instrução "return". O recurso permite implementar otimizações implantando código em uma iteração simples para economizar o consumo de pilha.
  • Declarações "using" e extensões clang fornecem suporte para definir atributos de estilo C++ 11 usando o formato "[[]]".
  • Adicionado sinalizador "-Wreserved-identifier" para exibir um aviso quando identificadores reservados são especificados no código do usuário.
  • Adicionados sinalizadores "-Wunused-but-set-parameter" e "-Wunused-but-set-variable" para exibir um aviso se um parâmetro ou variável for definido, mas não usado.
  • Adicionado sinalizador "-Wnull-pointer-subtraction" para emitir um aviso se o código puder introduzir um comportamento indefinido devido ao uso de um ponteiro nulo em operações de subtração.
  • Adicionado o sinalizador "-fstack-usage" para gerar para cada arquivo de código um arquivo ".su" adicional contendo informações sobre o tamanho dos quadros de pilha para cada função definida no arquivo que está sendo processado.
  • Um novo tipo de saída foi adicionado ao analisador estático - “sarif-html”, que leva à geração de relatórios simultaneamente nos formatos HTML e Sarif. Adicionada nova verificação allocClassWithName. Ao especificar a opção “-analyzer-display-progress”, é exibido o tempo de análise de cada função. O analisador de ponteiro inteligente (alpha.cplusplus.SmartPtr) está quase pronto.
  • Os recursos associados ao suporte OpenCL foram expandidos. Adicionado suporte para novas extensões cl_khr_integer_dot_product, cl_khr_extended_bit_ops, __cl_clang_bitfields e __cl_clang_non_portable_kernel_param_types. A implementação da especificação OpenCL 3.0 continuou. Para C, a especificação OpenCL 1.2 é usada por padrão, a menos que outra versão seja explicitamente selecionada. Para C++, foi adicionado suporte para arquivos com extensão “.clcpp”.
  • Foi implementado suporte para diretivas de transformação de loop (“#pragma omp unrol” e “#pragma omp tile”) definidas na especificação OpenMP 5.1.
  • Adicionadas opções ao utilitário clang-format: SpacesInLineCommentPrefix para definir o número de espaços antes dos comentários, IndentAccessModifiers, LambdaBodyIndentation e PPIndentWidth para controlar o alinhamento de entradas, expressões lambda e diretivas de pré-processador. As possibilidades de ordenação da enumeração de arquivos de cabeçalho (SortIncludes) foram ampliadas. Adicionado suporte para formatação de arquivos JSON.
  • Uma grande parte de novas verificações foi adicionada ao linter clang-tidy.

Principais inovações no LLVM 13.0:

  • Adicionada a opção “-ehcontguard” para usar a tecnologia CET (Windows Control-flow Enforcement Technology) para proteger contra a execução de explorações construídas usando técnicas de Programação Orientada a Retorno (ROP) no estágio de tratamento de exceções.
  • O projeto debuginfo-test foi renomeado como cross-project-tests e foi projetado para testar componentes de diferentes projetos, não se limitando a informações de depuração.
  • O sistema assembly fornece suporte para construção de diversas distribuições, por exemplo, uma com utilitários e outra com bibliotecas para desenvolvedores.
  • No backend da arquitetura AArch64, o suporte para as extensões Armv9-A RME (Realm Management Extension) e SME (Scalable Matrix Extension) é implementado no assembler.
  • O suporte para ISA V68/HVX foi adicionado ao backend da arquitetura Hexagon.
  • O backend x86 melhorou o suporte para processadores AMD Zen 3.
  • Adicionado suporte para APU GFX1013 RDNA2 ao backend AMDGPU.
  • Libc++ continua a implementar novos recursos dos padrões C++20 e C++2b, incluindo a conclusão da biblioteca de “conceitos”. Adicionado suporte para std::filesystem para a plataforma Windows baseada em MinGW. Arquivos de cabeçalho separados , E . Adicionada opção de construção LIBCXX_ENABLE_INCOMPLETE_FEATURES para desabilitar arquivos de cabeçalho com funcionalidade não totalmente implementada.
  • Os recursos do vinculador LLD foram expandidos, nos quais o suporte para processadores Big-endian Aarch64 é implementado, e o backend Mach-O foi levado a um estado que permite vincular programas regulares. Melhorias incluídas necessárias para vincular Glibc usando LLD.
  • O utilitário llvm-mca (Machine Code Analyzer) adicionou suporte para processadores que executam instruções em ordem (pipeline superescalar em ordem), como o ARM Cortex-A55.
  • O depurador LLDB para a plataforma AArch64 fornece suporte completo para autenticação de ponteiro, MTE (MemTag, Memory Tagging Extension) e registros SVE. Adicionados comandos que permitem vincular tags a cada operação de alocação de memória e organizar uma verificação do ponteiro ao acessar a memória, que deve estar associada à tag correta.
  • O depurador LLDB e o frontend para a linguagem Fortran - Flang foram adicionados aos assemblies binários gerados pelo projeto.

Fonte: opennet.ru

Adicionar um comentário