GCC 11.1 est publié avec des fonctionnalités expérimentales du C++ 23
et le support d'un certain nombre de processeurs Intel, AMD et Arm récents et à venir

Les développeurs de GCC ont annoncé mardi la disponibilité d'une nouvelle version majeure de la collection de compilateurs, GCC 11.1. Cette version change le format de débogage par défaut en DWARF 5 sur la plupart des cibles et change la version du langage C++ par défaut en -std=gnu++17. Elle fait de grands progrès dans le support du langage C++ 20, à la fois du côté du compilateur et de la bibliothèque, ajoute le support expérimental de C++ 23, quelques améliorations C2X, diverses améliorations d'optimisation et corrections de bogues, des améliorations aux back-ends du compilateur et beaucoup d'autres changements.

Nom : 5251802d54538c04e688fc014f93328f.jpg
Affichages : 30275
Taille : 50,2 Ko

Améliorations générales

Linux Kernel Concurrency Sanitizer (KCSAN)

L'équipe a apporté des améliorations à ThreadSanitizer pour supporter des environnements et des runtimes alternatifs. Le KCSAN est maintenant supporté :

  • ajout de --param tsan-distinguish-volatile pour émettre optionnellement une instrumentation distinguant les accès volatiles ;
  • ajout de --param tsan-instrument-func-entry-exit pour contrôler optionnellement si les entrées et sorties de fonctions doivent être instrumentées.

Les numéros de colonne

Selon l'équipe, dans les versions précédentes de GCC, les "numéros de colonne" émis dans les diagnostics étaient en fait un compte d'octets depuis le début de la ligne source. Cela pouvait être problématique, à la fois à cause :

  • des caractères multioctets (nécessitant plus d'un octet pour être encodés), et
  • des caractères multicolonnes (nécessitant plus d'une colonne pour être affichés dans une police monospace).

Par exemple, le caractère π ("GREEK SMALL LETTER PI (U+03C0)") occupe une colonne, et son encodage UTF-8 nécessite deux octets ; le caractère �� ("SLIGHTLY SMILING FACE (U+1F642)") occupe deux colonnes, et son encodage UTF-8 nécessite quatre octets. Dans GCC 11, les numéros de colonnes deviennent par défaut des numéros de colonnes respectant les caractères multicolonnes. L'ancien comportement peut être restauré en utilisant une nouvelle option -fdiagnostics-column-unit=byte.

Il y a aussi une nouvelle option -fdiagnostics-column-origin= qui permet de remplacer le défaut préexistant de la colonne de gauche par la colonne 1 si on le souhaite (par exemple, pour les colonnes basées sur 0). La sortie de -fdiagnostics-format=json a été étendue pour fournir à la fois le nombre d'octets et les numéros de colonne pour tous les emplacements de source.

De plus, dans les versions précédentes de GCC, les caractères de tabulation dans la source étaient émis textuellement lors de la citation du code source, mais étaient préfixés avec des informations d'espacement ou de numéro de ligne, ce qui entraînait des désalignements dans la sortie résultante par rapport aux sources réelles. Les caractères de tabulation sont maintenant imprimés avec un nombre approprié d'espaces, en utilisant l'option -ftabstop (qui propose par défaut 8 espaces par arrêt de tabulation).

Hardware-assisted AddressSanitizer

Cette version du compilateur introduit le support de Hardware-assisted AddressSanitizer. Cet assainisseur ne fonctionne actuellement que pour la cible AArch64. Il aide à déboguer les problèmes d'adresse de manière similaire à AddressSanitizer, mais est basé sur une assistance matérielle partielle et fournit une protection probabiliste pour utiliser moins de RAM au moment de l'exécution. Hardware-assisted AddressSanitizer n'est pas prêt à être utilisé en production pour l'espace utilisateur, et est fourni principalement pour la compilation du noyau Linux. Pour utiliser cet assainisseur, les arguments de la ligne de commande sont :

  • -fsanitize=hwaddress pour instrumenter le code de l'espace utilisateur ;
  • -fsanitize=kernel-hwaddress pour instrumenter le code du noyau.

Informations de débogage DWARF

L'équipe a annoncé que, pour les cibles qui produisent des informations de débogage DWARF, GCC utilise maintenant par défaut la version 5 de DWARF (à l'exception de VxWorks et Darwin/Mac OS X qui utilisent par défaut la version 2 et AIX qui utilise par défaut la version 4). Cela peut produire des informations de débogage jusqu'à 25 % plus compactes par rapport aux versions précédentes. Pour profiter pleinement de la version 5 de DWARF, GCC doit être compilé avec binutils version 2.35.2 ou supérieure.

Lorsque GCC est compilé avec des versions antérieures de binutils, GCC émettra toujours la version 5 de DWARF pour la plupart des données de débogage, mais générera les tables de lignes de débogage de la version 4 (même si on lui a explicitement donné -gdwarf-5). Les consommateurs d'informations de débogage suivants peuvent traiter DWARF version 5 :

  • GDB 8.0, ou plus ;
  • valgrind 3.17.0 ;
  • elfutils 0.172, ou supérieur (pour une utilisation avec systemtap, dwarves/pahole, perf et libabigail) ;
  • dwz 0.14.

Nouvelles options de ligne de commande

  • -fbit-tests, activé par défaut, peut être utilisé pour activer ou désactiver l'expansion des commutateurs en utilisant des tests de bits.

Améliorations de l'optimisation du temps de liaison

  • le format du bytecode LTO a été optimisé pour des fichiers objet plus petits et un streaming plus rapide ;
  • l'allocation de mémoire de l'étape de liaison a été améliorée pour réduire les pics d'utilisation de la mémoire.

Améliorations de l'optimisation par profil

  • l'utilisation de -fprofile-values a été améliorée en suivant plus de valeurs cibles pour les appels indirects, par exemple ;
  • le format de fichier de données GCOV produit des fichiers plus petits en représentant les compteurs zéro d'une manière plus compacte.

Nouveaux langages et améliorations spécifiques aux langages

  • GCC 11 ajoute la prise en charge des nids de boucles non rectangulaires dans les constructions OpenMP et les routines d'allocation d'OpenMP 5.0, y compris la prise en charge de la clause d'allocation initiale en C/C++. La variable d'environnement OMP_TARGET_OFFLOAD et les routines active-levels sont maintenant supportées ;
  • pour C/C++, le support de declare variant et map a été étendu ;
  • pour Fortran, OpenMP 4.5 est maintenant entièrement supporté et le support d'OpenMP 5.0 a été étendu, incluant les fonctionnalités suivantes qui étaient auparavant uniquement disponibles en C et C++ : order(concurrent), device_type, memorder-clauses pour flush, lastprivate avec modificateur conditionnel, etc. ;
  • la version 2.6 de la spécification OpenACC continue d'être maintenue et améliorée dans les compilateurs C, C++ et Fortran.

Famille C

Nouveaux attributs

  • l'attribut no_stack_protector a été ajouté pour marquer les fonctions qui ne doivent pas être instrumentées avec une protection de la pile (-fstack-protector).
  • l'attribut malloc existant a été étendu afin de pouvoir être utilisé pour identifier les paires d'API allocateur/désallocateur.

Nouveaux avertissements

  • Wmismatched-dealloc, activé par défaut, avertit des appels aux fonctions de désallocation avec des pointeurs retournés par des fonctions d'allocation non concordantes ;
  • Wsizeof-array-div, activé par -Wall, prévient des divisions de deux opérateurs sizeof lorsque le premier est appliqué à un tableau et que le diviseur n'est pas égal à la taille de l'élément du tableau ;
  • Wstringop-overread, activé par défaut, prévient des appels aux fonctions de chaîne de caractères lisant au-delà de la fin des tableaux qui leur sont passés comme arguments. Dans les versions précédentes de GCC, la plupart des cas de cet avertissement sont diagnostiqués par -Wstringop-overflow ;
  • Wtsan, activé par défaut, prévient des fonctionnalités non supportées dans ThreadSanitizer (actuellement std::atomic_thread_fence).

Améliorations aux avertissements existants

  • Wfree-nonheap-object détecte beaucoup plus de cas d'appels à des fonctions de désallocation avec des pointeurs non retournés par une fonction d'allocation de mémoire dynamique ;
  • Wmaybe-uninitialized diagnostique le passage de pointeurs ou de références à de la mémoire non initialisée à des fonctions prenant des arguments qualifiés de const ;
  • Wuninitialized détecte les lectures de mémoire non initialisée allouée dynamiquement.

C

Nouvelles fonctionnalités

Plusieurs nouvelles fonctionnalités de la prochaine révision C2X du standard ISO C sont supportées avec -std=c2x et -std=gnu2x. Certaines de ces fonctionnalités sont également supportées en tant qu'extensions lors de la compilation pour des versions de langage plus anciennes. En plus des fonctionnalités listées, certaines fonctionnalités précédemment supportées comme extensions et maintenant ajoutées au standard C sont activées par défaut en mode C2X et non diagnostiquées avec -std=c2x -Wpedantic.

  • les macros BOOL_MAX et BOOL_WIDTH sont fournies dans <limits.h> ;
  • comme en C++, les définitions de fonction n'ont plus besoin de donner des noms pour les paramètres de fonction inutilisés ;
  • les expansions des macros true et false dans <stdbool.h> ont été modifiées afin qu'elles aient le type bool ;
  • l'attribut standard [[nodiscard]] est maintenant supporté ;
  • l'opérateur de préprocesseur __has_c_attribute est maintenant supporté ;
  • les macros INFINITY, NAN, FLT_SNAN, DBL_SNAN, LDBL_SNAN, DEC_INFINITY, DEC_NAN, et les macros de signalisation NaN correspondantes pour les types _FloatN, _FloatNx et _DecimalN, sont fournies dans <float.h>. Il existe également des fonctions intégrées correspondantes __builtin_nansdN pour les NaN de signalisation décimaux ;
  • les macros FLT_IS_IEC_60559, DBL_IS_IEC_60559 et LDBL_IS_IEC_60559 sont fournies dans <float.h> ;
  • la macro de test de fonctionnalité __STDC_WANT_IEC_60559_EXT__ est supportée par <float.h> ;
  • les étiquettes peuvent apparaître avant les déclarations et à la fin d'une instruction composée.

Nouveaux avertissements

  • Warray-parameter, activé par -Wall, avertit des redéclarations de fonctions avec des arguments de tableaux ordinaires déclarés en utilisant des formes incohérentes. L'avertissement permet également de détecter les accès hors limites probables dans les appels à de telles fonctions avec des tableaux plus petits ;
  • Wvla-parameter, activé par -Wall, avertit des redéclarations de fonctions avec des arguments de tableaux de longueur variable déclarés en utilisant des formes incohérentes ou avec des limites non concordantes. L'avertissement permet également de détecter les accès hors limites probables dans les appels à de telles fonctions avec des tableaux plus petits.

C++

Le mode par défaut a été changé en -std=gnu++17 et plusieurs fonctionnalités de C++ 20 ont été implémentées :
  • le compilateur supporte maintenant les fonctions virtuelles consteval ;
  • correction du CTAD pour les agrégats ;
  • les pseudo-destructeurs mettent fin à la durée de vie des objets ;
  • correction de la formulation de l'initialisation d'agrégat entre parenthèses ;
  • déduction de la taille des tableaux dans les nouvelles expressions ;
  • utilisation des enum.

Fonctionnalités du C++ 23

Le compilateur C++ a un support expérimental pour certaines des futures fonctionnalités du projet C++ 23 avec les drapeaux -std=c++23, -std=gnu++23, -std=c++2b ou -std=gnu++2b, incluant :

  • Literal Suffix for (signed) size_t ;
  • Make() more optional for lambdas.

Rapports de défauts C++

Plusieurs rapports de défauts C++ ont été résolus, par exemple :

  • utilisation de auto comme template-argument ;
  • comparaison entre pointeurs et conversions de qualification
  • attributs standard en double ;
  • arguments de modèle par défaut des modèles de variables ;
  • unicité des noms de déclaration de décomposition ;
  • ordre partiel et héritage variadique récursif ;
  • ordre entre contraintes et substitution ;
  • liste d'initialisation entre parenthèses comme argument de modèle.

Nouveaux avertissements

  • Wctad-maybe-unsupported, désactivé par défaut, avertit de l'exécution d'une déduction d'argument de modèle de classe sur un type sans guide de déduction ;
  • Wrange-loop-construct, activé par -Wall, prévient lorsqu'un for-loop basé sur l'intervalle crée des copies inutiles et coûteuses ;
  • Wdeprecated-enum-enum-conversion, activé par défaut en C++20, avertit des conversions arithmétiques dépréciées sur les opérandes des types énumération ;
  • Wdeprecated-enum-float-conversion, activé par défaut en C++20, signale les conversions arithmétiques dépréciées sur des opérandes dont l'un est de type énumération et l'autre de type virgule flottante ;
  • Wmismatched-new-delete, activé par -Wall, avertit des appels à l'opérateur C++ delete avec des pointeurs renvoyés par des formes non concordantes de l'opérateur new ou par d'autres fonctions d'allocation non concordantes ;
  • Wvexing-parse, activé par défaut, avertit sur la règle d'analyse la plus contrariante : les cas où une déclaration ressemble à une définition de variable, mais le langage C++ exige qu'elle soit interprétée comme une déclaration de fonction.

Nouvelles cibles et améliorations spécifiques aux cibles

AArch64 & arm

Un certain nombre de nouveaux processeurs sont prise en charge par des arguments aux options -mcpu et -mtune dans les backends arm et aarch64 (identifiants GCC entre parenthèses) :

  • 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) ;
  • Arm Neoverse N2 (neoverse-n2) ;
  • GCC peut désormais autovectoriser les opérations d'addition, de soustraction, de multiplication et les variantes d'accumulation/soustraction sur les nombres complexes, en tirant parti des instructions SIMD avancées des jeux d'instructions Armv8.3-a (AArch64/AArch32), SVE (AArch64), SVE2 (AArch64) et MVE (AArch32 M-profile).

AArch64

  • en plus de ce qui précède, les processeurs AArch64 suivants sont maintenant pris en charge : Fujitsu A64FX (a64fx) et Arm Cortex-R82 (cortex-r82).
  • l'architecture AArch64 Armv8-R est maintenant supportée par l'option -march=armv8-r ;
  • l'atténuation de la vulnérabilité Straight-line Speculation est prise en charge par l'option -mharden-sls= ;
  • la disponibilité des intrinsèques SIMD avancés disponibles via l'en-tête arm_neon.h est améliorée et GCC 11 prend en charge l'ensemble complet des intrinsèques définis par ACLE Q3 2020.

Arm

  • l'autovectorisation initiale est maintenant disponible lorsque l'on cible le jeu d'instructions MVE ;
  • GCC peut maintenant utiliser l'instruction Low Overhead Branch dans Armv8.1-M pour optimiser les compteurs de boucles et les vérifications ;
  • l'option -mcpu=cortex-m55 supporte maintenant les extensions +nomve et +nomve.fp pour contrôler la génération des instructions à virgule flottante MVE et MVE.

IA-32/x86-64

  • un nouveau support d'extension ISA pour Intel TSXLDTRK a été ajouté à GCC. Les intrinsèques de TSXLDTRK sont disponibles via le commutateur de compilation -mtsxldtrk ;
  • un nouveau support d'extension ISA pour Intel SERIALIZE a été ajouté à GCC. Les intrinsèques de SERIALIZE sont disponibles via le commutateur de compilation -mserialize ;
  • un nouveau support d'extension ISA pour Intel HRESET a été ajouté à GCC. Les intrinsèques HRESET sont disponibles via le commutateur de compilation -mhreset ;
  • un nouveau support d'extension ISA pour Intel UINTR a été ajouté à GCC. Les intrinsèques de UINTR sont disponibles via le commutateur de compilation -muintr ;
  • un nouveau support d'extension ISA pour Intel KEYLOCKER a été ajouté à GCC. Les intrinsèques de KEYLOCKER sont disponibles via le commutateur de compilation -mkeylocker.
  • un nouveau support d'extension ISA pour Intel AMX-TILE, AMX-INT8, AMX-BF16 a été ajouté à GCC. Les intrinsèques AMX-TILE, AMX-INT8, AMX-BF16 sont disponibles via les commutateurs de compilation -mamx-tile, -mamx-int8, -mamx-bf16.
  • un nouveau support d'extension ISA pour Intel AVX-VNNI a été ajouté à GCC. Les intrinsèques AVX-VNNI sont disponibles via le commutateur de compilation -mavxvnni ;
  • GCC supporte maintenant le CPU Intel nommé Sapphire Rapids via -march=sapphirerapids. Ce commutateur active les extensions ISA MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, ENQCMD, CLDEMOTE, SERIALIZE, PTWRITE, WAITPKG, TSXLDTRK, AMT-TILE, AMX-INT8, AMX-BF16 et AVX-VNNI ;
  • GCC supporte maintenant le CPU Intel nommé Alderlake à travers -march=alderlake. Ce commutateur active les extensions ISA CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, KEYLOCKER, AVX-VNNI et HRESET ;
  • GCC supporte maintenant le CPU Intel nommé Rocketlake à travers -march=rocketlake. Rocket Lake est basé sur le client Icelake et moins SGX ;
  • GCC supporte maintenant les CPU AMD basés sur le noyau znver3 via -march=znver3 ;
  • GCC supporte maintenant les niveaux de microarchitecture définis dans le psABI x86-64 via -march=x86-64-v2, -march=x86-64-v3 et -march=x86-64-v4.

RISC-V

  • support d'address sanitizer pour RISC-V ;
  • support de big-endian pour RISC-V ;
  • implémentation d'un nouveau style de macros de test d'extension d'architecture, chaque extension d'architecture a une macro de test de fonctionnalité correspondante, qui peut être utilisée pour tester son existence et les informations de version ;
  • les anciennes macros de test des extensions d'architecture, comme __riscv_atomic, sont dépréciées, mais elles seront encore supportées pendant au moins deux cycles de publication ;
  • support de IFUNC pour riscv*-*-linux* ;
  • ajout d'une nouvelle option -misa-spec=* pour contrôler la version des spécifications ISA et la valeur par défaut est 2.2. Cette option pourrait contrôler la version par défaut de chaque extension ;
  • introduction de l'option --with-multilib-generator pour configurer l'option time. Cette option permet une configuration flexible des paramètres multilib. La syntaxe est la même que celle de multilib-generator de RISC-V ;
  • support de __builtin_thread_pointer pour RISC-V ;
  • introduction de l'optimisation shorten_memrefs, qui pourrait réduire la taille du code pour l'accès à la mémoire.


Source : GCC 11.1, Notes de version GCC 11.1

Et vous ?

Que pensez-vous des fonctionnalités de GCC 11.1 ?

Voir aussi

La version 9.1 du compilateur GCC est disponible et prend en charge le C++17, plusieurs autres fonctionnalités sont ajoutées

GCC 8.2 est disponible, cette mise à jour du compilateur libre corrige une centaine de bogues

GCC 8.1 est disponible, la nouvelle version majeure du compilateur libre vient avec un support expérimental de C++2a et d'autres fonctionnalités

GCC 9 sera la première version stable du compilateur à supporter le langage D, un nouveau frontend allonge la liste