Lanzamento do conxunto de compiladores GCC 10

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

GCC 10.1 destaca pola implementación de moitas innovacións na linguaxe C++ desenvolvida para o estándar C++20, melloras relacionadas co futuro estándar da linguaxe C (C2x), novas optimizacións nos backends do compilador e soporte experimental. modo de análise estático. Ademais, durante a preparación dunha nova rama, o proxecto trasladou o repositorio de SVN a Git.

O principal cambios:

  • Engadido modo experimental de análise estática"-fanalizador", que realiza unha análise interprocedural de recursos intensivos de camiños de execución de código e fluxos de datos nun 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. O uso do novo modo para código OpenSSL xa permitiu identificar vulnerabilidade perigosa.
  • Optimizacións interprocedurais melloradas. O pase IPA-SRA (Interprocedural Scalar Shared Replacement) redeseñouse para funcionar no momento do enlace e, entre outras cousas, agora elimina os valores calculados e devoltos non utilizados. No modo de optimización "-O2", está habilitada a opción "-finline-functions", que se resintoniza para favorecer un código máis compacto fronte ao rendemento de execución. Acelerouse o traballo da heurística para o despregue de funcións en liña. A heurística de expansión en liña e de clonación de funcións agora pode usar información sobre intervalos de valores para predicir a eficacia das transformacións individuais. Para C++, mellorouse a precisión da análise de alias baseada en tipos.
  • Optimizacións de tempo de conexión (LTO) melloradas. Engadiuse un novo executable lto verter para restablecer información sobre ficheiros obxecto con código de bytes LTO. Os pases LTO paralelos determinan automaticamente o número de tarefas de creación en execución simultánea e, se non se poden determinar, usan información sobre o número de núcleos de CPU como factor de paralelización. Engadiuse a capacidade de comprimir o bytecode LTO usando o algoritmo zstd.
  • 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. Mellorado o mantemento do perfil durante a compilación e a separación do código quente/frío. A través da opción "-fprofile-values» Agora pode supervisar ata 4 valores de perfil, por exemplo, para chamadas indirectas e proporcionar información de perfil máis precisa.
  • Especificación de programación paralela implementada para linguaxes C, C++ e Fortran OpenACC 2.6, que define ferramentas para operacións de descarga en GPU e procesadores especializados como NVIDIA PTX. A implantación da norma está case completa 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 en sistemas multinúcleo e híbridos (CPU+GPU/DSP) con memoria compartida e unidades de vectorización (SIMD). Engadíronse funcións como as últimas condicións privadas, as directivas de escaneo e bucle, as expresións de orde e use_device_addr. Para OpenMP e OpenACC, engadiuse soporte para operacións de descarga en GPU AMD Radeon (GCN) de cuarta xeración (Fiji) e de quinta xeración (VEGA 10/VEGA 20).
  • Para as linguaxes da familia C, engadiuse a función "acceso" para describir o acceso da función a obxectos pasados ​​por referencia ou punteiro e para asociar tales obxectos con argumentos enteiros que conteñan información sobre o tamaño dos obxectos. Para traballar en conxunto con "acceso", o atributo "type" implícase para detectar o acceso incorrecto das funcións do usuario, por exemplo, cando se escriben valores nunha área fóra dos límites da matriz. Tamén se engade o atributo "symver" para asociar símbolos nun ficheiro ELF con números de versión específicos.
  • Engadíronse novos avisos:
    • “-Wstring-compare” (activado con “-Wextra”): advirte sobre a presenza de expresións nas que se compara cero co resultado de chamar ás funcións strcmp e strncmp, o que é equivalente a unha constante debido ao feito de que a lonxitude dun argumento é maior que o tamaño da matriz do segundo argumento.
    • "-Wzero-length-bounds" (activado con "-Warray-bounds"): advirte sobre o acceso a elementos da matriz de lonxitude cero, o que pode levar a sobrescribir outros datos.
    • Os avisos "-Warray-bounds", "-Wformat-overflow", "-Wrestrict", "-Wreturn-local-addr" e "-Wstringop-overflow" foron ampliados para ampliar o número de situacións fóra dos límites. que se manexan.
  • Implementouse a capacidade de especificar directamente caracteres anchos nos identificadores utilizando a codificación actual (UTF-8 por defecto) en lugar da notación UCN (\uNNNN ou \UNNNNNNNN). Por exemplo:

    static const int π = 3;
    int get_naïve_pi() {
    devolver π;
    }

  • Para a linguaxe C, implementouse unha parte das novas funcións desenvolvidas dentro do estándar C2X (habilitadas especificando -std=c2x e -std=gnu2x): apareceu soporte para a sintaxe “[[]]” para definir atributos como en C++ (por exemplo, [[gnu ::const]], [[deprecated]], [[fallthrough]] e [[maybe_unused]]. Engadido soporte para a sintaxe "u8" para definir constantes con caracteres UTF-8.
    Engadíronse novas macros a . Engadíronse substitucións "%OB" e "%Ob" a strftime.

  • Por defecto, C usa o modo "-fno-common", que permite un acceso máis eficiente a variables globais nalgunhas plataformas.
  • Para C++, implementáronse uns 16 cambios e innovacións, desenvolvidas no estándar C++20. Incluíndo a palabra clave engadida "constinit"
    e implementouse o soporte para extensións de modelos "conceptos". Os conceptos permiten definir un conxunto de requisitos de parámetros de modelo que, no momento da compilación, limitan o conxunto de argumentos que se poden aceptar como parámetros de modelo. Os conceptos pódense utilizar para evitar inconsistencias lóxicas entre as propiedades dos tipos de datos utilizados dentro do modelo e as propiedades dos tipos de datos dos parámetros de entrada.

  • G++ proporciona detección de comportamento indefinido causado polo cambio de obxectos constantes mediante constexpr. Consumo de memoria reducido polo compilador ao calcular constexpr. Engadíronse novos avisos "-Wmismatched-tags" e "-Wredundant-tags".
  • Propuxéronse novas opcións de liña de comandos:
    • "-fallocation-dce" para eliminar pares innecesarios de operadores "novo" e "eliminar".
    • "-fprofile-partial-training" para desactivar a optimización de tamaño para o código que non ten unha execución de adestramento.
    • "-fprofile-reproducible para controlar o nivel de reproducibilidade do perfil.
    • "-fprofile-prefix-path" para definir o directorio de compilación de orixe base usado para a xeración de perfil separado (para "-fprofile-generate=profile_dir" e "-fprofile-use=profile_dir").
  • No texto de aviso para as opcións mencionadas preséntanse hipervínculos que permiten ir á documentación destas opcións. A substitución de URL contrólase mediante a opción "-fdiagnostics-urls".
  • Engadiuse o operador de preprocesador "__construíu", que se pode usar para comprobar as funcións integradas.
  • Engadiuse unha nova función integrada "__builtin_roundeven" cunha implementación da función de redondeo definida na especificación ISO/IEC TS 18661, similar a "redondear", pero redondeando a parte superior a 0.5 (a un valor maior), inferior a 0.5 - abaixo (ata cero) e igual a 0.5 - a partir da paridade do penúltimo díxito.
  • Para a arquitectura AArch64, engadiuse soporte para a extensión SVE2 e mellorouse o soporte para SVE (Extensión vectorial escalable), incluíndo soporte adicional para funcións e tipos SVE ACLE incorporados e o uso da vectorización. Ampliouse a compatibilidade con LSE (extensións grandes do sistema) e TME (extensión de memoria transaccional). Engadíronse instrucións novas propostas en Armv8.5-A e Armv8.6-A, incluíndo instrucións para a xeración de números aleatorios, o redondeo, a vinculación de etiquetas de memoria,
    bfloat16 e multiplicación matricial. Engadido soporte de procesador
    Arm Cortex-A77,
    Arm Cortex-A76AE,
    Arm Cortex-A65,
    Arm Cortex-A65AE,
    Arm Cortex-A34 e
    Marvell ThunderX3.

  • Engadido soporte para ABI FDPIC (punteiros de funcións de 32 bits) para ARM64. Procesamento rediseñado e optimizado de operacións enteiras de 64 bits. Engadido soporte de CPU
    Arm Cortex-A77,
    Arm Cortex-A76AE e
    Brazo Cortex-M35P. Compatibilidade ampliada para instrucións de procesamento de datos ACLE, incluíndo SIMD de 32 bits, multiplicación de 16 bits, aritmética de bloqueo e outras optimizacións de algoritmos DSP. Engadiuse soporte experimental para as instrucións ACLE CDE (Custom Datapath Extension).

  • Mellorouse significativamente a xeración de código e a vectorización no backend para as GPU AMD baseadas na microarquitectura GCN.
  • Engadido soporte para dispositivos tipo XMEGA para arquitectura AVR
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808, ATmega809, ATmega1608, ATmega1609, ATmega3208 3209, ATmega4808 e ATmega4809.

  • Engadiuse unha nova extensión de arquitectura de conxunto de instrucións Intel ENQCMD (-menqcmd) para arquitecturas IA-32/x86-64. Engadido soporte para CPU Intel Cooperlake (-march=cooperlake, inclúe a extensión ISA AVX512BF16) e Tigerlake (-march=tigerlake, inclúe as extensións ISA MOVDIRI, MOVDIR64B e AVX512VP2INTERSECT).
  • Unha implementación do HSAIL (Heterogeneous System Architecture Intermediate Language) para sistemas informáticos heteroxéneos baseados na arquitectura HSA quedou obsoleta e é probable que se elimine nunha versión futura.

Fonte: opennet.ru

Engadir un comentario