Lanzamiento del conjunto de compiladores GCC 10

Después de un año de desarrollo publicado lanzamiento de un conjunto gratuito de compiladores GCC 10.1, la primera versión importante de la nueva rama GCC 10.x. De acuerdo con nuevo esquema números de versión, en el proceso de desarrollo se utilizó la versión 10.0, y poco antes del lanzamiento de GCC 10.1, la rama GCC 11.0 ya se había dividido, sobre la base de la cual se formaría la próxima versión importante, GCC 11.1.

GCC 10.1 se destaca por la implementación de muchas innovaciones en el lenguaje C++ desarrollado para el estándar C++ 20, mejoras relacionadas con el futuro estándar del lenguaje C (C2x), nuevas optimizaciones en los backends del compilador y soporte experimental. modo de análisis estático. Además, durante la preparación de una nueva rama, el proyecto transfirió el repositorio de SVN a Git.

El principal cambios:

  • Добавлен modo experimental de análisis estático "-fanalizador“, 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 un 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. El uso del nuevo modo para código OpenSSL ya ha permitido identificar vulnerabilidad peligrosa.
  • Optimizaciones interprocedimientos mejoradas. El pase IPA-SRA (Reemplazo compartido escalar interprocedural) se ha rediseñado para funcionar en el momento del enlace y, entre otras cosas, ahora elimina los valores no utilizados calculados y devueltos. En el modo de optimización "-O2", la opción "-finline-functions" está habilitada, que se reajusta para favorecer un código más compacto sobre el rendimiento de ejecución. Se ha acelerado el trabajo de la heurística para el despliegue de funciones en línea. Las heurísticas de expansión en línea y clonación de funciones ahora pueden utilizar información sobre rangos de valores para predecir la efectividad de transformaciones individuales. Para C++, se ha mejorado la precisión del análisis de alias basado en tipos.
  • Optimizaciones mejoradas del tiempo de vinculación (LTO). Añadido nuevo ejecutable lto-volcado para restablecer información sobre archivos de objetos con código de bytes LTO. Los pases LTO paralelos determinan automáticamente la cantidad de tareas make que se ejecutan simultáneamente y, si no se pueden determinar, utilizan información sobre la cantidad de núcleos de CPU como factor de paralelización. Se agregó la capacidad de comprimir el código de bytes LTO usando el algoritmo zstd.
  • Se ha mejorado el mecanismo de optimización basado en los resultados del perfilado de código (PGO - Optimización guiada por perfiles), que genera un código más óptimo basado en un análisis de las características de ejecución del código. Mantenimiento de perfil mejorado durante la compilación y separación de código frío/caliente. A través de la opción "-fvalores-de-perfil» ahora puede monitorear hasta 4 valores de perfil, por ejemplo para llamadas indirectas y proporcionar información de perfil más precisa.
  • Especificación de programación paralela implementada para lenguajes C, C++ y Fortran AbiertoACC 2.6, que define herramientas para descargar operaciones en GPU y procesadores especializados como NVIDIA PTX. La implementación de la norma está casi completa Open MP 5.0 (Open Multi-Processing), que define la API y los métodos de aplicación de 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). Se agregaron funciones como condicionales lastprivate, directivas de escaneo y bucle, expresiones order y use_device_addr. Para OpenMP y OpenACC, se agregó soporte para operaciones de descarga en GPU AMD Radeon (GCN) de cuarta generación (Fiji) y quinta generación (VEGA 10/VEGA 20).
  • Para los lenguajes de la familia C, se agregó la función "acceso" para describir el acceso de la función a objetos pasados ​​por referencia o puntero, y para asociar dichos objetos con argumentos enteros que contienen información sobre el tamaño de los objetos. Para trabajar junto con "acceso", se implementa el atributo "tipo" para detectar el acceso incorrecto de las funciones del usuario, por ejemplo, al escribir valores en un área fuera de los límites de la matriz. También se agrega el atributo "symver" para asociar símbolos en un archivo ELF con números de versión específicos.
  • Nuevas advertencias agregadas:
    • “-Wstring-compare” (habilitado con “-Wextra”): advierte sobre la presencia de expresiones en las que se compara cero con el resultado de llamar a las funciones strcmp y strncmp, lo que equivale a una constante debido a que la longitud de un argumento es mayor que el tamaño de la matriz en el segundo argumento.
    • "-Wzero-length-bounds" (habilitado con "-Warray-bounds"): advierte sobre el acceso a elementos de matriz de longitud cero, lo que puede provocar la sobrescritura de otros datos.
    • Las advertencias “-Warray-bounds”, “-Wformat-overflow”, “-Wrestrict”, “-Wreturn-local-addr” y “-Wstringop-overflow” se han ampliado para ampliar el número de situaciones fuera de límites. que se manejan.
  • Se implementó la capacidad de especificar directamente caracteres anchos en identificadores usando la codificación actual (UTF-8 de forma predeterminada) en lugar de la notación UCN (\uNNNN o \UNNNNNNNNN). Por ejemplo:

    constante estática int π = 3;
    int get_naïve_pi() {
    devolver π;
    }

  • Para el lenguaje C, se han implementado una parte de las nuevas características desarrolladas dentro del estándar C2X (habilitadas especificando -std=c2x y -std=gnu2x): ha aparecido soporte para la sintaxis “[[]]” para definir atributos como en C++ (por ejemplo, [[gnu ::const]], [[obsoleto]], [[fallthrough]] y [[maybe_unused]]. Se agregó soporte para la sintaxis "u8" para definir constantes con caracteres UTF-8.
    Se agregaron nuevas macros a . Se agregaron sustituciones "%OB" y "%Ob" a strftime.

  • El modo predeterminado para C es "-fno-common", que permite un acceso más eficiente a las variables globales en algunas plataformas.
  • Para C++ se han implementado alrededor de 16 cambios e innovaciones, desarrollados en el estándar C++20. Incluyendo la palabra clave agregada "constinit"
    y se ha implementado soporte para extensiones de plantilla "conceptos". Los conceptos le permiten definir un conjunto de requisitos de parámetros de plantilla que, en el momento de la compilación, limitan el conjunto de argumentos que se pueden aceptar como parámetros de plantilla. Los conceptos se pueden utilizar para evitar inconsistencias lógicas entre las propiedades de los tipos de datos utilizados dentro de la plantilla y las propiedades del tipo de datos de los parámetros de entrada.

  • G++ proporciona detección de comportamiento indefinido causado por el cambio de objetos constantes a través de constexpr. Reducción del consumo de memoria por parte del compilador al calcular constexpr. Se agregaron nuevas advertencias "-Wmismatched-tags" y "-Wredundant-tags".
  • Se han propuesto nuevas opciones de línea de comando:
    • "-fallocation-dce" para eliminar pares innecesarios de operadores "nuevos" y "eliminar".
    • "-fprofile-partial-training" para deshabilitar la optimización del tamaño del código que no tiene una ejecución de entrenamiento.
    • "-fprofile-reproducible para controlar el nivel de reproducibilidad del perfil.
    • "-fprofile-prefix-path" para definir el directorio de compilación de origen base utilizado para la generación de perfiles por separado (para "-fprofile-generate=profile_dir" y "-fprofile-use=profile_dir").
  • En el texto de advertencia para las opciones mencionadas, se proporcionan hipervínculos que le permiten ir a la documentación de estas opciones. La sustitución de URL se controla mediante la opción "-fdiagnostics-urls".
  • Operador de preprocesador agregado "__ha_integrado", que se puede utilizar para comprobar las funciones integradas.
  • Se agregó una nueva función incorporada "__builtin_roundeven" con una implementación de la función de redondeo definida en la especificación ISO/IEC TS 18661, similar a "redondo", pero redondeando parte mayor que 0.5 hacia arriba (a un valor mayor), menor que 0.5 - hacia abajo (a cero) e igual a 0.5 - a partir de la paridad del penúltimo dígito.
  • Para la arquitectura AArch64, se agregó soporte para la extensión SVE2 y se mejoró el soporte para SVE (Scalable Vector Extension), incluido soporte agregado para funciones y tipos SVE ACLE integrados y el uso de vectorización. Se ha ampliado la compatibilidad con LSE (Extensiones de sistemas grandes) y TME (Extensión de memoria transaccional). Se agregaron nuevas instrucciones propuestas en Armv8.5-A y Armv8.6-A, incluidas instrucciones para generación de números aleatorios, redondeo, vinculación de etiquetas de memoria,
    bfloat16 y multiplicación de matrices. Soporte de procesador agregado
    Brazo Cortex-A77,
    Brazo Cortex-A76AE,
    Brazo Cortex-A65,
    Brazo Cortex-A65AE,
    Brazo Cortex-A34 y
    Marvell ThunderX3.

  • Se agregó soporte para ABI FDPIC (punteros de función de 32 bits) para ARM64. Procesamiento rediseñado y optimizado de operaciones enteras de 64 bits. Se agregó soporte para CPU
    Brazo Cortex-A77,
    Brazo Cortex-A76AE y
    Brazo Cortex-M35P. Soporte ampliado para instrucciones de procesamiento de datos ACLE, incluidas SIMD de 32 bits, multiplicación de 16 bits, aritmética de retención y otras optimizaciones de algoritmos DSP. Se agregó soporte experimental para instrucciones ACLE CDE (Extensión de ruta de datos personalizada).

  • Generación y vectorización de código significativamente mejoradas en el backend para GPU AMD basadas en la microarquitectura GCN.
  • Se agregó soporte para dispositivos tipo XMEGA para arquitectura AVR.
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808, ATmega809, ATmega1608, ATmega1609, ATmega3208, ATmega3209 4808, ATmega4809 y ATmegaXNUMX.

  • Se ha agregado una nueva extensión de arquitectura del conjunto de instrucciones Intel ENQCMD (-menqcmd) para arquitecturas IA-32/x86-64. Se agregó soporte para las CPU Intel Cooperlake (-march=cooperlake, incluye la extensión ISA AVX512BF16) y Tigerlake (-march=tigerlake, incluye las extensiones ISA MOVDIRI, MOVDIR64B y AVX512VP2INTERSECT).
  • Una implementación de HSAIL (lenguaje intermedio de arquitectura de sistemas heterogéneos) para sistemas informáticos heterogéneos basados ​​en la arquitectura HSA ha quedado obsoleta y probablemente se eliminará en una versión futura.

Fuente: opennet.ru

Añadir un comentario