Lançamento do conjunto de compiladores LLVM 16.0

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

Adicionar um comentário