Lançamento do conjunto de compiladores LLVM 9.0

Após seis meses de desenvolvimento apresentado liberação do projeto LLVM 9.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.

Novos recursos do LLVM 9.0 incluem a remoção da tag de design experimental da plataforma RISC-V alvo, suporte C++ para OpenCL, a capacidade de dividir um programa em partes carregadas dinamicamente em LLD e a implementação do “asm vai para", usado no código do kernel Linux. libc++ adicionou suporte para WASI (WebAssembly System Interface) e LLD adicionou suporte inicial para vinculação dinâmica WebAssembly.

Melhorias no Clang 9.0:

  • Adicionado por implementação da expressão específica do GCC "asm vai para“, que permite passar de um bloco embutido em assembler para um rótulo em código C. Este recurso é necessário para construir o kernel Linux no modo “CONFIG_JUMP_LABEL=y” usando Clang em sistemas com arquitetura x86_64. Levando em consideração as mudanças adicionadas nas versões anteriores, o kernel Linux agora pode ser construído em Clang para a arquitetura x86_64 (anteriormente apenas era suportada a construção para as arquiteturas arm, aarch64, ppc32, ppc64le e mips). Além disso, os projetos Android e ChromeOS já foram convertidos para usar o Clang para construção de kernel, e o Google está testando o Clang como a principal plataforma para construção de kernels para seus sistemas Linux de produção. No futuro, outros componentes LLVM poderão ser usados ​​no processo de construção do kernel, incluindo LLD, llvm-objcopy, llvm-ar, llvm-nm e llvm-objdump;
  • Adicionado suporte experimental para usar C++17 em OpenCL. Recursos específicos incluem suporte para atributos de espaço de endereço, bloqueio de conversão de espaço de endereço por operadores de conversão de tipo, fornecimento de tipos de vetores como em OpenCL para C, presença de tipos específicos de OpenCL para imagens, eventos, canais, etc.
  • Adicionados novos sinalizadores de compilador “-ftime-trace” e “-ftime-trace-granularity=N” para gerar um relatório sobre o tempo de execução de vários estágios do frontend (análise, inicialização) e backend (estágios de otimização). O relatório é salvo em formato json, compatível com chrome://tracing e speedscope.app;
  • Adicionado processamento do especificador “__declspec(allocator)” e geração de informações de depuração que permitem monitorar o consumo de memória no ambiente do Visual Studio;
  • Para a linguagem C, foi adicionado suporte para a macro “__FILE_NAME__”, que se assemelha à macro “__FILE__”, mas inclui apenas o nome do arquivo sem o caminho completo;
  • C++ expandiu o suporte para atributos de espaço de endereço para cobrir vários recursos do C++, incluindo padrões de parâmetros e argumentos, tipos de referência, inferência de tipo de retorno, objetos, funções geradas automaticamente, operadores integrados e muito mais.
  • Os recursos associados ao suporte para OpenCL, OpenMP e CUDA foram expandidos. Isso inclui suporte inicial para inclusão implícita de funções OpenCL integradas (o sinalizador “-fdeclare-opencl-builtins” foi adicionado), a extensão cl_arm_integer_dot_product foi implementada e as ferramentas de diagnóstico foram expandidas;
  • O trabalho do analisador estático foi melhorado e foi adicionada documentação sobre como realizar análises estáticas. Adicionados sinalizadores para exibir módulos de verificação disponíveis e opções suportadas (“-analyzer-checker[-option]-help”, “-analyzer-checker[-option]-help-alpha” e “-analyzer-checker[-option]-help " -desenvolvedor"). Adicionado sinalizador "-analyzer-werror" para tratar avisos como erros.
    Adicionados novos modos de verificação:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling para identificar práticas inseguras para trabalhar com buffers;
    • osx.MIGChecker para procurar violações de regras de chamada MIG (Mach Interface Generator);
    • optin.osx.OSObjectCStyleCast para encontrar conversões incorretas de objetos XNU libkern;
    • apiModeling.llvm com um conjunto de funções de verificação de modelagem para detectar erros na base de código LLVM;
    • Código estabilizado para verificação de objetos C++ não inicializados (UninitializedObject no pacote optin.cplusplus);
  • O utilitário clang-format adicionou suporte para formatação de código na linguagem C# e fornece suporte para o estilo de formatação de código usado pela Microsoft;
  • clang-cl, uma interface de linha de comando alternativa que fornece compatibilidade em nível de opção com o compilador cl.exe incluído no Visual Studio, adicionou heurística para tratar arquivos inexistentes como opções de linha de comando e exibir um aviso correspondente (por exemplo, ao executar "clang-cl /diagnostic:caret /c test.cc");
  • Uma grande parte de novas verificações foi adicionada ao linter clang-tidy, incluindo verificações específicas da API OpenMP;
  • expandido capacidades do servidor clangd (Clang Server), no qual o modo de construção de índice em segundo plano está habilitado por padrão, foi adicionado suporte para ações contextuais com código (recuperação de variáveis, expansão de definições automáticas e macro, conversão de strings com escape em strings sem escape), a capacidade de exibir avisos do Clang-tidy, diagnóstico expandido de erros em arquivos de cabeçalho e adição da capacidade de exibir informações sobre a hierarquia de tipos;

O principal inovações LLVM 9.0:

  • Um recurso de particionamento experimental foi adicionado ao vinculador LLD, que permite dividir um programa em várias partes, cada uma delas localizada em um arquivo ELF separado. Este recurso permite iniciar a parte principal do programa, que carregará outros componentes conforme necessário durante a operação (por exemplo, você pode separar o visualizador de PDF integrado em um arquivo separado, que será carregado somente quando o usuário abrir o PDF arquivo).

    Vinculador LLD trazido para um estado adequado para vincular o kernel Linux para arquiteturas arm32_7, arm64, ppc64le e x86_64.
    Novas opções "-" (saída para stdout), "-[no-]allow-shlib-undefined", "-undefined-glob", "-nmagic", "-omagic", "-dependent-library", " - z ifunc-noplt" e "-z tamanho de página comum". Para a arquitetura AArch64, foi adicionado suporte para instruções BTI (Branch Target Indicator) e PAC (Pointer Authentication Code). O suporte para plataformas MIPS, RISC-V e PowerPC foi significativamente melhorado. Adicionado suporte inicial para vinculação dinâmica para WebAssembly;

  • Em libc++ implementado funções ssize, std::is_constant_evaluated, std::midpoint e std::lerp, métodos “front” e “back” foram adicionados a std::span, atributos dos tipos std::is_unbounded_array e std::is_bounded_array foram adicionados , os recursos padrão foram expandidos: :atomic. O suporte para GCC 4.9 foi descontinuado (pode ser usado com GCC 5.1 e versões mais recentes). Suporte adicionado WASI (WebAssembly System Interface, uma interface para usar WebAssembly fora do navegador);
  • Novas otimizações foram adicionadas. Conversão habilitada de chamadas memcmp para bcmp em algumas situações. Implementada omissão de verificação de intervalo para tabelas de salto nas quais os blocos de switch inferiores estão inacessíveis ou quando instruções não são utilizadas, por exemplo, ao chamar funções do tipo void;
  • O backend da arquitetura RISC-V foi estabilizado, que não está mais posicionado como experimental e é construído por padrão. Fornece suporte completo à geração de código para variantes de conjunto de instruções RV32I e RV64I com extensões MAFDC;
  • Inúmeras melhorias foram feitas nos back-ends das arquiteturas X86, AArch64, ARM, SystemZ, MIPS, AMDGPU e PowerPC. Por exemplo, para arquitetura
    AArch64 adicionou suporte para instruções SVE2 (Scalable Vector Extension 2) e MTE (Memory Tagging Extensions); no backend ARM, foi adicionado suporte para a arquitetura Armv8.1-M e a extensão MVE (M-Profile Vector Extension). O suporte para a arquitetura GFX10 (Navi) foi adicionado ao backend AMDGPU, os recursos de chamada de função são habilitados por padrão e uma passagem combinada é ativada DPP (Primitivos Paralelos de Dados).

  • O depurador LLDB agora possui realce de cores para backtraces e suporte adicionado para os blocos DWARF4 debug_types e DWARF5 debug_info;
  • O suporte para objetos e arquivos executáveis ​​no formato COFF foi adicionado aos utilitários llvm-objcopy e llvm-strip.

Fonte: opennet.ru

Adicionar um comentário