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