Lanzamento do conxunto de compiladores GCC 12

Despois dun ano de desenvolvemento, lanzouse a suite de compiladores gratuítos GCC 12.1, a primeira versión significativa da nova rama GCC 12.x. De acordo co novo esquema de numeración de versións, no proceso de desenvolvemento utilizouse a versión 12.0 e, pouco antes do lanzamento de GCC 12.1, xa se ramificara a rama GCC 13.0, en base á cal a seguinte versión principal, GCC 13.1, estar formado. O 23 de maio, o proxecto cumprirá 35 anos da formación da primeira edición de GCC.

Principais cambios:

  • Engadido soporte para o formato de depuración CTF (Compact Type Format), que proporciona un almacenamento compacto de información sobre os tipos C, conexións entre funcións e símbolos de depuración. Cando se incrusta en obxectos ELF, o formato permite o uso de táboas de caracteres EFL para evitar a duplicación de datos.
  • O soporte para o formato de almacenamento de información de depuración "STABS", creado na década de 1980, quedou en desuso.
  • O traballo segue ampliando o soporte para futuros estándares C2X e C++23 para as linguaxes C e C++. Por exemplo, engadiuse soporte para a expresión "se consteval"; permitido usar auto en argumentos de función (“f(auto(g()))”); o uso de variables non literais, goto e etiquetas está permitido nas funcións declaradas como constexpr; engadido soporte para operadores de índice multidimensionais operador[]; en if, for e switch, as capacidades dos bloques de inicialización foron ampliadas ("for (usando T = int; T e : v)").
  • A biblioteca estándar de C++ mellorou o soporte para as seccións experimentais dos estándares C++20 e C++23. Engadido soporte para std::move_only_function, , std::basic_string::resize_and_overwrite, , e std::invoke_r. Permítese usar std::unique_ptr, std::vector, std::basic_string, std::optional e std::variant nas funcións constexpr.
  • O frontend de Fortran ofrece soporte completo para a especificación TS 29113, que describe as capacidades para garantir a portabilidade entre Fortran e código C.
  • Engadiuse compatibilidade para a extensión __builtin_shufflevector(vec1, vec2, index1, index2, ...) previamente engadida a Clang, que ofrece unha única chamada para realizar operacións de mestura e aleatorio de vectores comúns.
  • Cando se utiliza o nivel de optimización "-O2", a vectorización está habilitada por defecto (os modos -ftree-vectorize e -fvect-cost-model=moi barato están habilitados). O modelo moi barato permite a vectorización só se o código vectorial pode substituír completamente o código escalar que se vectoriza.
  • Engadiuse o modo "-ftrivial-auto-var-init" para permitir a inicialización explícita de variables na pila para rastrexar problemas e bloquear vulnerabilidades asociadas ao uso de variables non inicializadas.
  • Para as linguaxes C e C++, engadiuse unha función incorporada __builtin_dynamic_object_size para determinar o tamaño dun obxecto, compatible cunha función similar de Clang.
  • Para as linguaxes C e C++, engadiuse soporte para o atributo "non dispoñible" (por exemplo, podes marcar funcións que xerarán un erro se intentas usalas).
  • Para as linguaxes C e C++, engadiuse soporte para as directivas de preprocesamento "#elifdef" e "#elifndef".
  • Engadiuse a marca "-Wbidi-chars" para mostrar unha advertencia se os caracteres UTF-8 se usan incorrectamente, cambiando a orde na que se mostra o texto bidireccional.
  • Engadiuse a marca "-Warray-compare" para avisar cando se tenta comparar dous operandos que se refiren a matrices.
  • A implementación dos estándares OpenMP 5.0 e 5.1 (Open Multi-Processing), que definen a API e os métodos para aplicar métodos de programación paralela en sistemas multinúcleo e híbridos (CPU+GPU/DSP) con memoria compartida e unidades de vectorización (SIMD) , continuou.
  • Implementación mellorada da especificación de programación paralela OpenACC 2.6, que define ferramentas para as operacións de descarga en GPU e procesadores especializados como NVIDIA PTX.
  • Compatibilidade con instrucións ampliadas Intel AVX86-FP512 e o ​​tipo _Float16 engadiuse ao backend de xeración de código para a arquitectura x16.
  • Para a arquitectura x86, engadiuse protección contra vulnerabilidades dos procesadores causadas pola execución especulativa de instrucións despois de operacións de salto adiante incondicionais. O problema prodúcese debido ao procesamento preventivo das instrucións inmediatamente despois da instrución da rama na memoria (SLS, Straight Line Speculation). Para habilitar a protección, proponse a opción "-mharden-sls".
  • Engadida detección do uso de variables non inicializadas ao analizador estático experimental. Engadiuse soporte inicial para analizar o código de montaxe nas insercións en liña. Seguimento da memoria mellorado. Reescribíuse o código para procesar expresións de cambio.
  • Engadíronse 30 novas chamadas a libgccjit, unha biblioteca compartida para incorporar un xerador de código noutros procesos e usalo para compilar JIT bytecode en código máquina.
  • Engadiuse ao backend o soporte para o mecanismo CO-RE (Compile Once - Run Everywhere) para xerar código de bytes BPF, que permite compilar o código dos programas eBPF para o núcleo de Linux só unha vez e utilizar un cargador universal especial que adapta o programa cargado ao kernel actual e ao formato de tipos BPF). CO-RE resolve o problema da portabilidade dos programas eBPF compilados, que antes só se podían empregar na versión do núcleo para o que foron compilados, xa que a posición dos elementos nas estruturas de datos cambia de versión en versión.
  • O backend RISC-V engade soporte para novas extensións de arquitectura de conxunto de instrucións zba, zbb, zbc e zbs, así como extensións ISA para operacións criptográficas vectoriais e escalares. De forma predeterminada, ofrécese soporte para a especificación RISC-V ISA 20191213. Engadiuse a marca -mtune=thead-c906 para activar as optimizacións dos núcleos T-HEAD c906.
  • Compatibilidade co tipo __int128_t/integer(kind=16) engadiuse ao backend de xeración de código para as GPU AMD baseadas na microarquitectura GCN. É posible utilizar ata 40 grupos de traballo por unidade de computación (CU) e ata 16 frontes de instrucións (fronte de onda, un conxunto de fíos executados en paralelo polo motor SIMD) por grupo. Anteriormente, só se permitía un bordo de instrución por CU.
  • O backend NVPTX, deseñado para xerar código usando a arquitectura do conxunto de instrucións NVIDIA PTX (Parallel Thread Execution), engadiu a posibilidade de usar as bandeiras "-march", "-mptx" e "-march-map". Soporte implementado para PTX ISA sm_53, sm_70, sm_75 e sm_80. A arquitectura predeterminada é sm_30.
  • As implementacións das funcións integradas reescribíronse no backend para os procesadores PowerPC/PowerPC64/RS6000. As funcións integradas __builtin_get_texasr, __builtin_get_texasru, __builtin_get_tfhar, __builtin_get_tfiar, __builtin_set_texasr, __builtin_set_texasru, __builtin_set_tfhar e document_set_tfiar son
  • Soporte para Arm Ampere-64 (-mcpu/-mtune ampere1), Arm Cortex-A1 (cortex-a510), Arm Cortex-A510 (cortex-a710) e Arm Cortex-X710 (cortex-x2). Engadido soporte para novas opcións de arquitectura ARMv2 para usar coa opción "-march": armv8-a, armv8.7-a, armv8.8-a. Engadida a implementación de funcións C integradas no compilador (Intrínsecos) para carga atómica e gardar datos na memoria, baseándose no uso de instrucións ARM estendidas (ls9). Engadido soporte para acelerar as funcións memcpy, memmove e memset usando a extensión ARM mopsoption.
  • Engadiuse un novo modo de verificación "-fsanitize=shadow-call-stack" (ShadowCallStack), que actualmente só está dispoñible para a arquitectura AArch64 e funciona cando se crea código coa opción "-ffixed-r18". O modo ofrece protección contra a sobrescritura do enderezo de retorno dunha función en caso de desbordamento do búfer na pila. A esencia da protección é gardar o enderezo de retorno nunha pila "sombra" separada despois de transferir o control a unha función e recuperar este enderezo antes de saír da función.

Fonte: opennet.ru

Engadir un comentario