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:
- Agora há suporte para chamadas de cauda garantidas (uma chamada a uma sub-rotina no final de uma função, criando uma recursão de cauda se a sub-rotina chamar a si mesma). Essas chamadas são suportadas pelo atributo "[[clang::musttail]]" em C++ e "__attribute__((musttail))" em C, usados na instrução "return". Esse recurso permite otimizações ao transformar o código em uma iteração plana para economizar espaço na pilha.
- As definições de atributos no estilo C++11 agora são suportadas em declarações e extensões "using" do clang, usando o formato "[[]]".
- Adicionada a opção "-Wreserved-identifier" para exibir um aviso ao especificar identificadores reservados no código do usuário.
- Adicionadas as opções "-Wunused-but-set-parameter" e "-Wunused-but-set-variable" para exibir um aviso caso um parâmetro ou variável esteja definido, mas não seja utilizado.
- Adicionada a flag "-Wnull-pointer-subtraction" para alertar caso o código possa causar comportamento indefinido devido ao uso de um ponteiro nulo em operações de subtração.
- Adicionada a opção "-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.
- O analisador estático agora possui um novo tipo de saída, "sarif-html", que gera relatórios nos formatos HTML e Sarif. Uma nova verificação, allocClassWithName, foi adicionada. A opção "-analyzer-display-progress" agora exibe o tempo de análise para cada função. O analisador de ponteiros inteligentes (alpha.cplusplus.SmartPtr) está quase concluído.
- O suporte ao OpenCL foi expandido. Foi adicionado suporte para as 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 foi continuada. Para C, o OpenCL 1.2 é usado por padrão, a menos que uma versão diferente seja explicitamente selecionada. Foi adicionado suporte para arquivos com a extensão ".clcpp" para C++.
- Foi implementado o suporte para diretivas de transformação de loop ("#pragma omp unrol" e "#pragma omp tile") definidas na especificação OpenMP 5.1.
- O utilitário clang-format foi atualizado com as seguintes opções: SpacesInLineCommentPrefix para especificar o número de espaços antes dos comentários, IndentAccessModifiers, LambdaBodyIndentation e PPIndentWidth para controlar o alinhamento de registros, expressões lambda e diretivas do pré-processador. Os recursos de classificação da lista de arquivos de cabeçalho (SortIncludes) foram expandidos. Foi adicionado suporte para formatação de arquivos JSON.
- Um grande número de novas verificações foi adicionado ao verificador de lintagem clang-tidy.
Principais inovações no LLVM 13.0:
- Adicionada a opção "-ehcontguard" para usar a tecnologia CET (Windows Tecnologia de aplicação de fluxo de controle) para proteção na fase de tratamento de exceções contra a execução de exploits construídos usando técnicas de programação orientada a retorno (ROP).
- O projeto debuginfo-test foi renomeado para cross-project-tests e foi desenvolvido para testar componentes de diferentes projetos, não se limitando apenas a informações de depuração.
- O sistema de compilação suporta a criação de múltiplas distribuições, por exemplo, uma com utilitários e outra com bibliotecas para desenvolvedores.
- O backend para a arquitetura AArch64 implementa suporte para as extensões Armv9-A RME (Realm Management Extension) e SME (Scalable Matrix Extension) em linguagem assembly.
- Foi adicionado suporte para ISA V68/HVX ao backend da arquitetura Hexagon.
- O backend x86 agora oferece suporte aprimorado para processadores AMD Zen 3.
- Adicionado suporte para a APU GFX1013 RDNA2 ao backend AMDGPU.
- A Libc++ continua a implementar novos recursos dos padrões C++20 e C++2b, incluindo a conclusão da biblioteca "conceitos". Para a plataforma Windows Adicionado suporte para std::filesystem baseado em MinGW. Os arquivos de cabeçalho foram separados. , E Adicionada a opção de compilação LIBCXX_ENABLE_INCOMPLETE_FEATURES para desativar arquivos de cabeçalho com funcionalidade incompleta.
- O linker LLD foi expandido para suportar processadores Aarch64 Big-endian, e o backend Mach-O foi aprimorado para permitir a vinculação de programas padrão. Melhorias necessárias para a vinculação da Glibc usando LLD foram incluídas.
- O utilitário llvm-mca (Analisador de Código de Máquina) foi atualizado para oferecer suporte a processadores que executam instruções em ordem (pipeline superescalar em ordem), como o ARM Cortex-A55.
- O depurador LLDB para a plataforma AArch64 agora oferece suporte completo à autenticação de ponteiros, ao mecanismo de extensão de marcação de memória (MemTag) e aos registradores SVE. Foram adicionados comandos para associar tags a cada operação de alocação de memória e para garantir que o ponteiro esteja associado à tag correta durante o acesso à memória.
- O depurador LLDB e a interface gráfica Fortran, Flang, foram adicionados aos assemblies binários gerados pelo projeto.
Fonte: opennet.ru
