Lançamento do conjunto de compiladores GCC 10

Após um ano de desenvolvimento publicado lançamento de um conjunto gratuito de compiladores GCC 10.1, o primeiro grande lançamento na nova ramificação do GCC 10.x. Conforme novo esquema números de lançamento, a versão 10.0 foi usada no processo de desenvolvimento e, pouco antes do lançamento do GCC 10.1, a ramificação do GCC 11.0 já havia se ramificado, com base na qual a próxima versão significativa, o GCC 11.1, seria formada.

GCC 10.1 se destaca pela implementação de diversas inovações na linguagem C++ desenvolvida para o padrão C++20, melhorias relacionadas ao futuro padrão da linguagem C (C2x), novas otimizações nos backends do compilador e suporte experimental modo de análise estática. Além disso, durante a preparação de um novo branch, o projeto transferiu o repositório do SVN para o Git.

O principal mudanças:

  • Adicionado modo experimental de análise estática "-fanalizador“, que realiza análises interprocedimentos que consomem muitos recursos de caminhos de execução de código e fluxos de dados em um programa. O modo é capaz de detectar problemas no estágio de compilação, como chamadas duplas para a função free() para uma área de memória, vazamentos no descritor de arquivo, desreferenciação e passagem de ponteiros nulos, acesso a blocos de memória liberados, uso de valores não inicializados, etc. A utilização do novo modo para código OpenSSL já permitiu identificar vulnerabilidade perigosa.
  • Otimizações interprocedimentos aprimoradas. A passagem IPA-SRA (Substituição Compartilhada Escalar Interprocedural) foi reprojetada para funcionar no momento da ligação e, entre outras coisas, agora remove valores não utilizados computados e retornados. No modo de otimização "-O2", a opção "-finline-functions" está habilitada, que é reajustada para favorecer um código mais compacto em relação ao desempenho de execução. O trabalho da heurística para implantação de funções inline foi acelerado. As heurísticas de expansão em linha e clonagem de funções agora podem usar informações sobre intervalos de valores para prever a eficácia de transformações individuais. Para C++, a precisão da análise de alias baseada em tipo foi aprimorada.
  • Otimizações aprimoradas de tempo de vinculação (LTO). Adicionado novo executável lto-dump para redefinir informações sobre arquivos de objeto com bytecode LTO. As passagens LTO paralelas determinam automaticamente o número de tarefas make em execução simultânea e, se não puderem ser determinadas, usam informações sobre o número de núcleos da CPU como fator de paralelização. Adicionada a capacidade de compactar bytecode LTO usando o algoritmo zstd.
  • O mecanismo de otimização baseado nos resultados do perfil de código (PGO - Profile-guided Optimization) foi aprimorado, o que gera um código mais otimizado com base na análise das características de execução do código. Manutenção de perfil aprimorada durante a compilação e separação de código quente/frio. Através da opção "-fprofile-valores» agora pode monitorar até 4 valores de perfil, por exemplo, para chamadas indiretas e fornecer informações de perfil mais precisas.
  • Especificação de programação paralela implementada para linguagens C, C++ e Fortran OpenACC 2.6, que define ferramentas para operações de descarregamento em GPUs e processadores especializados, como NVIDIA PTX. A implementação do padrão está quase concluída Abrir MP 5.0 (Open Multi-Processing), que define a API e os métodos de aplicação de métodos de programação paralela em sistemas multi-core e híbridos (CPU+GPU/DSP) com memória compartilhada e unidades de vetorização (SIMD). Adicionados recursos como condicionais lastprivate, diretivas de varredura e loop, expressões order e use_device_addr. Para OpenMP e OpenACC, foi adicionado suporte para operações de descarregamento em GPUs AMD Radeon (GCN) de quarta geração (Fiji) e quinta geração (VEGA 10/VEGA 20).
  • Para linguagens da família C, foi adicionada a função de “acesso” para descrever o acesso da função a objetos passados ​​por referência ou ponteiro, e para associar tais objetos a argumentos inteiros contendo informações sobre o tamanho dos objetos. Para trabalhar em conjunto com “acesso”, o atributo “tipo” é implementado para detectar acesso incorreto de funções do usuário, por exemplo, ao escrever valores em uma área fora dos limites do array. Também foi adicionado o atributo "symver" para associar símbolos em um arquivo ELF com números de versão específicos.
  • Novos avisos adicionados:
    • “-Wstring-compare” (habilitado com “-Wextra”) - alerta sobre a presença de expressões nas quais zero é comparado com o resultado da chamada das funções strcmp e strncmp, o que equivale a uma constante devido ao fato de que o comprimento de um argumento é maior que o tamanho da matriz no segundo argumento.
    • "-Wzero-length-bounds" (habilitado com "-Warray-bounds") - avisa sobre o acesso a elementos da matriz de comprimento zero, o que pode levar à substituição de outros dados.
    • Os avisos “-Warray-bounds”, “-Wformat-overflow”, “-Wrestrict”, “-Wreturn-local-addr” e “-Wstringop-overflow” foram expandidos para expandir o número de situações fora dos limites que são tratados.
  • Implementada a capacidade de especificar diretamente caracteres largos em identificadores usando a codificação atual (UTF-8 por padrão) em vez da notação UCN (\uNNNN ou \UNNNNNNNN). Por exemplo:

    const estático int π = 3;
    int get_naïve_pi() {
    retornar π;
    }

  • Para a linguagem C, uma parte dos novos recursos desenvolvidos dentro do padrão C2X foi implementada (habilitada pela especificação de -std=c2x e -std=gnu2x): o suporte para a sintaxe “[[]]” apareceu para definir atributos como em C++ (por exemplo, [[gnu ::const]], [[deprecated]], [[fallthrough]] e [[maybe_unused]]. Adicionado suporte para sintaxe "u8" para definir constantes com caracteres UTF-8.
    Adicionadas novas macros ao . Adicionadas substituições "%OB" e "%Ob" ao strftime.

  • Por padrão, C usa o modo "-fno-common", que permite acesso mais eficiente a variáveis ​​globais em algumas plataformas.
  • Para C++, foram implementadas cerca de 16 mudanças e inovações, desenvolvidas no padrão C++20. Incluindo a palavra-chave adicionada “constinit”
    e o suporte para extensões de modelo foi implementado "conceitos". 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.

  • G++ fornece detecção de comportamento indefinido causado pela alteração de objetos constantes por meio de constexpr. Consumo de memória reduzido pelo compilador ao calcular constexpr. Adicionados novos avisos "-Wmismatched-tags" e "-Wredundant-tags".
  • Novas opções de linha de comando foram propostas:
    • "-fallocation-dce" para remover pares desnecessários de operadores "novo" e "excluir".
    • "-fprofile-partial-training" para desabilitar a otimização de tamanho para código que não possui uma execução de treinamento.
    • "-fprofile-reproducible para controlar o nível de reprodutibilidade do perfil.
    • "-fprofile-prefix-path" para definir o diretório de compilação de origem base usado para geração de perfil separado (para "-fprofile-generate=profile_dir" e "-fprofile-use=profile_dir").
  • No texto de aviso das opções mencionadas, são fornecidos hiperlinks que permitem acessar a documentação dessas opções. A substituição de URL é controlada usando a opção "-fdiagnostics-urls".
  • Adicionado operador de pré-processador "__has_builtin", que pode ser usado para verificar funções integradas.
  • Adicionada uma nova função integrada "__builtin_roundeven" com uma implementação da função de arredondamento definida na especificação ISO/IEC TS 18661, semelhante a "round", mas arredondando a parte maior que 0.5 para cima (para um valor maior), menor que 0.5 - decrescente (até zero) e igual a 0.5 - a partir da paridade do penúltimo dígito.
  • Para a arquitetura AArch64, o suporte para a extensão SVE2 foi adicionado e o suporte para SVE (Scalable Vector Extension) foi melhorado, incluindo suporte adicional para funções e tipos SVE ACLE integrados e o uso de vetorização. O suporte para LSE (Large System Extensions) e TME (Transactional Memory Extension) foi expandido. Adicionadas novas instruções propostas em Armv8.5-A e Armv8.6-A, incluindo instruções para geração de números aleatórios, arredondamento, ligação de tags de memória,
    bfloat16 e multiplicação de matrizes. Adicionado suporte ao processador
    Braço Cortex-A77,
    Braço Cortex-A76AE,
    Braço Cortex-A65,
    Braço Cortex-A65AE,
    Braço Cortex-A34 e
    Marvell ThunderX3.

  • Adicionado suporte para ABI FDPIC (ponteiros de função de 32 bits) para ARM64. Processamento redesenhado e otimizado de operações inteiras de 64 bits. Adicionado suporte de CPU
    Braço Cortex-A77,
    Braço Cortex-A76AE e
    Braço Cortex-M35P. Suporte expandido para instruções de processamento de dados ACLE, incluindo SIMD de 32 bits, multiplicação de 16 bits, aritmética de trava e outras otimizações de algoritmo DSP. Adicionado suporte experimental para instruções ACLE CDE (Custom Datapath Extension).

  • Geração e vetorização de código significativamente melhoradas no back-end para GPUs AMD baseadas na microarquitetura GCN.
  • Adicionado suporte para dispositivos do tipo XMEGA para arquitetura AVR
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808, ATmega809, ATmega1608, ATmega1609, ATmega3208, ATmega3209 4808, AT mega4809 e ATmegaXNUMX.

  • Uma nova extensão de arquitetura do conjunto de instruções Intel ENQCMD (-menqcmd) foi adicionada para arquiteturas IA-32/x86-64. Adicionado suporte para CPUs Intel Cooperlake (-march=cooperlake, inclui a extensão AVX512BF16 ISA) e Tigerlake (-march=tigerlake, inclui as extensões MOVDIRI, MOVDIR64B e AVX512VP2INTERSECT ISA).
  • Uma implementação do HSAIL (Linguagem Intermediária de Arquitetura de Sistema Heterogêneo) para sistemas de computação heterogêneos baseados na arquitetura HSA foi descontinuada e provavelmente será removida em uma versão futura.

Fonte: opennet.ru

Adicionar um comentário