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.
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.