E foi lançado o LLVM 16 com várias mudanças e melhorias. Confira todas as novidades dessa importante atualização.
LLVM é um compilador compatível com GCC (Compiladores, Otimizadores e Geradores de Código) que compila programas em um bitcode intermediário de instrução virtual do tipo RISC (uma máquina virtual de baixo nível com otimização multinível).
O pseudocódigo gerado pode ser convertido pelo compilador JIT em instruções de máquina no momento da execução do programa.
Agora, após pouco mais de seis meses de desenvolvimento, foi anunciado o lançamento da nova versão do projeto LLVM 16.0, versão na qual estão implementadas um grande número de alterações e melhorias.
Novidades do LLVM 16
No LLVM 16 podemos encontrar várias melhorias importantes no Clang 16.0, das quais se destaca o padrão padrão C++/ObjC++ que está estabelecido no gnu++17 (anteriormente gnu++14), o que implica suporte para funções de C++17 com extensões GNU por padrão. O uso de elementos definidos no padrão C++17 é permitido no código LLVM.
Outra mudança que se destaca é que o suporte para CPUs Cortex-A715, Cortex-X3 e Neoverse V2, extensões Armv8.3 e recursos de multiversão foram adicionados ao back-end AArch64.
O suporte para as plataformas Armv2, Armv2A, Armv3 e Armv3M foi descontinuado no back-end da arquitetura ARM, para o qual a geração correta de código não foi garantida.
Também foi adicionada a capacidade de gerar código para instruções para trabalhar com números complexos e suporte adicionado para AMX-FP16, CMPCXADD, AVX-IFMA, AVX-VNNI-INT8, AVX-NE-CONVERT arquiteturas de conjunto de instruções (ISA) para o backend X86.
Além disso, os requisitos para a construção do LLVM foram aumentados, e a compilação agora deve ser compatível com o padrão C++ 17, ou seja, a compilação requer pelo menos GCC 7.1, Clang 5.0, Apple Clang 10.0 ou Visual Studio 2019 16.7 .
Por outro lado, back-ends aprimorados para arquiteturas MIPS, PowerPC e RISC-V também são destacados, bem como suporte para depuração de executáveis de 64 bits para a arquitetura LoongArch para o depurador LLDB e manipulação aprimorada de símbolos de depuração COFF.
Das outras alterações destacam-se:
- Na biblioteca Libc++, o trabalho principal foi focado na implementação do suporte a novas funcionalidades dos padrões C++20 e C++23.
- O tempo de link foi significativamente reduzido no linker LDD ao paralelizar a varredura de realocação de endereço e as operações de inicialização de seção. Adicionado suporte para compressão de seção usando o algoritmo ZSTD.
- As funções avançadas implementadas com o padrão C++20 também são destacadas.
- capturar links estruturados em funções lambda.
- O operador de igualdade nas expressões.
- Capacidade de não especificar a palavra-chave typename em alguns contextos,
- Admissibilidade de inicialização adicionada entre parênteses (“Aggr(val1, val2)”).
- Funções implementadas definidas no futuro padrão C++ 2b.
- Suporte fornecido com o tipo char8_t,
- Ampliado o intervalo de caracteres permitido para uso em “\N{…}”,
- Adicionada a capacidade de usar variáveis declaradas como “static constexpr” em funções declaradas como constexpr.
- Funções implementadas definidas no futuro padrão C2x C:
- Adicionado suporte para carregar vários arquivos de configuração (os arquivos de configuração padrão são carregados primeiro, depois os especificados por meio do sinalizador “–config=”, que agora pode ser especificado várias vezes).
- Alterada a ordem de carregamento dos arquivos de configuração padrão: o clang primeiro tenta carregar o arquivo <triple>-<driver>.cfg e, se não o encontrar, tenta carregar dois <driver>.cfg e <triple>.cfg arquivos .
- Adicionado um novo sinalizador de compilação “-fcoro-aligned-allocation” para distribuição alinhada de quadro de rotina.
- Adicionado o sinalizador “-fmodule-output” para habilitar o modelo de construção de fase única de módulos C++ padrão.
- Adicionado o modo “-Rpass-analysis=stack-frame-layout” para diagnosticar problemas com o layout do quadro de pilha.
- Adicionado um novo atributo __attribute__((target_version(“cpu_features”))) e estendeu a funcionalidade do atributo __attribute__((target_clones(“cpu_features1″,”cpu_features2”,…))) para selecionar versões específicas de recursos fornecidos pela CPU AArch64 .
- Ferramentas de diagnóstico aprimoradas:
- Aviso adicionado “-Wsingle-bit-bitfield-constant-conversion” para detectar truncamento implícito ao atribuir um a um campo de bits com sinal de um bit.
- Diagnóstico estendido para variáveis constexpr não inicializadas.
- Adicionados avisos “-Wcast-function-type-strict” e “-Winfunctional-function-pointer-types-strict” para detectar possíveis problemas ao lançar tipos de função.
Para saber mais sobre essa versão do LLVM, acesse a nota de lançamento.
Como instalar ou atualizar o LLVM
Para instalar a versão mais recente do LLVM nas principais distribuições Linux, basta procurá-lo no gerenciador de pacotes de sua distribuição.