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