Após seis meses de desenvolvimento, foi apresentado o lançamento do projeto LLVM 16.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 16.0:
- O padrão C++/ObjC++ padrão é gnu++17 (anteriormente gnu++14), o que significa que os recursos do C++17 com extensões GNU são suportados por padrão. Para retornar ao comportamento anterior, você pode usar a opção "-std=gnu++14".
- Implementados recursos avançados relacionados ao padrão C++20:
- Funções-membro especiais condicionalmente triviais,
- capturando ligações estruturadas em funções lambda,
- Operador de igualdade dentro de expressões,
- Opção para omitir a palavra-chave typename em alguns contextos,
- Inicialização agregada válida entre parênteses (“Aggr(val1, val2)”).
- Os recursos definidos no futuro padrão C++2b foram implementados:
- É permitido colocar rótulos no final de expressões compostas,
- operador estático(),
- operador estático[],
- A compatibilidade com o tipo char8_t é garantida,
- O intervalo de caracteres permitido para uso em "\N{...}" foi expandido
- Adicionada a capacidade de usar variáveis declaradas como "static constexpr" em funções declaradas como constexpr.
- Os recursos definidos no futuro padrão C C2x foram implementados:
- Para desativar o aviso "-Wunused-label", o atributo "[[maybe_unused]]" pode ser aplicado aos rótulos
- É permitido colocar rótulos em qualquer lugar dentro de expressões compostas,
- Adicionados operadores typeof e typeof_unqual,
- Um novo tipo nullptr_t e uma constante nullptr para definir ponteiros nulos que podem ser convertidos em qualquer tipo de ponteiro e representar uma variante de NULL que não está vinculada aos tipos inteiro e void*.
- No modo C2x, é permitida a chamada da macro va_start com um número variável de argumentos (variadic).
- Nos modos de conformidade C99, C11 e C17, as opções padrão "-Wimplicit-function-declaration" e "-Wimplicit-int" agora produzem um erro em vez de um aviso.
- O uso indireto de "void *" (por exemplo, "void func(void *p) { *p; }") no modo C++ agora gera um erro, semelhante a ISO C++, GCC, ICC e MSVC.
- Especificar campos de bits como operandos de instrução (por exemplo, "__asm { mov eax, s.bf }") em blocos de montagem embutidos no estilo Microsoft agora gera um erro.
- Adicionados diagnósticos de presença de diferentes estruturas e uniões com os mesmos nomes em diferentes módulos.
- Os recursos associados ao suporte OpenCL e OpenMP foram expandidos. Diagnóstico aprimorado para modelos C++ usados em argumentos do kernel OpenCL. Suporte aprimorado a blocos de filas para AMDGPU. O atributo nounwind é adicionado implicitamente a todas as funções. Suporte aprimorado para funções integradas.
- Adicionada a capacidade de usar a variável de ambiente CLANG_CRASH_DIAGNOSTICS_DIR para definir o diretório no qual os dados de diagnóstico de falha são salvos.
- O suporte Unicode foi atualizado para a especificação Unicode 15.0. Alguns símbolos matemáticos são permitidos em identificadores, como "₊" (por exemplo, "duplo xₖ₊₁").
- Adicionado suporte para carregar vários arquivos de configuração (os arquivos de configuração padrão são carregados primeiro e depois aqueles especificados por meio do sinalizador “--config=”, que agora pode ser especificado várias vezes). A ordem padrão de carregamento dos arquivos de configuração foi alterada: clang primeiro tenta carregar o arquivo -.cfg, e se não for encontrado, tenta carregar dois arquivos .cfg e .cfg. Para desabilitar o carregamento de arquivos de configuração por padrão, o sinalizador “--no-default-config” foi adicionado.
- Para garantir compilações repetíveis, é possível substituir os valores atuais de data e hora nas macros __DATE__, __TIME__ e __TIMESTAMP__ pela hora especificada na variável de ambiente SOURCE_DATE_EPOCH.
- Para verificar a presença de funções embutidas (builtin) que podem ser utilizadas no contexto de constantes, foi adicionada a macro “__has_constexpr_builtin”.
- Adicionado novo sinalizador de compilação "-fcoro-aligned-allocation" para alocação de quadro de corrotina alinhada.
- O sinalizador “-fstrict-flex-arrays=” implementa suporte para o terceiro nível de verificação de elementos flexíveis de array em estruturas (Flexible Array Members, um array de tamanho indefinido no final da estrutura). No terceiro nível, apenas o tamanho "[]" (por exemplo, "int b[]") é tratado como uma matriz flexível, mas o tamanho "[0]" (por exemplo, "int b[0]") não é.
- Adicionado sinalizador "-fmodule-output" para habilitar o modelo de compilação monofásico para módulos C++ padrão.
- Adicionado modo "-Rpass-análise=stack-frame-layout" para ajudar a diagnosticar problemas com o layout do stack frame.
- Adicionado um novo atributo __attribute__((target_version("cpu_features"))) e estendida a funcionalidade do atributo __attribute__((target_clones("cpu_features1","cpu_features2",...))) para selecionar versões específicas de recursos fornecidos pelo AArch64 CPUs.
- Ferramentas de diagnóstico expandidas:
- Adicionado aviso "-Wsingle-bit-bitfield-constant-conversion" para detectar truncamento implícito ao atribuir um a um campo de bits assinado de bit único.
- O diagnóstico de variáveis constexpr não inicializadas foi expandido.
- Adicionados avisos "-Wcast-function-type-strict" e "-Wincompatível-function-pointer-types-strict" para identificar possíveis problemas com a conversão do tipo de função.
- Adicionados diagnósticos para uso de nomes de módulos incorretos ou reservados em blocos de exportação.
- Detecção aprimorada de palavras-chave "automáticas" ausentes nas definições.
- A implementação do aviso "-Winteger-overflow" adicionou verificações para situações adicionais que levam a estouros.
- Implementado suporte para a arquitetura do conjunto de instruções LoongArch (-march=loongarch64 ou -march=la464), usada nos processadores Loongson 3 5000 e implementando o novo RISC ISA, semelhante ao MIPS e RISC-V.
Principais inovações no LLVM 16.0:
- O código LLVM pode usar elementos definidos no padrão C++17.
- Os requisitos ambientais para a construção do LLVM foram aumentados. As ferramentas de construção agora devem suportar o padrão C++17, ou seja, Para construir, você precisa de pelo menos GCC 7.1, Clang 5.0, Apple Clang 10.0 ou Visual Studio 2019 16.7.
- O backend para a arquitetura AArch64 adiciona suporte para CPUs Cortex-A715, Cortex-X3 e Neoverse V2, assembler para RME MEC (Memory Encryption Contexts), extensões Armv8.3 (Complex Number) e Function Multi Versioning.
- No backend da arquitetura ARM, foi descontinuado o suporte às plataformas alvo Armv2, Armv2A, Armv3 e Armv3M, para as quais não era garantida a geração de código correto. Adicionada a capacidade de gerar código para instruções sobre como trabalhar com números complexos.
- O backend para a arquitetura X86 adicionou suporte para arquiteturas de conjunto de instruções (ISAs) AMX-FP16, CMPCCXADD, AVX-IFMA, AVX-VNNI-INT8, AVX-NE-CONVERT. Adicionado suporte para instruções RDMSRLIST, RMSRLIST e WRMSRNS. Opções implementadas "-mcpu=raptorlake", "-mcpu=meteorlake", "-mcpu=emeraldrapids", "-mcpu=sierraforest", "-mcpu=graniterapids" e "-mcpu=grandridge".
- Adicionado suporte oficial para a plataforma LoongArch.
- Back-ends aprimorados para arquiteturas MIPS, PowerPC e RISC-V
- Adicionado suporte para depuração de executáveis de 64 bits para a arquitetura LoongArch ao depurador LLDB. Manipulação aprimorada de símbolos de depuração COFF. Fornece filtragem de DLLs duplicadas na lista de módulos carregados do Windows.
- Na biblioteca Libc++, o trabalho principal centrou-se na implementação do suporte a novas funcionalidades dos padrões C++20 e C++23.
- O vinculador LDD reduz significativamente o tempo de vinculação ao paralelizar a varredura de relocação de endereço e as operações de inicialização de seção. Adicionado suporte para compactação de seção usando o algoritmo ZSTD.
Fonte: opennet.ru