Lanzamiento del conjunto de compiladores GCC 12

Después de un año de desarrollo, se lanzó el conjunto de compiladores gratuito GCC 12.1, el primer lanzamiento importante de la nueva rama GCC 12.x. De acuerdo con el nuevo esquema de numeración de versiones, en el proceso de desarrollo se utilizó la versión 12.0 y, poco antes del lanzamiento de GCC 12.1, ya se había dividido la rama GCC 13.0, a partir de la cual se lanzaría la próxima versión principal, GCC 13.1. Ser formado. El 23 de mayo el proyecto celebrará 35 años desde la formación de la primera edición de GCC.

Cambios importantes:

  • Se agregó soporte para el formato de depuración CTF (formato de tipo compacto), que proporciona almacenamiento compacto de información sobre tipos C, conexiones entre funciones y símbolos de depuración. Cuando se incrusta en objetos ELF, el formato permite el uso de tablas de caracteres EFL para evitar la duplicación de datos.
  • La compatibilidad con el formato de almacenamiento de información de depuración "STABS", creado en la década de 1980, ha quedado obsoleto.
  • Continúa el trabajo para ampliar el soporte para futuros estándares C2X y C++23 para los lenguajes C y C++. Por ejemplo, se ha añadido soporte para la expresión “si consteval”; permitido usar auto en argumentos de función (“f(auto(g()))”); se permite el uso de variables no literales, goto y etiquetas en funciones declaradas como constexpr; soporte agregado para operadores de índice multidimensional operador[]; en if, for y switch, se han ampliado las capacidades de los bloques de inicialización (“for (usando T = int; T e : v)”).
  • La biblioteca estándar de C++ ha mejorado la compatibilidad con las secciones experimentales de los estándares C++20 y C++23. Se agregó soporte para std::move_only_function, , std::basic_string::resize_and_overwrite, , y std::invoke_r. Se permite usar std::unique_ptr, std::vector, std::basic_string, std::optional y std::variant en funciones constexpr.
  • La interfaz de Fortran proporciona soporte completo para la especificación TS 29113, que describe capacidades para garantizar la portabilidad entre el código Fortran y C.
  • Se agregó soporte para la extensión __builtin_shufflevector(vec1, vec2, index1, index2, ...) agregada anteriormente a Clang, que ofrece una única llamada para realizar operaciones comunes de reproducción aleatoria y aleatoria de vectores.
  • Cuando se utiliza el nivel de optimización "-O2", la vectorización está habilitada de forma predeterminada (los modos -ftree-vectorize y -fvect-cost-model=very-cheap están habilitados). El modelo muy económico permite la vectorización sólo si el código vectorial puede reemplazar completamente el código escalar que se está vectorizando.
  • Se agregó el modo "-ftrivial-auto-var-init" para permitir la inicialización explícita de variables en la pila para rastrear problemas y bloquear vulnerabilidades asociadas con el uso de variables no inicializadas.
  • Para los lenguajes C y C++, se ha agregado una función incorporada __builtin_dynamic_object_size para determinar el tamaño de un objeto, compatible con una función similar de Clang.
  • Para los lenguajes C y C++, se agregó soporte para el atributo "no disponible" (por ejemplo, puede marcar funciones que generarán un error si intenta usarlas).
  • Para los lenguajes C y C++, se agregó soporte para las directivas de preprocesamiento “#elifdef” y “#elifndef”.
  • Se agregó el indicador "-Wbidi-chars" para mostrar una advertencia si los caracteres UTF-8 se usan incorrectamente, cambiando el orden en que se muestra el texto bidireccional.
  • Se agregó el indicador "-Warray-compare" para mostrar una advertencia al intentar comparar dos operandos que hacen referencia a matrices.
  • La implementación de los estándares OpenMP 5.0 y 5.1 (Open Multi-Processing), que definen la API y los métodos para aplicar métodos de programación paralela en sistemas multinúcleo e híbridos (CPU+GPU/DSP) con memoria compartida y unidades de vectorización (SIMD). , continuó.
  • Implementación mejorada de la especificación de programación paralela OpenACC 2.6, que define herramientas para descargar operaciones en GPU y procesadores especializados como NVIDIA PTX.
  • Se agregó soporte para instrucciones extendidas Intel AVX86-FP512 y el tipo _Float16 al backend de generación de código para la arquitectura x16.
  • Para la arquitectura x86, se ha agregado protección contra vulnerabilidades en los procesadores causadas por la ejecución especulativa de instrucciones después de operaciones de salto hacia adelante incondicionales. El problema se produce debido al procesamiento preventivo de instrucciones inmediatamente después de la instrucción de bifurcación en la memoria (SLS, Straight Line Speculation). Para habilitar la protección se propone la opción “-mharden-sls”.
  • Se agregó detección del uso de variables no inicializadas al analizador estático experimental. Se agregó soporte inicial para analizar código ensamblador en inserciones en línea. Seguimiento de memoria mejorado. Se ha reescrito el código para procesar expresiones de cambio.
  • Se agregaron 30 nuevas llamadas a libgccjit, una biblioteca compartida para incorporar un generador de código en otros procesos y usarlo para compilar JIT código de bytes en código de máquina.
  • Se ha agregado soporte para el mecanismo CO-RE (Compilar una vez - Ejecutar en todas partes) al backend para generar código de bytes BPF, lo que le permite compilar el código de los programas eBPF para el kernel de Linux solo una vez y usar un cargador universal especial que adapta el programa cargado al kernel actual y al formato de tipos BPF). CO-RE resuelve el problema de portabilidad de los programas eBPF compilados, que anteriormente solo podían usarse en la versión del kernel para la que fueron compilados, ya que la posición de los elementos en las estructuras de datos cambia de una versión a otra.
  • El backend RISC-V agrega soporte para nuevas extensiones de arquitectura de conjunto de instrucciones zba, zbb, zbc y zbs, así como extensiones ISA para operaciones criptográficas vectoriales y escalares. De forma predeterminada, se proporciona compatibilidad con la especificación RISC-V ISA 20191213. Se agregó el indicador -mtune=thead-c906 para permitir optimizaciones para los núcleos T-HEAD c906.
  • Se agregó compatibilidad con el tipo __int128_t/integer(kind=16) al backend de generación de código para GPU AMD basadas en la microarquitectura GCN. Es posible utilizar hasta 40 grupos de trabajo por unidad de cómputo (CU) y hasta 16 frentes de instrucciones (frente de onda, un conjunto de subprocesos ejecutados en paralelo por el SIMD Engine) por grupo. Anteriormente, sólo se permitía una ventaja de instrucción por CU.
  • El backend NVPTX, diseñado para generar código utilizando la arquitectura del conjunto de instrucciones NVIDIA PTX (Parallel Thread Execution), ha agregado la capacidad de usar los indicadores “-march”, “-mptx” y “-march-map”. Soporte implementado para PTX ISA sm_53, sm_70, sm_75 y sm_80. La arquitectura predeterminada es sm_30.
  • Las implementaciones de funciones integradas se han reescrito en el backend para los procesadores PowerPC/PowerPC64/RS6000. Las funciones integradas __builtin_get_texasr, __builtin_get_texasru, __builtin_get_tfhar, __builtin_get_tfiar, __builtin_set_texasr, __builtin_set_texasru, __builtin_set_tfhar y __builtin_set_tfiar están documentadas.
  • Soporte para Arm Ampere-64 (-mcpu/-mtune ampere1), Arm Cortex-A1 (cortex-a510), Arm Cortex-A510 (cortex-a710) y Arm Cortex-X710 (cortex-x2). Se agregó soporte para nuevas opciones de arquitectura ARMv2 para usar con la opción "-march": armv8-a, armv8.7-a, armv8.8-a. Se agregó la implementación de funciones C integradas en el compilador (Intrinsics) para cargar atómicamente y guardar datos en la memoria, basada en el uso de instrucciones ARM extendidas (ls9). Se agregó soporte para acelerar las funciones memcpy, memmove y memset usando la extensión ARM mopsoption.
  • Se agregó un nuevo modo de verificación “-fsanitize=shadow-call-stack” (ShadowCallStack), que actualmente solo está disponible para la arquitectura AArch64 y funciona al compilar código con la opción “-ffixed-r18”. El modo proporciona protección contra la sobrescritura de la dirección de retorno de una función en caso de un desbordamiento del búfer en la pila. La esencia de la protección es guardar la dirección de retorno en una pila "sombra" separada después de transferir el control a una función y recuperar esta dirección antes de salir de la función.

Fuente: opennet.ru

Añadir un comentario