Lanzamento do conxunto de compiladores GCC 11

Despois dun ano de desenvolvemento, lanzouse a versión gratuíta do conxunto de compiladores GCC 11.1, a primeira versión significativa da nova rama GCC 11.x. Baixo o esquema de numeración do novo lanzamento, utilizouse a versión 11.0 durante o desenvolvemento, e pouco antes do lanzamento de GCC 11.1, xa se bifurcou a rama GCC 12.0, a partir da cal se formará a próxima versión significativa de GCC 12.1.

GCC 11.1 destaca pola súa transición ao uso do formato de ficheiro de depuración DWARF 5 por defecto, a inclusión predeterminada do estándar C++17 ("-std=gnu++17"), melloras significativas no soporte para C++20. estándar, soporte experimental para C++23, melloras relacionadas co futuro estándar da linguaxe C (C2x), novas optimizacións de rendemento.

Principais cambios:

  • O modo predeterminado para a linguaxe C++ cambiouse para usar o estándar C++17 (-std=gnu++17) en lugar do C++14 ofrecido anteriormente. É posible desactivar selectivamente o novo comportamento de C++17 ao procesar modelos que usan outros modelos como parámetro (-fno-new-ttp-matching).
  • Engadiuse soporte para a aceleración de hardware da ferramenta AddressSanitizer, que permite determinar os feitos de acceder ás áreas de memoria liberadas, ir máis aló dos límites do búfer asignado e algúns outros tipos de erros ao traballar coa memoria. A aceleración de hardware só está dispoñible actualmente para a arquitectura AArch64 e céntrase no uso ao compilar o núcleo de Linux. Para activar a aceleración de hardware de AddressSanitizer ao crear compoñentes do espazo de usuario, engadiuse a marca "-fsanitize=hwaddress" e a marca do núcleo "-fsanitize=kernel-hwaddress".
  • Ao xerar información de depuración utilízase por defecto o formato DWARF 5 que, en comparación coas versións anteriores, permite xerar datos de depuración un 25% máis compactos. O soporte completo para DWARF 5 require polo menos a versión 2.35.2 de binutils. O formato DWARF 5 é compatible con ferramentas de depuración desde GDB 8.0, valgrind 3.17.0, elfutils 0.172 e dwz 0.14. Para xerar ficheiros de depuración usando outras versións de DWARF, pode usar as opcións "-gdwarf-2", "-gdwarf-3" e "-gdwarf-4".
  • Aumentáronse os requisitos para compiladores que se poden usar para construír GCC. O compilador agora debe soportar o estándar C++11 (anteriormente era necesario C++98), é dicir. Se GCC 10 foi suficiente para construír GCC 3.4, agora é necesario polo menos GCC 11 para construír GCC 4.8.
  • Modificáronse o nome e a localización dos ficheiros para gardar vertedoiros, ficheiros temporais e información adicional necesaria para a optimización de LTO. Estes ficheiros agora gárdanse sempre no directorio actual a non ser que a ruta se cambie explícitamente a través das opcións "-dumpbase", "-dumpdir" e "-save-temps="*".
  • O soporte para o formato binario BRIG para usar coa linguaxe HSAIL (Linguaxe intermedia de arquitectura de sistemas heteroxéneos) quedou en desuso e eliminarase en breve.
  • Ampliáronse as capacidades do modo ThreadSanitizer (-fsanitize=thread), deseñado para detectar as condicións de carreira cando se comparten os mesmos datos de diferentes fíos dunha aplicación multiproceso. A nova versión engade soporte para tempos de execución e ambientes alternativos, así como soporte para a ferramenta de depuración KCSAN (Kernel Concurrency Sanitizer), deseñada para detectar de forma dinámica as condicións de carreira dentro do núcleo de Linux. Engadíronse novas opcións "-param tsan-distinguish-volatile" e "-param tsan-instrument-func-entry-exit".
  • Os números de columna das mensaxes de diagnóstico agora non reflicten o reconto de bytes desde o principio da liña, senón os números de columna que teñen en conta os caracteres de varios bytes e os caracteres que ocupan varias posicións na liña (por exemplo, o carácter 🙂 ocupa dúas posicións e está codificado en 4 bytes). Do mesmo xeito, os caracteres de tabulación agora trátanse como un determinado número de espazos (configurable mediante a opción -ftabstop, por defecto 8). Para restaurar o comportamento antigo, proponse a opción "-fdiagnostics-column-unit=byte" e para determinar o valor inicial (numeración de 0 ou 1) - a opción "-fdiagnostics-column-origin=".
  • O vectorizador ten en conta todo o contido da función e engade capacidades de procesamento asociadas a interseccións e referencias a bloques anteriores no gráfico de fluxo de control (CFG, gráfico de fluxo de control).
  • O optimizador implementa a capacidade de converter unha serie de operacións condicionais que comparan a mesma variable nunha expresión de cambio. A expresión de cambio pódese codificar máis tarde usando instrucións de proba de bits (a opción "-fbit-tests" engadiuse para controlar esa conversión).
  • Optimizacións interprocedurais melloradas. Engadiuse un novo pase IPA-modref (-fipa-modref) para rastrexar os efectos secundarios ao chamar funcións e mellorar a precisión da análise. Implementación mellorada do pase IPA-ICF (-fipa-icf), que reduce o consumo de memoria durante a compilación e aumenta o número de funcións unificadas para as que se combinan bloques de código idénticos. No pase IPA-CP (Propagación constante interprocedimental) melloráronse as heurísticas de predición, tendo en conta os límites coñecidos e as características dos bucles.
  • En Linking Time Optimizations (LTO), o formato de bytecode está optimizado para reducir o tamaño e mellorar a velocidade de procesamento. Redución do consumo máximo de memoria durante a fase de vinculación.
  • No mecanismo de optimización baseado nos resultados da elaboración de perfiles de código (PGO - Profile-guided optimization), que permite xerar un código máis óptimo baseado na análise das características de execución, o tamaño dos ficheiros con datos GCOV redúcese debido ao empaquetado máis compacto de contadores cero. . Mellorouse o modo "-fprofile-values" ao facer un seguimento de máis parámetros nas chamadas indirectas.
  • A implementación do estándar OpenMP 5.0 (Open Multi-Processing), que define 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), ten continuou. Engadido soporte inicial para a directiva de asignación e a capacidade de usar bucles heteroxéneos en construcións OpenMP. Implementouse a compatibilidade coa variable de ambiente OMP_TARGET_OFFLOAD.
  • Mellorouse a implementación da especificación de programación paralela OpenACC 2.6 prevista para linguaxes C, C++ e Fortran, que define ferramentas para as operacións de descarga en GPU e procesadores especializados, como NVIDIA PTX.
  • Para as linguaxes C, implementouse un novo atributo "no_stack_protector", deseñado para marcar funcións para as que non se debería activar a protección da pila ("-fstack-protector"). O atributo "malloc" ampliouse para admitir a identificación de pares de chamadas para asignar e liberar memoria (asignador/desalocador), que se usa no analizador estático para identificar erros típicos ao traballar coa memoria (fugas de memoria, uso despois da liberación, etc.). chamadas dobres á función libre, etc.) e nos avisos do compilador “-Wmismatched-dealloc”, “-Wmismatched-new-delete” e “-Wfree-nonheap-object”, informando sobre a inconsistencia entre as operacións de desasignación e asignación de memoria.
  • Engadíronse novos avisos para a linguaxe C:
    • "-Wmismatched-dealloc" (activado por defecto): advirte sobre as operacións de desasignación de memoria que usan un punteiro que non é compatible coas funcións de asignación de memoria.
    • "-Wsizeof-array-div" (activado cando se especifica "-Wall") - Advirte sobre a división de dous operadores sizeof se o divisor non coincide co tamaño do elemento da matriz.
    • "-Wstringop-overread" (activado por defecto) - advirte sobre a chamada a unha función de cadea que le datos dunha área fóra do límite da matriz.
    • "-Wtsan" (activado por defecto) - Advirte sobre o uso de funcións (como std::atomic_thread_fence) que non son compatibles con ThreadSanitizer.
    • “-Warray-parameter” e “-Wvla-parameter” (activados ao especificar “-Wall”): advirten sobre a anulación de funcións con declaracións incompatibles de argumentos asociados con matrices de lonxitude fixa e variable.
    • O aviso "-Wuninitialized" agora detecta os intentos de ler desde memoria asignada dinámicamente sen inicializar.
    • A advertencia "-Wfree-nonheap-object" amplía a definición de casos nos que as funcións de desasignación de memoria se chaman cun punteiro que non se obtén mediante funcións de asignación de memoria dinámica.
    • A advertencia "-Wmaybe-uninitialized" ampliou a detección de pasar punteiros a funcións que fan referencia a localizacións de memoria non inicializadas.
  • Para a linguaxe C, implementouse unha parte das novas funcionalidades desenvolvidas no marco do estándar C2X (habilitadas especificando -std=c2x e -std=gnu2x): macros BOOL_MAX e BOOL_WIDTH, indicación opcional dos nomes dos parámetros non utilizados na función definicións (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, INFEX_BLTSN_AN, NANLDSN_AN, DBL_IS_IEC_XNUMX _SNAN, DEC_INFINITY e DEC_NAN, NaN=macros para FloatN , _FloatNx e _DecimalN, capacidade de especificar marcas de salto antes das declaracións e ao final das instrucións compostas.
  • Para C++, implementáronse unha parte dos cambios e innovacións propostos no estándar C++20, incluíndo funcións virtuais “consteval virtual”, pseudo-destrutores para o final do ciclo de vida dos obxectos, o uso da clase enum e calculando o tamaño dunha matriz na expresión "nova".
  • Para C++, engadiuse soporte experimental para algunhas melloras que se están a desenvolver para o futuro estándar C++23 (-std=c++23, -std=gnu++23, -std=c++2b, -std=gnu ++2b). Por exemplo, agora hai soporte para o sufixo literal "zu" para os valores size_t asinados.
  • libstdc++ mellorou o soporte para o estándar C++17, incluíndo a introdución de implementacións std::from_chars e std::to_chars para tipos de coma flotante. Implementáronse novos elementos do estándar C++20, incluíndo std::bit_cast, std::source_location, operacións atómicas esperar e notificar, , , , , así como elementos do futuro estándar C++23 (std::to_underlying, std::is_scoped_enum). Engadiuse soporte experimental para tipos de procesamento de datos en paralelo (SIMD, Data-Parallel Types). Acelerouse a implementación de std::uniform_int_distribution.
  • Eliminouse a marca de calidade alfa de libgccjit, unha biblioteca compartida para incorporar un xerador de código noutros procesos e usalo para organizar a compilación JIT de bytecode en código máquina. Engadiuse a posibilidade de construír libgccjit para MinGW.
  • Engadido soporte para a arquitectura AArch64 Armv8-R (-march=armv8-r). Para as arquitecturas AArch64 e ARM, engadiuse soporte para procesadores (parámetros -mcpu e -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) e Arm Neoverse N2 (neoverse-n2). Tamén se engadiron CPU Fujitsu A64FX (a64fx) e Arm Cortex-R82 (cortex-r82), que só admiten a arquitectura AArch64.
  • Engadido soporte para usar as instrucións SIMD Armv8.3-a (AArch64/AArch32), SVE (AArch64), SVE2 (AArch64) e MVE (AArch32 M-profile) para autovectorizar operacións que realizan sumas, restas, multiplicacións e variantes de suma/resta. números complexos. Engadiuse soporte inicial para a vectorización automática para ARM mediante o conxunto de instrucións MVE.
  • Para as plataformas ARM, ofrécese un conxunto completo de funcións C integradas no compilador (intrínsecas), substituídas por instrucións vectoriales ampliadas (SIMD), que abarcan todas as instrucións NEON documentadas na especificación ACLE Q3 2020.
  • Engadiuse ao backend compatibilidade para GPU gfx908 para xerar código para GPU AMD baseados na microarquitectura GCN.
  • Engadido soporte para novos procesadores e novas extensións de conxunto de instrucións implementadas neles:
    • Intel Sapphire Rapids (-march=sapphirerapids, permite compatibilidade con MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, ENQCMD, CLDEMOTE, SERIALIZE, PTWRITE, WAITPKG, TSXLDTRK, AMT-TILE, AMX-INT8, AMX-BV16NI e instrucións.
    • Intel Alderlake (-march=alderlake, permite compatibilidade con instrucións CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, KEYLOCKER, AVX-VNNI e HRESET).
    • Intel Rocketlake (-march=rocketlake, semellante a Rocket Lake sen soporte para SGX).
    • AMD Zen 3 (-march=znver3).
  • Para os sistemas IA-32/x86-64 baseados en procesadores Intel, engadiuse soporte para novas instrucións de procesador TSXLDTRK, SERIALIZE, HRESET, UINTRKEYLOCKER, AMX-TILE, AMX-INT8, AMX-BF16, AVX-VNNI.
  • Engadiuse compatibilidade coas marcas "-march=x86-64-v[234]" para seleccionar os niveis de arquitectura x86-64 (v2 - abrangue as extensións SSE4.2, SSSE3, POPCNT e CMPXCHG16B; v3 - AVX2 e MOVBE; v4 - AVX-512 ).
  • Engadido soporte para sistemas RISC-V con orde de bytes big-endian. Engadida a opción "-misa-spec="*" para seleccionar a versión da especificación da arquitectura do conxunto de instrucións RISC-V. Engadiuse compatibilidade con AddressSanitizer e protección de pila mediante etiquetas Canary.
  • Mellora continuada do modo de análise estática "-fanalyzer", que realiza unha análise interprocedural de uso intensivo de recursos das rutas de execución de código e dos fluxos de datos do programa. O modo é capaz de detectar problemas na fase de compilación, como chamadas dobres á función free() para unha área de memoria, fugas de descritores de ficheiros, desreferenciación e paso de punteiros nulos, acceso a bloques de memoria liberados, uso de valores non inicializados, etc. Na nova versión:
    • O código para rastrexar o estado do programa foi completamente reescrito. Resolvéronse os problemas coa dixitalización de ficheiros C moi grandes.
    • Engadido soporte inicial de C++.
    • A análise de asignación e desasignación de memoria foi abstraída das funcións específicas de malloc e free, e agora admite new/delete e new[]/delete[].
    • Engadíronse novos avisos: -Wanalyzer-shift-count-negative, -Wanalyzer-shift-count-overflow, -Wanalyzer-write-to-const e -Wanalyzer-write-to-string-literal.
    • Engadíronse novas opcións de depuración -fdump-analyzer-json e -fno-analyzer-feasibility.
    • Implementouse a capacidade de estender o analizador mediante complementos para GCC (por exemplo, preparouse un complemento para comprobar o uso incorrecto do bloqueo global (GIL) en CPython).

Fonte: opennet.ru

Engadir un comentario