Lançamento do conjunto de compiladores LLVM 12.0

Após seis meses de desenvolvimento, foi apresentado o lançamento do projeto LLVM 12.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.

Melhorias no Clang 12.0:

  • O suporte para os atributos “prováveis” e “improváveis” propostos no padrão C++20 foi implementado e habilitado por padrão, permitindo que o otimizador seja informado sobre a probabilidade da construção condicional ser acionada (por exemplo, “[[provável ]] if (aleatório > 0) {“).
  • Adicionado suporte para processadores AMD Zen 3 (-march=znver3), Intel Alder Lake (-march=alderlake) e Intel Sapphire Rapids (-march=sapphirerapids).
  • Adicionado suporte para sinalizadores "-march=x86-64-v[234]" para selecionar níveis de arquitetura x86-64 (v2 - abrange extensões SSE4.2, SSSE3, POPCNT e CMPXCHG16B; v3 - AVX2 e MOVBE; v4 - AVX-512 ).
  • Adicionado suporte para processadores Arm Cortex-A78C (cortex-a78c), Arm Cortex-R82 (cortex-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) e Fujitsu A64FX (a64fx). Por exemplo, para habilitar otimizações para CPUs Neoverse-V1, você pode especificar “-mcpu=neoverse-v1”.
  • Para a arquitetura AArch64, novos sinalizadores de compilador "-moutline-atomics" e "-mno-outline-atomics" foram adicionados para ativar ou desativar funções auxiliares de operação atômica, como "__aarch64_cas8_relax". Essas funções detectam em tempo de execução se o suporte LSE (Large System Extensions) está disponível e usam as instruções do processador atômico fornecidas ou recorrem ao uso de instruções LL/SC (Load-link/store-conditional) para sincronização.
  • Adicionada a opção "-fbinutils-version" para selecionar a versão de destino do conjunto binutils para compatibilidade com comportamento de vinculador e montador mais antigo.
  • Para arquivos executáveis ​​ELF, quando o sinalizador "-gz" é especificado, a compactação de informações de depuração usando a biblioteca zlib é habilitada por padrão (gz=zlib). Vincular os arquivos de objeto resultantes requer lld ou GNU binutils 2.26+. Para restaurar a compatibilidade com versões mais antigas do binutils, você pode especificar "-gz=zlib-gnu".
  • O ponteiro 'este' agora é processado com verificações não nulas e desreferenciadas(N). Para remover o atributo não nulo quando precisar usar valores NULL, você pode usar a opção "-fdelete-null-pointer-checks".
  • Na plataforma Linux, o modo "-fasynchronous-unwind-tables" está habilitado para as arquiteturas AArch64 e PowerPC para gerar tabelas de chamadas de desenrolamento, como no GCC.
  • Em "#pragma clang loop vectorize_width" foi adicionada a capacidade de especificar as opções "fixo" (padrão) e "escalável" para selecionar o método de vetorização. O modo "escalável", independente do comprimento do vetor, é experimental e pode ser usado em hardware que suporte vetorização escalável.
  • Suporte aprimorado para a plataforma Windows: Foram preparados assemblies binários oficiais para Windows em sistemas Arm64, incluindo o compilador Clang, o vinculador LLD e as bibliotecas de tempo de execução do compilador-rt. Ao construir para plataformas de destino MinGW, o sufixo .exe é adicionado, mesmo durante a compilação cruzada.
  • Os recursos associados ao suporte para OpenCL, OpenMP e CUDA foram expandidos. Adicionadas opções "-cl-std=CL3.0" e "-cl-std=CL1.0" para selecionar opções de macro para OpenCL 3.0 e OpenCL 1.0. As ferramentas de diagnóstico foram expandidas.
  • Adicionado suporte para instruções HRESET, UINTR e AVXVNNI implementadas em alguns processadores baseados em x86.
  • Em sistemas x86, o suporte para a opção "-mtune=" está habilitado ", que ativa as otimizações microarquiteturais selecionadas, independente do valor de "-march= "
  • O analisador estático melhorou o processamento de algumas funções POSIX e melhorou significativamente a determinação do resultado de operações condicionais quando há vários valores simbólicos na comparação. Novas verificações foram adicionadas: fuchia.HandleChecker (define identificadores em estruturas), webkit.UncountedLambdaCapturesChecker webkit e alpha.webkit.UncountedLocalVarsChecker (leva em consideração as peculiaridades de trabalhar com ponteiros no código do motor WebKit).
  • Em expressões usadas no contexto de constantes, é permitido o uso de funções integradas __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __bit_scan_reverse, __bsrd, __bsrq, __bswap, __bswapd, __bswap64. __ bswapq , _castf*, __rol* e __ror*.
  • Adicionada uma opção BitFieldColonSpacing ao utilitário clang-format para selecionar o espaçamento em torno de identificadores, colunas e definições de campo.
  • O servidor de cache clangd (Clang Server) na plataforma Linux reduziu significativamente o consumo de memória durante a operação de longo prazo (chamadas periódicas para malloc_trim são fornecidas para retornar páginas de memória livre ao sistema operacional).

Principais inovações no LLVM 12.0:

  • O suporte para a ferramenta de compilação llvm-build escrita em Python foi descontinuado e, em vez disso, o projeto passou completamente a usar o sistema de compilação CMake.
  • No backend da arquitetura AArch64, o suporte para a plataforma Windows foi melhorado: a geração correta de saída assembler para sistemas Windows alvo foi garantida, a geração de dados em chamadas de desenrolamento foi otimizada (o tamanho desses dados foi reduzido em 60 %%), a capacidade de criar dados de desenrolamento usando assembler foi adicionada às diretivas .seh_*.
  • O backend para a arquitetura PowerPC apresenta novas otimizações para loops e implantação em linha, suporte expandido para processadores Power10, suporte adicional para instruções MMA para manipulação de matriz e suporte aprimorado para o sistema operacional AIX.
  • O backend x86 adiciona suporte para processadores AMD Zen 3, Intel Alder Lake e Intel Sapphire Rapids, bem como instruções de processador HRESET, UINTR e AVXVNNI. Suporte para MPX (Memory Protection Extensions) para verificação de ponteiros para garantir que os limites de memória não sejam mais suportados (esta tecnologia não é difundida e já foi removida do GCC e do clang). Adicionado suporte ao assembler para os prefixos {disp32} e {disp8} e os sufixos .d32 e .d8 para controlar o tamanho dos deslocamentos e saltos de operandos. Adicionado um novo atributo "tune-cpu" para controlar a inclusão de otimizações microarquiteturais.
  • Um novo modo “-fsanitize=unsigned-shift-base” foi adicionado ao detector de problemas de inteiros (integer sanitizer, “-fsanitize=integer”) para detectar overflows de inteiros não assinados após um deslocamento de bit para a esquerda.
  • Em vários detectores (asan, cfi, lsan, msan, tsan, ubsan sanitizer) foi adicionado suporte para distribuições Linux com a biblioteca padrão Musl.
  • As capacidades do vinculador LLD foram expandidas. Suporte aprimorado para o formato ELF, incluindo as opções adicionadas “--dependency-file”, “-error-handling-script”, “-lto-pseudo-probe-for-profiling”, “-no-lto-whole-program -visibilidade” " Suporte aprimorado ao MinGW. Para o formato Mach-O (macOS), foi implementado suporte para arquiteturas arm64, arm e i386, otimizações de tempo de link (LTO) e desenrolamento de pilha para tratamento de exceções.
  • Libc++ implementa novos recursos do padrão C++20 e iniciou o desenvolvimento de recursos da especificação C++2b. Adicionado suporte para construção com desabilitação de suporte de localização (“-DLIBCXX_ENABLE_LOCALIZATION=OFF”) e dispositivos para geração de números pseudo-aleatórios (“-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF”).

Fonte: opennet.ru

Adicionar um comentário