Lançamento do conjunto de compiladores GCC 11

Após um ano de desenvolvimento, foi lançada a versão gratuita do compilador GCC 11.1, a primeira versão significativa na nova ramificação GCC 11.x. Sob o novo esquema de numeração de lançamento, a versão 11.0 foi usada durante o desenvolvimento e, pouco antes do lançamento do GCC 11.1, o ramo GCC 12.0 já foi bifurcado, a partir do qual o próximo lançamento significativo do GCC 12.1 será formado.

O GCC 11.1 é notável por sua transição para o uso do formato de arquivo de depuração DWARF 5 por padrão, a inclusão padrão do padrão C++ 17 (“-std=gnu++17”), melhorias significativas no suporte para o C++ 20 padrão, suporte experimental para C++23, melhorias relacionadas ao futuro padrão da linguagem C (C2x), novas otimizações de desempenho.

Grandes mudanças:

  • O modo padrão da linguagem C++ foi alterado para usar o padrão C++17 (-std=gnu++17) em vez do C++14 oferecido anteriormente. É possível desabilitar seletivamente o novo comportamento do C++ 17 ao processar modelos que usam outros modelos como parâmetro (-fno-new-ttp-matching).
  • Adicionado suporte para aceleração de hardware da ferramenta AddressSanitizer, que permite determinar os fatos de acesso a áreas de memória liberadas, ultrapassando os limites do buffer alocado e alguns outros tipos de erros ao trabalhar com memória. A aceleração de hardware está atualmente disponível apenas para a arquitetura AArch64 e é focada no uso na compilação do kernel Linux. Para ativar a aceleração de hardware AddressSanitizer ao construir componentes de espaço do usuário, o sinalizador "-fsanitize=hwaddress" foi adicionado e o sinalizador de kernel "-fsanitize=kernel-hwaddress".
  • Na geração de informações de depuração, é utilizado por padrão o formato DWARF 5, que, comparado às versões anteriores, permite gerar dados de depuração 25% mais compactos. O suporte total para DWARF 5 requer pelo menos a versão 2.35.2 do binutils. O formato DWARF 5 é suportado em ferramentas de depuração desde GDB 8.0, valgrind 3.17.0, elfutils 0.172 e dwz 0.14. Para gerar arquivos de depuração usando outras versões do DWARF, você pode usar as opções "-gdwarf-2", "-gdwarf-3" e "-gdwarf-4".
  • Os requisitos para compiladores que podem ser usados ​​para construir o GCC foram aumentados. O compilador agora deve suportar o padrão C++ 11 (anteriormente era necessário o C++ 98), ou seja, Se o GCC 10 foi suficiente para construir o GCC 3.4, então pelo menos o GCC 11 é agora necessário para construir o GCC 4.8.
  • O nome e a localização dos arquivos para salvar dumps, arquivos temporários e informações adicionais necessárias para a otimização do LTO foram alterados. Esses arquivos agora são sempre salvos no diretório atual, a menos que o caminho seja explicitamente alterado através das opções "-dumpbase", "-dumpdir" e "-save-temps=*".
  • O suporte para o formato binário BRIG para uso com a linguagem HSAIL (Heterogeneous System Architecture Intermediate Language) foi descontinuado e será removido em breve.
  • Os recursos do modo ThreadSanitizer (-fsanitize=thread) foram expandidos, projetados para detectar condições de corrida ao compartilhar os mesmos dados de diferentes threads de um aplicativo multithread. A nova versão adiciona suporte para tempos de execução e ambientes alternativos, bem como suporte para a ferramenta de depuração KCSAN (Kernel Concurrency Sanitizer), projetada para detectar dinamicamente condições de corrida no kernel Linux. Adicionadas novas opções "-param tsan-distinguish-volatile" e "-param tsan-instrument-func-entry-exit".
  • Os números das colunas nas mensagens de diagnóstico agora refletem não a contagem de bytes desde o início da linha, mas na verdade os números das colunas que levam em consideração caracteres multibyte e caracteres que ocupam várias posições na linha (por exemplo, o caractere 🙂 ocupa duas posições e é codificado em 4 bytes). Da mesma forma, os caracteres de tabulação agora são tratados como um certo número de espaços (configurável através da opção -ftabstop, padrão 8). Para restaurar o comportamento antigo, é proposta a opção “-fdiagnostics-column-unit=byte”, e para determinar o valor inicial (numeração de 0 ou 1) - a opção “-fdiagnostics-column-origin=”.
  • O vetorizador leva em consideração todo o conteúdo da função e adiciona capacidades de processamento associadas a interseções e referências a blocos anteriores no gráfico de fluxo de controle (CFG, gráfico de fluxo de controle).
  • O otimizador implementa a capacidade de converter uma série de operações condicionais que comparam a mesma variável em uma expressão switch. A expressão switch pode posteriormente ser codificada usando instruções de teste de bits (a opção “-fbit-tests” foi adicionada para controlar tal conversão).
  • Otimizações interprocedimentos aprimoradas. Adicionada uma nova passagem IPA-modref (-fipa-modref) para rastrear efeitos colaterais ao chamar funções e melhorar a precisão da análise. Implementação aprimorada do passe IPA-ICF (-fipa-icf), que reduz o consumo de memória durante a compilação e aumenta o número de funções unificadas para as quais blocos de código idênticos são combinados. Na passagem IPA-CP (propagação constante interprocedural), as heurísticas de predição foram aprimoradas, levando em consideração limites conhecidos e características dos loops.
  • Em Linking Time Optimizations (LTO), o formato de bytecode é otimizado para reduzir o tamanho e melhorar a velocidade de processamento. Consumo de memória de pico reduzido durante a fase de vinculação.
  • No mecanismo de otimização baseado nos resultados do perfil de código (PGO - Profile-guided Optimization), que permite gerar código mais otimizado com base na análise dos recursos de execução, o tamanho dos arquivos com dados GCOV é reduzido devido ao empacotamento mais compacto dos contadores zero . Modo "-fprofile-values" aprimorado, monitorando mais parâmetros em chamadas indiretas.
  • A implementação do padrão OpenMP 5.0 (Open Multi-Processing), que define a API e os métodos para 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), tem contínuo. Adicionado suporte inicial para a diretiva de alocação e a capacidade de usar loops heterogêneos em construções OpenMP. Suporte implementado para a variável de ambiente OMP_TARGET_OFFLOAD.
  • Foi aprimorada a implementação da especificação de programação paralela OpenACC 2.6 fornecida para as linguagens C, C++ e Fortran, que define ferramentas para operações de offload em GPUs e processadores especializados, como NVIDIA PTX.
  • Para linguagens C, foi implementado um novo atributo “no_stack_protector”, projetado para marcar funções para as quais a proteção de pilha não deve ser habilitada (“-fstack-protector”). O atributo “malloc” foi ampliado para suportar a identificação de pares de chamadas para alocação e liberação de memória (allocator/deallocator), que é utilizado no analisador estático para identificar erros típicos no trabalho com memória (vazamentos de memória, uso após liberação, chamadas duplas para a função free, etc.) e nos avisos do compilador “-Wmismatched-dealloc”, “-Wmismatched-new-delete” e “-Wfree-nonheap-object”, informando sobre inconsistência entre operações de desalocação de memória e alocação de memória.
  • Novos avisos foram adicionados para a linguagem C:
    • "-Wmismatched-dealloc" (habilitado por padrão) - avisa sobre operações de desalocação de memória que usam um ponteiro que não é compatível com funções de alocação de memória.
    • "-Wsizeof-array-div" (habilitado quando "-Wall" é especificado) - Avisa sobre a divisão de dois operadores sizeof se o divisor não corresponder ao tamanho do elemento da matriz.
    • "-Wstringop-overread" (habilitado por padrão) - avisa sobre a chamada de uma função de string que lê dados de uma área fora dos limites do array.
    • "-Wtsan" (habilitado por padrão) - Avisa sobre o uso de recursos (como std::atomic_thread_fence) que não são suportados no ThreadSanitizer.
    • “-Warray-parameter” e “-Wvla-parameter” (habilitado ao especificar “-Wall”) - avisa sobre a substituição de funções com declarações incompatíveis de argumentos associados a matrizes de comprimento fixo e variável.
    • O aviso "-Wuninitialized" agora detecta tentativas de leitura de memória não inicializada alocada dinamicamente.
    • O aviso "-Wfree-nonheap-object" expande a definição de casos em que funções de desalocação de memória são chamadas com um ponteiro não obtido por meio de funções de alocação dinâmica de memória.
    • O aviso "-Wmaybe-uninitialized" expandiu a detecção de passagem de ponteiros para funções que se referem a locais de memória não inicializados.
  • Para a linguagem C, uma parte dos novos recursos desenvolvidos dentro da estrutura do padrão C2X foi implementada (habilitada pela especificação de -std=c2x e -std=gnu2x): macros BOOL_MAX e BOOL_WIDTH, indicação opcional de nomes de parâmetros não utilizados na função definições (como em C++), atributo “[[nodiscard]]”, operador de pré-processador “__has_c_attribute”, macros FLT_IS_IEC_60559, DBL_IS_IEC_60559, LDBL_IS_IEC_60559, __STDC_WANT_IEC_60559_EXT__, INFINITY, NAN, FLT_SNAN, DBL_SNAN, LD BL_SNAN, DEC_INFINITY e DEC_NAN, NaN=macros para FloatN , _FloatNx e _DecimalN, capacidade de especificar marcas de salto antes das declarações e no final das instruções compostas.
  • Para C++, foi implementada uma parcela das mudanças e inovações propostas no padrão C++20, incluindo funções virtuais “consteval virtual”, pseudodestruidores para fim de ciclo de vida de objetos, uso da classe enum e calculando o tamanho de um array na expressão “nova”.
  • Para C++, foi adicionado suporte experimental para algumas melhorias que estão sendo desenvolvidas para o futuro padrão C++23 (-std=c++23, -std=gnu++23, -std=c++2b, -std=gnu ++2b). Por exemplo, agora há suporte para o sufixo literal “zu” para valores size_t assinados.
  • libstdc++ melhorou o suporte para o padrão C++ 17, incluindo a introdução de implementações std::from_chars e std::to_chars para tipos de ponto flutuante. Novos elementos do padrão C++20 foram implementados incluindo std::bit_cast std::source_location operações atômicas wait and notify , , , , bem como elementos do futuro padrão C++23 (std::to_underlying, std::is_scoped_enum). Adicionado suporte experimental para tipos de processamento de dados paralelos (SIMD, Data-Parallel Types). A implementação de std::uniform_int_distribution foi acelerada.
  • Removido o sinalizador de qualidade alfa da libgccjit, uma biblioteca compartilhada para incorporar um gerador de código em outros processos e usá-lo para organizar a compilação JIT de bytecode em código de máquina. Adicionada a capacidade de construir libgccjit para MinGW.
  • Adicionado suporte para a arquitetura AArch64 Armv8-R (-march=armv8-r). Para arquiteturas AArch64 e ARM, foi adicionado suporte para processadores (parâmetros -mcpu e -mtune): Arm Cortex-A78 (cortex-a78), Arm Cortex-A78AE (cortex-a78ae), Arm Cortex-A78C (cortex-a78c) , Arm Cortex-X1 (córtex-x1), Arm Neoverse V1 (neoverse-v1) e Arm Neoverse N2 (neoverse-n2). As CPUs Fujitsu A64FX (a64fx) e Arm Cortex-R82 (cortex-r82) também foram adicionadas, suportando apenas a arquitetura AArch64.
  • Adicionado suporte para usar instruções SIMD Armv8.3-a (AArch64/AArch32), SVE (AArch64), SVE2 (AArch64) e MVE (AArch32 M-profile) para autovetorizar operações realizando adição, subtração, multiplicação e variantes de adição/subtração sobre números complexos. Adicionado suporte inicial para autovetorização para ARM usando o conjunto de instruções MVE.
  • Para plataformas ARM, é fornecido um conjunto completo de funções C integradas ao compilador (Intrinsics), substituídas por instruções vetoriais estendidas (SIMD), cobrindo todas as instruções NEON documentadas na especificação ACLE Q3 2020.
  • O suporte para GPU gfx908 foi adicionado ao backend para gerar código para GPUs AMD baseadas na microarquitetura GCN.
  • Adicionado suporte para novos processadores e novas extensões de conjunto de instruções implementadas neles:
    • Intel Sapphire Rapids (-march=sapphirerapids, permite suporte para as instruções MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, ENQCMD, CLDEMOTE, SERIALIZE, PTWRITE, WAITPKG, TSXLDTRK, AMT-TILE, AMX-INT8, AMX-BF16 e AVX-VNNI.
    • Intel Alderlake (-march=alderlake, permite suporte para instruções CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, KEYLOCKER, AVX-VNNI e HRESET).
    • Intel Rocketlake (-march=rocketlake, semelhante ao Rocket Lake sem suporte SGX).
    • AMD Zen 3 (-março=znver3).
  • Para sistemas IA-32/x86-64 baseados em processadores Intel, foi adicionado suporte para novas instruções de processador TSXLDTRK, SERIALIZE, HRESET, UINTRKEYLOCKER, AMX-TILE, AMX-INT8, AMX-BF16, AVX-VNNI.
  • Adicionado suporte para sinalizadores "-march=x86-64-v[234]" para selecionar níveis de arquitetura x86-64 (v2 - abrange extensões SSE4.2, SSSE3, POPCNT e CMPXCHG16B; v3 - AVX2 e MOVBE; v4 - AVX-512 ).
  • Adicionado suporte para sistemas RISC-V com ordem de bytes big-endian. Adicionada a opção "-misa-spec=*" para selecionar a versão da especificação da arquitetura do conjunto de instruções RISC-V. Adicionado suporte para AddressSanitizer e proteção de pilha usando tags canary.
  • Melhoria contínua do modo de análise estática “-fanalyzer”, que realiza análise interprocedimento com uso intensivo de recursos de caminhos de execução de código e fluxos de dados no programa. O modo é capaz de detectar problemas no estágio de compilação, como chamadas duplas da 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. Na nova versão:
    • O código para rastrear o estado do programa foi completamente reescrito. Problemas com a verificação de arquivos C muito grandes foram resolvidos.
    • Adicionado suporte inicial a C++.
    • A análise de alocação e desalocação de memória foi abstraída das funções específicas malloc e free e agora suporta new/delete e new[]/delete[].
    • Adicionados novos avisos: -Wanalyzer-shift-count-negative, -Wanalyzer-shift-count-overflow, -Wanalyzer-write-to-const e -Wanalyzer-write-to-string-literal.
    • Adicionadas novas opções de depuração -fdump-analyzer-json e -fno-analyzer-feasibility.
    • Foi implementada a capacidade de estender o analisador através de plugins para GCC (por exemplo, foi preparado um plugin para verificar o uso incorreto de bloqueio global (GIL) no CPython).

Fonte: opennet.ru

Adicionar um comentário