Lançamento do conjunto de compiladores LLVM 10.0

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

Os novos recursos do LLVM 10.0 incluem suporte para conceitos C++, não executa mais o Clang como um processo separado, suporte para verificações de CFG (control flow guard) para Windows e suporte para novos recursos de CPU.

Melhorias no Clang 10.0:

  • Adicionado suporte para "conceitos", uma extensão de modelo C++ que será incluída no próximo padrão, codinome C++2a (ativada pelo sinalizador -std=c++2a).
    Os conceitos permitem definir um conjunto de requisitos de parâmetros de modelo que, em tempo de compilação, limitam o conjunto de argumentos que podem ser aceitos como parâmetros de modelo. Os conceitos podem ser usados ​​para evitar inconsistências lógicas entre as propriedades dos tipos de dados usados ​​no modelo e as propriedades dos tipos de dados dos parâmetros de entrada.

    modelo
    conceito IgualdadeComparável = requer (T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Por padrão, o lançamento de um processo separado (“clang -cc1”) no qual a compilação é executada é interrompido. A compilação agora é feita no processo principal, e a opção "-fno-integrated-cc1" pode ser usada para restaurar o comportamento antigo.
  • Novos modos de diagnóstico:
    • "-Wc99-designator" e "-Wreorder-init-list" alertam contra o uso de inicializadores C99 no modo C++ nos casos em que eles estão corretos em C99, mas não em C++20.
    • "-Wsizeof-array-div" - captura situações como "int arr[10]; …sizeof(arr) / sizeof(short)…” (deve ser “sizeof(arr) / sizeof(int)”).
    • "-Wxor-used-as-po" - alerta contra o uso de construções como o uso do operador "^" (xor) em operações que podem ser confundidas com exponenciação (2^16).
    • "-Wfinal-dtor-non-final-class" - alerta sobre classes que não estão marcadas com o especificador "final", mas possuem um destruidor com o atributo "final".
    • "-Wtautological-bitwise-compare" é um grupo de avisos para diagnosticar comparações tautológicas entre uma operação bit a bit e uma constante e para identificar comparações sempre verdadeiras nas quais a operação OR bit a bit é aplicada a um número não negativo.
    • "-Wbitwise-conditional-parênteses" alerta sobre problemas ao misturar os operadores lógicos AND (&) e OR (|) com o operador condicional (?:).
    • “-Wmisleading-indentation” é um análogo da verificação de mesmo nome do GCC, que avisa sobre expressões recuadas como se fizessem parte de um bloco if/else/for/while, mas na verdade elas não estão incluídas neste bloco .
    • Ao especificar “-Wextra”, a verificação “-Wdeprecated-copy” é habilitada, alertando sobre o uso de construtores
      "mover" e "copiar" em classes com uma definição explícita de destruidor.

    • As verificações "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-análise" foram expandidas.
    • As verificações "-Wbitwise-op-parentheses" e "-Wlogical-op-parentheses" estão desabilitadas por padrão.
  • No código C e C++, as operações aritméticas com ponteiros são permitidas apenas em matrizes. O Sanitizer de comportamento indefinido no modo "-fsanitize=pointer-overflow" agora captura casos como adicionar um deslocamento diferente de zero a um ponteiro nulo ou criar um ponteiro nulo ao subtrair um número inteiro de um ponteiro não nulo.
  • O modo "-fsanitize=implicit-conversion" (Implicit Conversion Sanitizer) é adaptado para identificar problemas com operações de incremento e decremento para tipos com tamanho de bit menor que o do tipo "int".
  • Ao selecionar arquiteturas de destino x86 "-march=skylake-avx512", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" e "-march=cooperlake" por padrão no vetorizado o código parou de usar registradores zmm de 512 bits, exceto por sua indicação direta no código-fonte. A razão é que a frequência da CPU diminui ao realizar operações de 512 bits, o que pode afetar negativamente o desempenho geral. Para alterar o novo comportamento, é fornecida a opção "-mprefer-vector-width=512".
  • O comportamento do sinalizador "-flax-vector-conversions" é semelhante ao GCC: conversões implícitas de bits de vetor entre vetores inteiros e de ponto flutuante são proibidas. Para eliminar esta limitação, propõe-se usar o sinalizador
    "-flax-vector-conversions=all" que é o padrão.

  • Suporte aprimorado para CPUs MIPS da família Octeon. Adicionado "octeon+" à lista de tipos de CPU válidos.
  • Ao montar no código intermediário WebAssembly, o otimizador wasm-opt é chamado automaticamente, se disponível no sistema.
  • Para sistemas baseados na arquitetura RISC-V, é permitido o uso de registros que armazenam valores de ponto flutuante em blocos condicionais de inserções inline do assembler.
  • Adicionados novos sinalizadores de compilador: "-fgnuc-version" para definir o valor da versão para "__GNUC__" e macros semelhantes; "-fmacro-prefix-map=OLD=NEW" para substituir o prefixo do diretório OLD por NEW em macros como "__FILE__"; "-fpatchable-function-entry=N[,M]" para gerar um certo número de instruções NOP antes e depois do ponto de entrada da função. Para RISC-V
    adicionado suporte para os sinalizadores "-ffixed-xX", "-mcmodel=medany" e "-mcmodel=medlow".

  • Adicionado suporte para o atributo ‘__attribute__((target(“branch-protection=..."))), cujo efeito é semelhante ao da opção -proteção de ramificação.
  • Na plataforma Windows, ao especificar o flag “-cfguard”, é implementada a substituição das verificações de integridade do fluxo de execução (Control Flow Guard) por chamadas indiretas de funções. Para desabilitar a substituição de verificação, você pode usar o sinalizador “-cfguard-nochecks” ou o modificador “__declspec(guard(nocf))”.
  • O comportamento do atributo gnu_inline é semelhante ao GCC nos casos em que é usado sem a palavra-chave "extern".
  • Os recursos associados ao suporte OpenCL e CUDA foram expandidos. Adicionado suporte para novos recursos do OpenMP 5.0.
  • Uma opção Padrão foi adicionada ao utilitário clang-format, que permite determinar a versão do padrão C++ usado ao analisar e formatar código (Latest, Auto, c++03, c++11, c++14, c++17,c++20).
  • Novas verificações foram adicionadas ao analisador estático: alpha.cplusplus.PlacementNew para determinar se há espaço de armazenamento suficiente, fuchsia.HandleChecker para detectar vazamentos relacionados a manipuladores Fuchsia, security.insecureAPI.decodeValueOfObjCType para detectar possíveis estouros de buffer ao usar [NSCoder decodeValueOfObjCType :no:] .
  • O Undefined Behavior Sanitizer (UBSan) expandiu suas verificações de estouro de ponteiro para capturar a aplicação de deslocamentos diferentes de zero a ponteiros NULL ou a adição resultante de um deslocamento de ponteiro NULL.
  • Em linter clang-arrumado adicionado uma grande parte de novos cheques.

O principal inovações LLVM 10.0:

  • Para a estrutura Atribuidor Novas otimizações e analisadores interprocedimentos foram adicionados. O estado de 19 atributos diferentes é previsto, incluindo 12 atributos (12 LLVM IR) e 7 atributos abstratos, como vivacidade.
  • Adicionadas novas funções matemáticas de matriz incorporadas ao compilador (Intrínsecos), que são substituídas por instruções vetoriais eficientes durante a compilação.
  • Inúmeras melhorias foram feitas nos back-ends das arquiteturas X86, AArch64, ARM, SystemZ, MIPS, AMDGPU e PowerPC. Adicionado suporte de CPU
    Cortex-A65, Cortex-A65AE, Neoverse E1 e Neoverse N1. Para ARMv8.1-M, ​​​​o processo de geração de código foi otimizado (por exemplo, apareceu suporte para loops com sobrecarga mínima) e suporte para autovetorização foi adicionado usando a extensão MVE. Suporte aprimorado para CPU MIPS Octeon. Para PowerPC, a vetorização de sub-rotinas matemáticas usando a biblioteca MASSV (Mathematical Acceleration SubSystem) é habilitada, a geração de código é melhorada e o acesso à memória a partir de loops é otimizado. Para x86, o tratamento dos tipos de vetor v2i32, v4i16, v2i16, v8i8, v4i8 e v2i8 foi alterado.

  • Gerador de código aprimorado para WebAssembly. Adicionado suporte para instruções TLS (Thread-Local Storage) e atomic.fence. O suporte SIMD foi significativamente expandido. Os arquivos de objeto WebAssembly agora têm a capacidade de usar assinaturas de funções com vários valores.
  • O analisador é usado ao processar loops MemóriaSSA, que permite definir dependências entre diferentes operações de memória. MemorySSA pode reduzir o tempo de compilação e execução ou pode ser usado em vez de AliasSetTracker sem perda de desempenho.
  • O depurador LLDB melhorou significativamente o suporte para o formato DWARF v5. Suporte aprimorado para construção com MinGW
    e capacidade inicial adicionada para depurar executáveis ​​do Windows para arquiteturas ARM e ARM64. Adicionadas descrições das opções oferecidas ao preencher automaticamente a entrada pressionando tab.

  • expandido Capacidades do vinculador LLD. Suporte aprimorado para o formato ELF, incluindo garantia de compatibilidade total de modelos glob com o vinculador GNU, adição de suporte para seções de depuração compactadas ".zdebug", adição da propriedade PT_GNU_PROPERTY para definir a seção .note.gnu.property (pode ser usada no futuro núcleos Linux),
    Os modos “-z noseparate-code”, “-z Separate-Code” e “-z Separate-Loadable-segments” foram implementados. Suporte aprimorado para MinGW e WebAssembly.

Fonte: opennet.ru

Adicionar um comentário