Lançamento do conjunto de compiladores LLVM 11.0

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.

Melhorias no Clang 11.0:

  • 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".
  • Adicionados novos sinalizadores de compilador:
    • "-fstack-clash-protection" - ativa a proteção contra interseções de pilha e pilha.
    • "-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 principal inovações LLVM 11.0:

  • 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.

Fonte: opennet.ru

Adicionar um comentário