Lanzamento do conxunto de compiladores GCC 9

Despois dun ano de desenvolvemento publicado liberación dun conxunto gratuíto de compiladores GCC 9.1, a primeira versión importante da nova rama GCC 9.x. Dacordo con novo esquema números de versión, no proceso de desenvolvemento utilizouse a versión 9.0 e, pouco antes do lanzamento de GCC 9.1, a rama GCC 10.0 xa se ramificara, en base á cal se formaría a seguinte versión significativa, GCC 10.1.

GCC 9.1 destaca por estabilizar o soporte para o estándar C++17, seguir implementando as capacidades do futuro estándar C++20 (nome en clave C++2a), inclusión no frontend para a linguaxe D, soporte parcial para OpenMP 5.0 , soporte case completo para OpenACC 2.5, aumento da escalabilidade das optimizacións e optimizacións interprocedurais na fase de vinculación, ampliación das ferramentas de diagnóstico e adición de novos avisos, backends para OpenRISC, C-SKY V2 e AMD GCN GPU.

O principal cambios:

  • Engadiuse compatibilidade coa linguaxe de programación D. GCC inclúe unha interface cun compilador GDC (Gnu D Compiler) e bibliotecas de tempo de execución (libphobos), que che permiten utilizar GCC estándar para construír programas na linguaxe de programación D. O proceso de habilitación do soporte da linguaxe D en GCC comezou aló polo 2011, pero arrastrado pola necesidade de que o código cumpra cos requisitos do GCC e os problemas coa transferencia de dereitos de propiedade intelectual a Digital Mars, que está a desenvolver a linguaxe de programación D;
  • Realizáronse melloras no xerador de código. Implementouse, por exemplo, o uso de diferentes estratexias para ampliar as expresións Switch (táboa de salto, proba de bits, árbore de decisións) en función das situacións. Engadiuse a capacidade de transformar funcións lineais que inclúen unha expresión Switch usando a optimización "-ftree-switch-conversion" (por exemplo, un conxunto de condicións como "caso 2: como = 205; romper; caso 3: como = 305; romper); ;” converterase en "100 * como + 5";
  • Optimizacións interprocedurais melloradas. A configuración de implementación en liña adaptouse para as bases de código C++ modernas e ampliáronse con novos parámetros max-inline-insns-small, max-inline-insns-size, uninlined-function-insns, uninlined-function-time, uninlined-thunk-insns e uninlined -tempo de graza. Mellora a precisión e a agresividade da separación do código frío/calor. Escalabilidade mellorada para moi grandes unidades de tradución (por exemplo, cando se aplica a optimización na fase de vinculación a grandes programas);
  • Mellorouse o mecanismo de optimización baseado nos resultados da elaboración de perfiles de código (PGO - Profile-guided optimization), que xera un código máis óptimo a partir dunha análise das características da execución do código. Opción de resumo "-fprofile-use" agora inclúe os modos de optimización "-fversion-loops-for-strides", "-floop-interchange", "-floop-unroll-and-jam" e "-ftree-loop-distribution". Eliminouse a inclusión de histogramas con contadores nos ficheiros, o que reduciu o tamaño dos ficheiros con perfís (agora os histogramas xéranse sobre a marcha cando se realizan optimizacións durante a ligazón);
  • Optimizacións de tempo de conexión (LTO) melloradas. A simplificación dos tipos proporcionouse antes de xerar o resultado, o que permitiu reducir significativamente o tamaño dos ficheiros de obxectos LTO, reducir o consumo de memoria na fase de vinculación e mellorar a paralelización das operacións. O número de particións (-param lto-partitions) aumentou de 32 a 128, o que mellora o rendemento en sistemas cunha gran cantidade de fíos de CPU. Engadiuse un parámetro para controlar o número de procesos optimizadores
    "-param lto-max-streaming-parallelism";

    Como resultado, en comparación co GCC 8.3, as optimizacións introducidas en GCC 9 permitidas reducir o tempo de compilación de Firefox 5 e LibreOffice 66 nun 6.2.3%. O tamaño dos ficheiros obxecto diminuíu un 7%. O tempo de vinculación nunha CPU de 8 núcleos diminuíu un 11 %. A fase de optimización secuencial da fase de conexión é agora un 28 % máis rápida e consome un 20 % menos de memoria. O consumo de memoria de cada procesador da etapa paralelizada de LTO diminuíu nun 30%;

  • A maior parte da especificación de programación paralela está implementada para linguaxes C, C++ e Fortran OpenACC 2.5, que define ferramentas para operacións de descarga en GPU e procesadores especializados como NVIDIA PTX;
  • Implementouse un soporte parcial para o estándar para C e C++ Abre MP 5.0 (Open Multi-Processing), que define a API e os métodos de aplicación de métodos de programación paralela para linguaxes C, C++ e Fortran en sistemas multinúcleo e híbridos (CPU+GPU/DSP) con memoria compartida e unidades de vectorización (SIMD) ;
  • Engadíronse novos avisos para a linguaxe C: "-Enderezo-do-membro-empacado" (valor do punteiro non aliñado a un membro empaquetado dunha estrutura ou unión) e
    «-Valor-Wabsoluto" (ao acceder a funcións para calcular un valor absoluto, se hai unha función máis adecuada para o argumento especificado, por exemplo, fabs(3.14) debería usarse en lugar de abs(3.14). Engadíronse novos avisos para C++: "-Wdeprecated-copy",
    "-Winit-list-lifetime", "-Wredundant-move", "-Wpessimizing-move" e "-Wclass-conversion". Ampliáronse moitos avisos dispoñibles anteriormente;

  • Engadiuse soporte experimental para parte do futuro estándar da linguaxe C, co nome en clave C2x. Para activar a compatibilidade con C2x, use as opcións "-std=c2x" e "-std=gnu2x" (para activar as extensións GNU). O estándar aínda está nunha fase inicial de desenvolvemento, polo tanto, das súas capacidades, só se admite a expresión _Static_assert cun argumento (_Static_assert con dous argumentos está estandarizada en C11);
  • O soporte para o estándar C++17 declarouse estable. No frontend, as capacidades da linguaxe de C++17 están totalmente implementadas, e en libstdc++, as funcións da biblioteca definidas no estándar están próximas á implementación total;
  • Continuado implementación elementos do futuro estándar C++2a. Por exemplo, engadiuse a capacidade de incluír intervalos durante a inicialización, implementáronse extensións para expresións lambda, engadiuse soporte para membros baleiros de estruturas de datos e atributos probables/improbables, proporcionouse a posibilidade de chamar funcións virtuais en expresións condicionais. , etc.
    Para activar a compatibilidade con C++2a, use as opcións "-std=c++2a" e "-std=gnu++2a". Engadíronse ficheiros de cabeceira de bits e versións a libstdc++ para C++ 2a, std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible e std::type_identity, std::midpoint, std::lerp functions , std::bind_front,
    std::visit, std::is_constant_evaluated e std::assume_aligned, engadiu soporte para o tipo char8_t, implementou a capacidade de comprobar o prefixo e o sufixo das cadeas (starts_with, ends_with);

  • Engadido soporte para novos procesadores ARM
    Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE e Neoverse N1. Engadido soporte para instrucións introducidas en Armv8.3-A para traballar con números complexos, xeración de números pseudoaleatorios (rng) e etiquetado de memoria (memtag), así como instrucións para bloquear ataques relacionados coa execución especulativa e o funcionamento da unidade de predición de ramas. . Para a arquitectura AArch64, engadiuse un modo de protección interseccións de pila e montón ("-fstack-clash-protection"). Para utilizar as funcións da arquitectura Armv8.5-A, engadiuse a opción "-march=armv8.5-a".

  • Inclúe un backend para xerar código para GPU AMD baseado na microarquitectura GCN. A implementación limítase actualmente á compilación de aplicacións dun só fío (máis adiante ofrecerase soporte para realizar cálculos multifíos mediante OpenMP e OpenACC) e soporte para GPU Fiji e Vega 10;
  • Engadiuse un novo backend para procesadores OpenRISC;
  • Engadido backend para procesadores C-SKY V2, producido pola empresa chinesa do mesmo nome para varios dispositivos de consumo;
  • Todas as opcións de liña de comandos que operan valores de bytes admiten os sufixos kb, KiB, MB, MiB, GB e GiB;
  • Implementado a opción “-flive-patching=[inline-only-static|inline-clone]” permítelle conseguir unha compilación segura para sistemas de parche en directo debido ao control multinivel sobre o uso de interprocedimentos (IPA) optimizacións;
  • Engadida a opción "--completion" para un control detallado da finalización das opcións cando se usa bash;
  • As ferramentas de diagnóstico ofrecen mostras de fragmentos de texto de orixe que indican o número de liña e marcan visualmente información relacionada, como os tipos de operandos. Para desactivar a visualización de números de liña e etiquetas, ofrécense as opcións "-fno-diagnostics-show-line-numbers" e "-fno-diagnostics-show-labels";

    Lanzamento do conxunto de compiladores GCC 9

  • Ampliado ferramentas para diagnosticar erros en código C++, mellora da lexibilidade da información sobre as causas dos erros e resaltado de parámetros problemáticos;

    Lanzamento do conxunto de compiladores GCC 9

  • Engadida a opción "-fdiagnostics-format=json", que permite xerar saída de diagnóstico en formato lexible por máquina (JSON);
  • Engadíronse novas opcións de creación de perfiles "-fprofile-filter-files" e "-fprofile-exclude-files" para seleccionar os ficheiros de orixe a procesar;
  • AddressSanitizer proporciona a xeración dun código de verificación máis compacto para as variables automáticas, o que reduce o consumo de memoria do ficheiro executable que se está a comprobar;
  • Produción mellorada en "-fopt-info» (información detallada sobre optimizacións engadidas). Engadíronse novos prefixos "optimizado" e "perdido", ademais do prefixo "nota" dispoñible anteriormente. Engadida a saída de información sobre a toma de decisións sobre o desenvolvemento en liña e a vectorización de ciclos;
  • Engadida a opción "-fsave-optimization-record", cando se especifica, GCC garda o ficheiro SRCFILE.opt-record.json.gz cunha descrición das decisións sobre o uso de determinadas optimizacións. A nova opción difire do modo "-fopt-info" ao incluír metadatos adicionais, como información sobre o perfil e as cadeas en liña;
  • Engadíronse opcións "-fipa-stack-alignment" e "-fipa-reference-addressable" para controlar o aliñamento da pila e o uso de modos de direccionamento (só escritura ou lectura exacta) para variables estáticas durante optimizacións interprocedementais;
  • Introdúcense novas funcións integradas para controlar a vinculación de atributos, así como o comportamento relacionado coa predición de ramas e a execución de instrucións especulativas: "__builtin_ten_atributo«,«__esperanza_con_probabilidade_integrada"E"__valor_seguro_de_especulación_integrada". Engadiuse un novo atributo para funcións, variables e tipos copia;
  • Implementouse o soporte total para entrada/saída asíncrona para a linguaxe Fortran;
  • O soporte para as plataformas Solaris 10 (*-*-solaris2.10) e Cell/BE (Cell Broadband Engine SPU) quedou en desuso e eliminarase na próxima versión principal. O soporte para as arquitecturas Armv2, Armv3, Armv5 e Armv5E foi descontinuado. O soporte para Intel MPX (extensións de protección de memoria) foi descontinuado.

Fonte: opennet.ru

Engadir un comentario