Após seis meses de desenvolvimento, o LLVM 22.1.0 foi lançado. Ele desenvolve ferramentas (compiladores, otimizadores e geradores de código) que compilam programas em código 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 em código de máquina para uma determinada plataforma alvo ou usado por um compilador just-in-time (JIT) para gerar instruções de máquina diretamente durante a execução do programa. Baseado nas tecnologias LLVM, o projeto está desenvolvendo o compilador Clang, que suporta as linguagens de programação C, C++ e Objective-C. A partir da ramificação 18.x, o projeto adotou um novo esquema de numeração de versões, segundo o qual a versão 0 ("N.0") é usada durante o desenvolvimento, e a primeira versão estável é numerada como "N.1".
As melhorias no Clang 22 incluem:
- Adicionado suporte para tokens de alocação de memória (Allocation Tokens) para marcar operações de alocação de memória realizadas usando funções como `malloc` com um identificador único. Os tokens de alocação permitem estruturar informações de heap, simplificando a detecção de vazamentos de memória e possibilitando o agrupamento de objetos com base em sua finalidade ou padrões de modificação (por exemplo, separando dados "quentes" de dados "frios"). Para habilitar, use a flag `-fsanitize=alloc-token`.
- Funcionalidades relacionadas à linguagem C:
- Uma especificação preliminar definindo o mecanismo de execução adiada "defer" foi implementada, permitindo que as ações sejam executadas quando o escopo atual for encerrado. O parâmetro "-fdefer-ts" foi adicionado para habilitar o suporte a "defer".
- A função integrada __builtin_stack_address() foi adicionada, espelhando a função similar no GCC. Esta função retorna o endereço da pilha, separando a área da pilha da função atual que chamou __builtin_stack_address() das funções subsequentes que ela chama.
- Capacidades que estão sendo desenvolvidas para o futuro padrão C2y:
- Adicionado suporte para loops nomeados, que permite atribuir nomes a loops e instruções switch, os quais podem ser especificados em instruções break e continue para definir explicitamente o loop do qual sair. outer: for (int i = 0; i < IK; ++ i) { for (int j = 0; j < JK; ++ j) { continue; // ir para CONT1 continue outer; // ir para CONT2 // CONT1 } // CONT2 }
- A implementação da macro integrada "__COUNTER__", projetada para gerar nomes de identificadores únicos, foi expandida e incluída no padrão. Foi definido um limite de 2147483647 chamadas para essa macro; exceder esse limite gerará um erro.
- Aviso removido (-Wstatic-in-inline) ao usar funções ou variáveis estáticas dentro de funções declaradas como "extern inline".
- Capacidades definidas no padrão C23 C:
- O arquivo de cabeçalho float.h agora suporta as macros FLT_SNAN, DBL_SNAN e LDBL_SNAN, que implementam valores NaN sinalizados (que causam uma exceção quando usados em operações aritméticas) para os tipos float, double e long double.
- Corrigido um erro em que diferentes tipos sem nome eram tratados como compatíveis dentro da mesma unidade de tradução se possuíssem os mesmos campos.
- A opção "-MG", usada para ignorar arquivos de cabeçalho ausentes durante a verificação de dependências, foi estendida às diretivas "#embed" e agora suprime o erro "arquivo não encontrado" quando um arquivo especificado em uma diretiva "#embed" está ausente.
- Recursos relacionados ao C++:
- Foi adicionada a capacidade de usar vinculações estruturadas no contexto "constexpr", conforme desenvolvido na especificação C++2c (C++26). Isso significa que referências a expressões constantes agora podem ser elas mesmas expressões constantes. O suporte foi implementado para arrays e estruturas simples (tuplas ainda não são suportadas). constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
- Conforme exigido pelo padrão C++20, as restrições agora são convertidas para o formato padrão antes de serem verificadas, permitindo mensagens de diagnóstico mais precisas e o tratamento adequado de erros de substituição em argumentos de modelo usados apenas em identificadores de conceito.
- Adicionada uma família de funções internas "__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship" para descobrir se os operadores de comparação "<", ">", "<=", e ">=" foram sintetizados a partir do operador "<=>".
- O parâmetro "-Wincompatible-pointer-types" foi alterado para exibir um erro em vez de um aviso. Para reverter ao comportamento anterior, use a opção "-Wno-error=incompatible-pointer-types".
- Adicionadas as funções integradas __builtin_bswapg, __builtin_elementwise_ldexp, __builtin_elementwise_fshl, __builtin_elementwise_fshr, __builtin_elementwise_minnumnum, __builtin_elementwise_maxnumnum, __builtin_masked_load, __builtin_masked_expand_load, __builtin_masked_store, __builtin_masked_compress_store, __builtin_masked_gather, __builtin_masked_scatter e __builtin_dedup_pack. Por exemplo, a função builtin_dedup_pack permite remover duplicados de uma lista de tipos: usando MyTypeList = TypeList<__builtin_dedup_pack …>; // o tipo resultante será TypeList
- Ao depurar comportamentos indefinidos com o UBSan (-fsanitize=undefined -fsanitize-trap=undefined), as informações sobre a causa do erro agora são incluídas nas informações de depuração geradas. O parâmetro "-fsanitize-debug-trap-reasons" foi adicionado para especificar o nível de detalhamento das informações de erro. Ele pode ser definido como "basic" para descrições gerais (por exemplo, "Adição de inteiros estourou") e "detailed" para incluir informações detalhadas (por exemplo, "Estouro na adição de inteiros com sinal em 'a + b'").
- Adicionados novos sinalizadores de compilador:
- "-f[no-]sanitize-debug-trap-reasons" para controlar se os motivos da captura de exceção são incorporados às informações de depuração ao compilar com o modo "-fsanitize-trap".
- Para gerenciar tokens de alocação de memória, utilize os parâmetros "-fsanitize=alloc-token", "-falloc-token-max", "-fsanitize-alloc-token-fast-abi" e "-fsanitize-alloc-token-extended".
- O parâmetro "-fmatrix-memory-layout" controla o layout de memória dos tipos de matriz (por exemplo, column-major para matrizes em formato de coluna, row-major para matrizes em formato de linha).
- Agora, as funções possuem um atributo "malloc_span", semelhante ao atributo malloc, mas aplicável a funções que retornam estruturas do tipo span contendo um ponteiro e um campo com o tamanho ou um ponteiro para o final do bloco.
- Adicionado o atributo "modular_format" para selecionar dinamicamente a implementação estaticamente vinculada da função printf necessária no momento da vinculação.
- As ferramentas de diagnóstico e análise estática foram ampliadas e novas verificações foram adicionadas (várias dezenas de melhorias relacionadas ao diagnóstico).
- Intrínsecos adicionais para as extensões SSE, AVX e AVX512 foram adicionados ao backend x86. Modos de compilação foram adicionados para CPUs Intel baseadas nas microarquiteturas Wildcat Lake (-march=wildcatlake) e Nova Lake (-march=novalake).
- O backend AArch64 agora suporta os processadores Ampere Computing Ampere1C (ampere1c), Arm C1-Nano (c1-nano), Arm C1-Pro (c1-pro), Arm C1-Premium (c1-premium) e Arm C1-Ultra (c1-ultra). Funções integradas adicionais foram adicionadas para as instruções FCVTZ[US], FCVTN[US], FCVTM[US], FCVTP[US] e FCVTA[US]. O suporte a Multi-Versionamento de Funções (FMV) foi estabilizado. Os usuários agora podem sobrescrever a prioridade de diferentes versões de funções.
- Adicionado suporte para a arquitetura LoongArch32 (LA32R, LA32S).
- Backends aprimorados para arquiteturas ARM, AMDGPU, RISC-V, LoongArch64, MIPS, WebAssembly e PowerPC.
Fonte: opennet.ru
