Lançamento do conjunto de compiladores GCC 12

Após um ano de desenvolvimento, o conjunto de compiladores gratuito GCC 12.1 foi lançado, o primeiro lançamento significativo no novo ramo GCC 12.x. De acordo com o novo esquema de numeração de lançamento, a versão 12.0 foi usada no processo de desenvolvimento e, pouco antes do lançamento do GCC 12.1, a ramificação do GCC 13.0 já havia se ramificado, com base na qual a próxima versão principal, o GCC 13.1, seria ser formado. No dia 23 de maio, o projeto comemorará 35 anos da formação da primeira edição do GCC.

Grandes mudanças:

  • Adicionado suporte para o formato de depuração CTF (Compact Type Format), que fornece armazenamento compacto de informações sobre tipos C, conexões entre funções e símbolos de depuração. Quando incorporado em objetos ELF, o formato permite o uso de tabelas de caracteres EFL para evitar duplicação de dados.
  • O suporte para o formato de armazenamento de informações de depuração "STABS", criado na década de 1980, foi descontinuado.
  • O trabalho continua para expandir o suporte para futuros padrões C2X e C++23 para as linguagens C e C++. Por exemplo, foi adicionado suporte para a expressão “if consteval”; permitido usar auto em argumentos de função (“f(auto(g()))”); o uso de variáveis ​​não literais, goto e rótulos é permitido em funções declaradas como constexpr; adicionado suporte para operadores de índice multidimensionais operador[]; em if, for e switch, as capacidades dos blocos de inicialização foram expandidas (“for (using T = int; T e : v)”).
  • A Biblioteca Padrão C++ melhorou o suporte para as seções experimentais dos padrões C++20 e C++23. Adicionado suporte para std::move_only_function, , std::basic_string::resize_and_overwrite, , e std::invoke_r. Permitido usar std::unique_ptr, std::vector, std::basic_string, std::optional e std::variant em funções constexpr.
  • O frontend Fortran fornece suporte completo para a especificação TS 29113, que descreve capacidades para garantir a portabilidade entre Fortran e código C.
  • Adicionado suporte para a extensão __builtin_shufflevector(vec1, vec2, index1, index2, ...) adicionada anteriormente ao Clang, que oferece uma única chamada para realizar operações comuns de embaralhamento e embaralhamento de vetores.
  • Ao usar o nível de otimização "-O2", a vetorização é habilitada por padrão (os modos -ftree-vectorize e -fvect-cost-model=very-cheap estão habilitados). O modelo muito barato permite a vetorização somente se o código vetorial puder substituir completamente o código escalar que está sendo vetorizado.
  • Adicionado o modo "-ftrivial-auto-var-init" para permitir a inicialização explícita de variáveis ​​na pilha para rastrear problemas e bloquear vulnerabilidades associadas ao uso de variáveis ​​não inicializadas.
  • Para linguagens C e C++, uma função integrada __builtin_dynamic_object_size foi adicionada para determinar o tamanho de um objeto, compatível com uma função semelhante do Clang.
  • Para as linguagens C e C++, foi adicionado suporte para o atributo “indisponível” (por exemplo, você pode marcar funções que gerarão um erro se você tentar utilizá-las).
  • Para linguagens C e C++, foi adicionado suporte para diretivas de pré-processamento “#elifdef” e “#elifndef”.
  • Adicionado sinalizador "-Wbidi-chars" para exibir um aviso se caracteres UTF-8 forem usados ​​incorretamente, alterando a ordem em que o texto bidirecional é exibido.
  • Adicionado sinalizador "-Warray-compare" para exibir um aviso ao tentar comparar dois operandos que se referem a arrays.
  • A implementação dos padrões OpenMP 5.0 e 5.1 (Open Multi-Processing), que definem 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) , continuou.
  • Implementação aprimorada da especificação de programação paralela OpenACC 2.6, que define ferramentas para operações de descarregamento em GPUs e processadores especializados, como NVIDIA PTX.
  • Suporte para instruções estendidas Intel AVX86-FP512 e o ​​tipo _Float16 foram adicionados ao back-end de geração de código para a arquitetura x16.
  • Para a arquitetura x86, foi adicionada proteção contra vulnerabilidades em processadores causadas pela execução especulativa de instruções após operações de avanço incondicional. O problema ocorre devido ao processamento preventivo de instruções imediatamente após a instrução de desvio na memória (SLS, Straight Line Speculation). Para habilitar a proteção, é proposta a opção “-mharden-sls”.
  • Adicionada detecção do uso de variáveis ​​não inicializadas ao analisador estático experimental. Adicionado suporte inicial para análise de código assembly em inserções embutidas. Rastreamento de memória aprimorado. O código para processar expressões switch foi reescrito.
  • Adicionadas 30 novas chamadas para libgccjit, uma biblioteca compartilhada para incorporar um gerador de código em outros processos e usá-lo para compilar bytecode JIT em código de máquina.
  • Foi adicionado suporte ao mecanismo CO-RE (Compile Once - Run Everywhere) ao backend para geração de bytecode BPF, que permite compilar o código dos programas eBPF para o kernel Linux apenas uma vez e usar um carregador universal especial que adapta o programa carregado para o kernel atual e formato de tipos BPF). CO-RE resolve o problema de portabilidade de programas eBPF compilados, que antes só podiam ser utilizados na versão do kernel para o qual foram compilados, uma vez que a posição dos elementos nas estruturas de dados muda de versão para versão.
  • O backend RISC-V adiciona suporte para novas extensões de arquitetura de conjunto de instruções zba, zbb, zbc e zbs, bem como extensões ISA para operações criptográficas vetoriais e escalares. Por padrão, é fornecido suporte para a especificação RISC-V ISA 20191213. O sinalizador -mtune=thead-c906 foi adicionado para permitir otimizações para núcleos T-HEAD c906.
  • O suporte para o tipo __int128_t/integer(kind=16) foi adicionado ao back-end de geração de código para GPUs AMD baseadas na microarquitetura GCN. É possível utilizar até 40 grupos de trabalho por unidade computacional (CU) e até 16 frentes de instruções (wavefront, conjunto de threads executadas em paralelo pelo SIMD Engine) por grupo. Anteriormente, apenas uma borda de instrução por UC era permitida.
  • O backend NVPTX, projetado para gerar código usando a arquitetura do conjunto de instruções NVIDIA PTX (Parallel Thread Execution), adicionou a capacidade de usar os sinalizadores “-march”, “-mptx” e “-march-map”. Implementado suporte para PTX ISA sm_53, sm_70, sm_75 e sm_80. A arquitetura padrão é sm_30.
  • No backend dos processadores PowerPC/PowerPC64/RS6000, as implementações de funções integradas foram reescritas. As funções integradas __builtin_get_texasr, __builtin_get_texasru, __builtin_get_tfhar, __builtin_get_tfiar, __builtin_set_texasr, __builtin_set_texasru, __builtin_set_tfhar e __builtin_set_tfiar estão documentadas.
  • Suporte para Arm Ampere-64 (-mcpu/-mtune ampere1), Arm Cortex-A1 (cortex-a510), Arm Cortex-A510 (cortex-a710) e Arm Cortex-X710 (cortex-x2). Adicionado suporte para novas opções de arquitetura ARMv2 para uso com a opção "-march": armv8-a, armv8.7-a, armv8.8-a. Adicionada implementação de funções C integradas ao compilador (Intrinsics) para carregamento atômico e salvamento de dados na memória, com base no uso de instruções ARM estendidas (ls9). Adicionado suporte para acelerar as funções memcpy, memmove e memset usando a extensão mopsoption ARM.
  • Adicionado um novo modo de verificação “-fsanitize=shadow-call-stack” (ShadowCallStack), que atualmente está disponível apenas para a arquitetura AArch64 e funciona ao construir código com a opção “-ffixed-r18”. O modo fornece proteção contra a substituição do endereço de retorno de uma função no caso de um buffer overflow na pilha. A essência da proteção é salvar o endereço de retorno em uma pilha “sombra” separada após transferir o controle para uma função e recuperar esse endereço antes de sair da função.

Fonte: opennet.ru

Adicionar um comentário