Após seis meses de desenvolvimento apresentado liberação do projeto LLVM 11.0 — Ferramentas compatíveis com GCC (compiladores, otimizadores e geradores de código), compilando programas em bitcode intermediário de instruções virtuais do tipo RISC (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.
A principal mudança na nova versão foi a inclusão de Flange, frontend para a linguagem Fortran. Flang suporta Fortran 2018, OpenMP 4.5 e OpenACC 3.0, mas o desenvolvimento do projeto ainda não foi concluído e o front-end está limitado à análise de código e verificação de exatidão. A geração de código intermediário LLVM ainda não é suportada e para gerar arquivos executáveis, o código canônico é gerado e passado para um compilador Fortran externo.
Adicionada a capacidade de restaurar a árvore de sintaxe abstrata (AST) para código C++ corrompido, que pode ser usado para ajudar a diagnosticar erros e fornecer informações adicionais para utilitários externos, como clang-tidy e clangd. O recurso é habilitado por padrão para código C++ e é controlado pelas opções "-Xclang -f[no-]recovery-ast".
Adicionados novos modos de diagnóstico:
“-Wpointer-to-int-cast” é um grupo de avisos sobre a conversão de ponteiros para um tipo inteiro int que não acomoda todos os valores possíveis.
“-Wuninitialized-const-reference” - aviso sobre a passagem de variáveis não inicializadas em parâmetros de função que aceitam argumentos de referência com o atributo “const”.
"-Wimplicit-const-int-float-conversion" - habilitado por padrão avisando sobre a conversão implícita de uma constante real em um tipo inteiro.
Para a plataforma ARM, são fornecidas funções C incorporadas ao compilador (Intrínsecos), substituídas por instruções vetoriais eficientes Arm v8.1-M MVE e CDE. As funções disponíveis são definidas nos arquivos de cabeçalho arm_mve.h e arm_cde.h.
Adicionado um conjunto de tipos inteiros estendidos _ExtInt(N), permitindo criar tipos que não são múltiplos de potências de dois, que podem ser processados com eficiência em FPGA/HLS. Por exemplo, _ExtInt(7) define um tipo inteiro que consiste em 7 bits.
Adicionadas macros que definem suporte para funções C integradas com base em instruções ARM SVE (Scalable Vector Extension):
__ARM_FEATURE_SVE, __ARM_FEATURE_SVE_BF16,
__ARM_FEATURE_SVE_MATMUL_FP32, __ARM_FEATURE_SVE_MATMUL_FP64,
__ARM_FEATURE_SVE_MATMUL_INT8,
__ARM_FEATURE_SVE2, __ARM_FEATURE_SVE2_AES,
__ARM_FEATURE_SVE2_BITPERM,
__ARM_FEATURE_SVE2_SHA3,
__ARM_FEATURE_SVE2_SM4. Por exemplo, a macro __ARM_FEATURE_SVE é definida ao gerar o código AArch64 definindo a opção de linha de comando "-march=armv8-a+sve".
O sinalizador "-O" agora é identificado com o modo de otimização "-O1" em vez de "-O2".
"-ffp-exception-behavior={ignore,maytrap,strict}" - permite selecionar o modo de tratamento de exceção para números de ponto flutuante.
"-ffp-model={precise,strict,fast}" - Simplifica o acesso a uma série de opções especializadas para números de ponto flutuante.
"-fpch-codegen" e "-fpch-debuginfo" para gerar um cabeçalho pré-compilado (PCH) com arquivos de objeto separados para código e informações de depuração.
“-fsanitize-coverage-allowlist” e “-fsanitize-coverage-blocklist” para verificar a cobertura dos testes de listas brancas e negras.
“-mtls-size={12,24,32,48}” para selecionar o tamanho do TLS (armazenamento local de thread).
"-menable-experimental-extension" para habilitar extensões RISC-V experimentais.
Por padrão, C usa o modo "-fno-common", que permite acesso mais eficiente a variáveis globais em algumas plataformas.
O cache do módulo padrão foi movido de /tmp para o diretório ~/.cache. Para substituir, você pode usar o sinalizador “-fmodules-cache-path=”.
O padrão da linguagem C padrão foi atualizado de gnu11 para gnu17.
Adicionado suporte preliminar para extensão GNU C "conjunto embutido» para adicionar inserções de montagem. A extensão ainda está em análise, mas não foi processada de forma alguma.
Os recursos associados ao suporte OpenCL e CUDA foram expandidos. Adicionado suporte para diagnóstico de bloco OpenCL 2.0 e novos recursos do OpenMP 5.0 implementados.
Adicionada a opção IndentExternBlock ao utilitário clang-format para alinhamento dentro de blocos externos "C" e externos "C++".
O analisador estático melhorou o tratamento de construtores herdados em C++. Adicionadas novas verificações alpha.core.C11Lock e alpha.fuchsia.Lock para verificar bloqueios, alpha.security.cert.pos.34c para detectar uso inseguro de putenv, webkit.NoUncountedMemberChecker e webkit.RefCntblBaseVirtualDtor para detectar problemas com tipos incontáveis, alfa .cplusplus .SmartPtr para verificar a desreferência do ponteiro inteligente nulo.
Em linter clang-arrumado adicionado uma grande parte de novos cheques.
O servidor de cache clangd (Clang Server) melhorou o desempenho e adicionou novos recursos de diagnóstico.
O sistema de compilação passou a usar Python 3. Se o Python 3 não estiver disponível, é possível reverter para o uso do Python 2.
O front end com o compilador para a linguagem Go (llgo) está excluído do lançamento, que poderá ser reestruturado futuramente.
O atributo vector-function-abi-variant foi adicionado à representação intermediária (IR) para descrever o mapeamento entre funções escalares e vetoriais para vetorizar chamadas. Em llvm::VectorType existem dois tipos de vetor separados llvm::FixedVectorType e llvm::ScalableVectorType.
A ramificação baseada em valores udef e a passagem de valores undef para funções de biblioteca padrão são reconhecidas como comportamento indefinido. EM
memset/memcpy/memmove permite passar ponteiros undef, mas se o parâmetro com tamanho for zero.
LLJIT adicionou suporte para realizar inicializações estáticas por meio dos métodos LLJIT::initialize e LLJIT::deinitialize. A capacidade de adicionar bibliotecas estáticas ao JITDylib usando a classe StaticLibraryDefinitionGenerator foi implementada. Adicionada API C para ORCv2 (API para construção de compiladores JIT).
O suporte para processadores Cortex-A64, Cortex-A34, Cortex-A77 e Cortex-X78 foi adicionado ao backend da arquitetura AArch1. Implementadas extensões ARMv8.2-BF16 (BFloat16) e ARMv8.6-A, incluindo RMv8.6-ECV (Enhanced Counter Virtualization), ARMv8.6-FGT (Fine Grained Traps), ARMv8.6-AMU (Activity Monitors virtualization) e ARMv8.0-DGH (dica de coleta de dados). É fornecida a capacidade de gerar código para ligações de funções integradas para instruções de vetor SVE.
O suporte para processadores Cortex-M55, Cortex-A77, Cortex-A78 e Cortex-X1 foi adicionado ao backend da arquitetura ARM. Extensões implementadas
Multiplicação de matriz Armv8.6-A e RMv8.2-AA32BF16 BFloat16.
O suporte para geração de código para processadores POWER10 foi adicionado ao backend da arquitetura PowerPC. As otimizações de loop foram expandidas e o suporte de ponto flutuante foi melhorado.
O backend da arquitetura RISC-V permite a aceitação de patches que suportam conjuntos experimentais de instruções estendidas que ainda não foram oficialmente aprovados.
O backend da arquitetura AVR foi transferido da categoria experimental para estável, incluída na distribuição básica.
O backend para arquitetura x86 suporta instruções Intel AMX e TSXLDTRK. Proteção adicional contra ataques LVI (Load Value Injection), e também implementa um mecanismo geral de supressão de efeito colateral de execução especulativa para bloquear ataques causados pela execução especulativa de operações na CPU.
No backend da arquitetura SystemZ, foi adicionado suporte para MemorySanitizer e LeakSanitizer.
Adicionado suporte para arquivo de cabeçalho com constantes matemáticas ao Libc++ .
expandido Capacidades do vinculador LLD. Suporte aprimorado para o formato ELF, incluindo as opções adicionadas "--lto-emit-asm", "--lto-whole-program-visibility", "-print-archive-stats", "-shuffle-sections", " -thinlto- módulo único", "-unique", "-rosegment", "-threads=N". Adicionada a opção "--time-trace" para salvar o rastreamento em um arquivo, que pode então ser analisado por meio da interface chrome://tracing no Chrome.