Lanzamiento del conjunto de compiladores GCC 11

Después de un año de desarrollo, se lanzó el conjunto de compiladores gratuitos GCC 11.1, el primer lanzamiento importante en la nueva rama GCC 11.x. Según el nuevo esquema de numeración de versiones, durante el desarrollo se utilizó la versión 11.0 y, poco antes del lanzamiento de GCC 11.1, ya se bifurcó la rama GCC 12.0, a partir de la cual se formará la próxima versión importante de GCC 12.1.

GCC 11.1 se destaca por su transición al uso del formato de archivo de depuración DWARF 5 de forma predeterminada, la inclusión predeterminada del estándar C++17 (“-std=gnu++17”) y mejoras significativas en el soporte para C++20. estándar, soporte experimental para C++23, mejoras relacionadas con el futuro estándar del lenguaje C (C2x), nuevas optimizaciones de rendimiento.

Cambios importantes:

  • El modo predeterminado para el lenguaje C++ se ha cambiado para usar el estándar C++17 (-std=gnu++17) en lugar del C++14 ofrecido anteriormente. Es posible desactivar selectivamente el nuevo comportamiento de C++17 al procesar plantillas que utilizan otras plantillas como parámetro (-fno-new-ttp-matching).
  • Se agregó soporte para la aceleración de hardware de la herramienta AddressSanitizer, que le permite determinar los hechos de acceso a áreas de memoria liberadas, ir más allá de los límites del búfer asignado y algunos otros tipos de errores al trabajar con memoria. Actualmente, la aceleración de hardware solo está disponible para la arquitectura AArch64 y está enfocada a su uso al compilar el kernel de Linux. Para habilitar la aceleración de hardware de AddressSanitizer al crear componentes del espacio de usuario, se agregó el indicador "-fsanitize=hwaddress" y el indicador del kernel "-fsanitize=kernel-hwaddress".
  • A la hora de generar información de depuración se utiliza por defecto el formato DWARF 5 que, en comparación con versiones anteriores, permite generar datos de depuración un 25% más compactos. La compatibilidad total con DWARF 5 requiere al menos la versión 2.35.2 de binutils. El formato DWARF 5 es compatible con herramientas de depuración desde GDB 8.0, valgrind 3.17.0, elfutils 0.172 y dwz 0.14. Para generar archivos de depuración usando otras versiones de DWARF, puede usar las opciones "-gdwarf-2", "-gdwarf-3" y "-gdwarf-4".
  • Se han aumentado los requisitos para los compiladores que se pueden utilizar para construir GCC. El compilador ahora debe soportar el estándar C++11 (anteriormente se requería C++98), es decir Si GCC 10 fue suficiente para construir GCC 3.4, ahora se requiere al menos GCC 11 para construir GCC 4.8.
  • Se han cambiado el nombre y la ubicación de los archivos para guardar volcados, archivos temporales e información adicional necesaria para la optimización de LTO. Estos archivos ahora siempre se guardan en el directorio actual a menos que la ruta se cambie explícitamente mediante las opciones "-dumpbase", "-dumpdir" y "-save-temps=*".
  • La compatibilidad con el formato binario BRIG para su uso con el lenguaje HSAIL (lenguaje intermedio de arquitectura de sistemas heterogéneos) ha quedado obsoleta y pronto se eliminará.
  • Se han ampliado las capacidades del modo ThreadSanitizer (-fsanitize=thread), diseñado para detectar condiciones de carrera cuando se comparten los mismos datos de diferentes subprocesos de una aplicación multiproceso. La nueva versión agrega soporte para entornos y tiempos de ejecución alternativos, así como soporte para la herramienta de depuración KCSAN (Kernel Concurrency Sanitizer), diseñada para detectar dinámicamente condiciones de carrera dentro del kernel de Linux. Se agregaron nuevas opciones "-param tsan-distinguir-volatile" y "-param tsan-instrument-func-entry-exit".
  • Los números de columna en los mensajes de diagnóstico ahora no reflejan el recuento de bytes desde el principio de la línea, sino en realidad los números de columna que tienen en cuenta los caracteres multibyte y los caracteres que ocupan varias posiciones en la línea (por ejemplo, el carácter 🙂 ocupa dos posiciones y está codificado en 4 bytes). Del mismo modo, los caracteres de tabulación ahora se tratan como una cierta cantidad de espacios (configurable mediante la opción -ftabstop, predeterminado 8). Para restaurar el comportamiento anterior, se propone la opción "-fdiagnostics-column-unit=byte", y para determinar el valor inicial (numeración de 0 o 1), la opción "-fdiagnostics-column-origin=".
  • El vectorizador tiene en cuenta todo el contenido de la función y agrega capacidades de procesamiento asociadas con intersecciones y referencias a bloques anteriores en el gráfico de flujo de control (CFG, gráfico de flujo de control).
  • El optimizador implementa la capacidad de convertir una serie de operaciones condicionales que comparan la misma variable en una expresión de cambio. La expresión de cambio se puede codificar posteriormente utilizando instrucciones de prueba de bits (se ha agregado la opción "-fbit-tests" para controlar dicha conversión).
  • Optimizaciones interprocedimientos mejoradas. Se agregó un nuevo pase IPA-modref (-fipa-modref) para rastrear los efectos secundarios al llamar a funciones y mejorar la precisión del análisis. Implementación mejorada del pase IPA-ICF (-fipa-icf), que reduce el consumo de memoria durante la compilación y aumenta la cantidad de funciones unificadas para las cuales se combinan bloques de código idénticos. En el paso IPA-CP (propagación constante interprocedural), se han mejorado las heurísticas de predicción, teniendo en cuenta los límites y características conocidos de los bucles.
  • En Linking Time Optimizations (LTO), el formato de código de bytes está optimizado para reducir el tamaño y mejorar la velocidad de procesamiento. Reducción del consumo máximo de memoria durante la fase de enlace.
  • En el mecanismo de optimización basado en los resultados de la creación de perfiles de código (PGO - Optimización guiada por perfiles), que permite generar un código más óptimo basado en el análisis de las características de ejecución, el tamaño de los archivos con datos GCOV se reduce debido a un empaquetado más compacto de contadores cero. . Modo "-fprofile-values" mejorado al realizar un seguimiento de más parámetros en llamadas indirectas.
  • La implementación del estándar OpenMP 5.0 (Open Multi-Processing), que define 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), ha continuado. Se agregó soporte inicial para la directiva allocate y la capacidad de usar bucles heterogéneos en construcciones OpenMP. Soporte implementado para la variable de entorno OMP_TARGET_OFFLOAD.
  • Se ha mejorado la implementación de la especificación de programación paralela OpenACC 2.6 proporcionada para lenguajes C, C++ y Fortran, que define herramientas para descargar operaciones en GPU y procesadores especializados, como NVIDIA PTX.
  • Para los lenguajes C, se ha implementado un nuevo atributo “no_stack_protector”, diseñado para marcar funciones para las cuales la protección de pila no debe estar habilitada (“-fstack-protector”). El atributo "malloc" se ha ampliado para admitir la identificación de pares de llamadas para asignar y liberar memoria (asignador/desasignador), que se utiliza en el analizador estático para identificar errores típicos al trabajar con memoria (pérdida de memoria, uso después de la liberación, llamadas dobles a la función gratuita, etc.) y en las advertencias del compilador “-Wmismatched-dealloc”, “-Wmismatched-new-delete” y “-Wfree-nonheap-object”, que informan sobre la inconsistencia entre las operaciones de desasignación de memoria y asignación de memoria.
  • Se han agregado nuevas advertencias para el lenguaje C:
    • "-Wmismatched-dealloc" (habilitado de forma predeterminada): advierte sobre operaciones de desasignación de memoria que utilizan un puntero que no es compatible con las funciones de asignación de memoria.
    • "-Wsizeof-array-div" (habilitado cuando se especifica "-Wall"): advierte sobre la división de dos operadores sizeof si el divisor no coincide con el tamaño del elemento de la matriz.
    • "-Wstringop-overread" (habilitado de forma predeterminada): advierte sobre la llamada a una función de cadena que lee datos de un área fuera del límite de la matriz.
    • "-Wtsan" (habilitado de forma predeterminada): advierte sobre el uso de funciones (como std::atomic_thread_fence) que no son compatibles con ThreadSanitizer.
    • “-Warray-parameter” y “-Wvla-parameter” (habilitados al especificar “-Wall”): advierten sobre funciones anuladas con declaraciones incompatibles de argumentos asociados con matrices de longitud fija y variable.
    • La advertencia "-Wuninitialized" ahora detecta intentos de lectura desde memoria asignada dinámicamente no inicializada.
    • La advertencia "-Wfree-nonheap-object" amplía la definición de casos en los que las funciones de desasignación de memoria se llaman con un puntero que no se obtiene mediante funciones de asignación de memoria dinámica.
    • La advertencia "-Wmaybe-uninitialized" ha ampliado la detección de punteros de paso a funciones que se refieren a ubicaciones de memoria no inicializadas.
  • Para el lenguaje C, se han implementado algunas de las nuevas características desarrolladas en el marco del estándar C2X (se habilitan especificando -std=c2x y -std=gnu2x): macros BOOL_MAX y BOOL_WIDTH, indicación opcional de los nombres de los parámetros no utilizados en la función definiciones (como en C++), atributo “[ [nodiscard]]", operador de preprocesador "__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, LDBL_SN AN, DEC_INFINITY y DEC_NAN, NaN=macros para FloatN , _FloatNx y _DecimalN, capacidad de especificar marcas de salto antes de las declaraciones y al final de las declaraciones compuestas.
  • Para C++ se han implementado una parte de los cambios e innovaciones propuestas en el estándar C++20, incluyendo funciones virtuales “consteval virtual”, pseudodestructores para el final del ciclo de vida de los objetos, el uso de la clase enum y calcular el tamaño de una matriz en la expresión "nueva".
  • Para C++, se ha agregado soporte experimental para algunas mejoras que se están desarrollando para el futuro estándar C++23 (-std=c++23, -std=gnu++23, -std=c++2b, -std=gnu ++2b). Por ejemplo, ahora se admite el sufijo literal "zu" para valores size_t con signo.
  • libstdc++ ha mejorado el soporte para el estándar C++ 17, incluida la introducción de implementaciones std::from_chars y std::to_chars para tipos de punto flotante. Se han implementado nuevos elementos del estándar C++20, incluidos std::bit_cast, std::source_location, operaciones atómicas en espera y notificación, , , , , así como elementos del futuro estándar C++23 (std::to_underlying, std::is_scoped_enum). Se agregó soporte experimental para tipos de procesamiento de datos paralelos (SIMD, tipos de datos paralelos). Se ha acelerado la implementación de std::uniform_int_distribution.
  • Se eliminó el indicador de calidad alfa de libgccjit, una biblioteca compartida para incorporar un generador de código en otros procesos y usarlo para organizar la compilación JIT de código de bytes en código de máquina. Se agregó la capacidad de compilar libgccjit para MinGW.
  • Se agregó soporte para la arquitectura AArch64 Armv8-R (-march=armv8-r). Para las arquitecturas AArch64 y ARM, se agregó soporte para procesadores (parámetros -mcpu y -mtune): Arm Cortex-A78 (cortex-a78), Arm Cortex-A78AE (cortex-a78ae), Arm Cortex-A78C (cortex-a78c) , Arm Cortex- X1 (cortex-x1), Arm Neoverse V1 (neoverse-v1) y Arm Neoverse N2 (neoverse-n2). También se han agregado las CPU Fujitsu A64FX (a64fx) y Arm Cortex-R82 (cortex-r82), que admiten solo la arquitectura AArch64.
  • Se agregó soporte para el uso de instrucciones SIMD Armv8.3-a (AArch64/AArch32), SVE (AArch64), SVE2 (AArch64) y MVE (AArch32 M-profile) para autovectorizar operaciones que realizan suma, resta, multiplicación y variantes de suma/resta. números complejos. Se agregó soporte inicial para la autovectorización para ARM usando el conjunto de instrucciones MVE.
  • Para las plataformas ARM, se proporciona un conjunto completo de funciones C integradas en el compilador (intrínsecas), reemplazadas por instrucciones vectoriales extendidas (SIMD), que cubren todas las instrucciones NEON documentadas en la especificación ACLE Q3 2020.
  • Se agregó compatibilidad con la GPU gfx908 al backend para generar código para GPU AMD basadas en la microarquitectura GCN.
  • Se agregó soporte para nuevos procesadores y nuevas extensiones de conjuntos de instrucciones implementadas en ellos:
    • Intel Sapphire Rapids (-march=sapphirerapids, habilita la compatibilidad con las instrucciones MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, ENQCMD, CLDEMOTE, SERIALIZE, PTWRITE, WAITPKG, TSXLDTRK, AMT-TILE, AMX-INT8, AMX-BF16 y AVX-VNNI.
    • Intel Alderlake (-march=alderlake, habilita la compatibilidad con instrucciones CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, KEYLOCKER, AVX-VNNI y HRESET).
    • Intel Rocketlake (-march=rocketlake, similar a Rocket Lake sin soporte SGX).
    • AMD Zen 3 (-marzo=znver3).
  • Para sistemas IA-32/x86-64 basados ​​en procesadores Intel, se agregó soporte para las nuevas instrucciones de procesador TSXLDTRK, SERIALIZE, HRESET, UINTRKEYLOCKER, AMX-TILE, AMX-INT8, AMX-BF16, AVX-VNNI.
  • Se agregó soporte para los indicadores "-march=x86-64-v[234]" para seleccionar niveles de arquitectura x86-64 (v2: cubre las extensiones SSE4.2, SSSE3, POPCNT y CMPXCHG16B; v3: AVX2 y MOVBE; v4: AVX-512 ).
  • Se agregó soporte para sistemas RISC-V con orden de bytes big-endian. Se agregó la opción "-misa-spec=*" para seleccionar la versión de la especificación de arquitectura del conjunto de instrucciones RISC-V. Se agregó soporte para AddressSanitizer y protección de pila mediante etiquetas canary.
  • Mejora continua del modo de análisis estático "-fanalyzer", que realiza un análisis interprocedimiento que requiere muchos recursos de las rutas de ejecución del código y los flujos de datos en el programa. El modo es capaz de detectar problemas en la etapa de compilación, como llamadas dobles a la función free() para un área de memoria, fugas de descriptores de archivos, desreferenciación y paso de punteros nulos, acceso a bloques de memoria liberados, uso de valores no inicializados, etc. En la nueva versión:
    • El código para rastrear el estado del programa se ha reescrito por completo. Se han resuelto los problemas al escanear archivos C muy grandes.
    • Se agregó soporte inicial de C++.
    • El análisis de asignación y desasignación de memoria se ha abstraído de las funciones gratuitas y malloc específicas, y ahora admite nuevo/eliminar y nuevo[]/eliminar[].
    • Se agregaron nuevas advertencias: -Wanalyzer-shift-count-negative, -Wanalyzer-shift-count-overflow, -Wanalyzer-write-to-const y -Wanalyzer-write-to-string-literal.
    • Se agregaron nuevas opciones de depuración -fdump-analyzer-json y -fno-analyzer-factibility.
    • Se ha implementado la posibilidad de ampliar el analizador mediante complementos para GCC (por ejemplo, se ha preparado un complemento para comprobar el uso incorrecto del bloqueo global (GIL) en CPython).

Fuente: opennet.ru

Añadir un comentario