GNU Compiler Collection 10.1 apporte un meilleur support de C++20
ainsi que le support des spécifications OpenACC 2.6 et OpenMP 5.0
Le GNU Compiler Collection (GCC), l’ensemble des compilateurs créés par le projet GNU, passe en version GCC 10.1. Il y a quelques heures, Jakub Jelinek l’a annoncé sur la liste de diffusion du projet : « Aujourd'hui, nous sommes heureux d'annoncer une autre version majeure de GCC, la 10.1.
« Cette version fait de grands progrès dans la prise en charge du langage C ++ 20, à la fois côté compilateur et côté bibliothèque, apporte quelques améliorations C2X, diverses améliorations d'optimisation et de corrections de bogues, plusieurs nouvelles modifications et améliorations de l'activation matérielle des serveurs principaux du compilateur et de nombreuses autres modifications. Il existe même une nouvelle passe d'analyse statique expérimentale.
« Certains codes qui ont été compilés avec succès avec les anciennes versions de GCC peuvent nécessiter des modifications de source ».
Voici donc une liste, par catégories, de certaines améliorations/modifications/nouveautés apportées par cette version.
Améliorations générales
- Nouvelles fonctions intégrées:
- L'opérateur de préprocesseur intégré __has_builtin peut être utilisé pour interroger la prise en charge des fonctions intégrées fournies par GCC et d'autres compilateurs qui la prennent en charge.
- __builtin_roundeven pour la fonction correspondante de ISO / IEC TS 18661.
- Nouvelles options de ligne de commande:
- -fallocation-dce supprime les paires inutiles d'opérateurs nouveaux et supprimés.
- -fprofile-partial-training peut maintenant être utilisé pour informer le compilateur que les chemins de code non couverts par l'exécution de la formation ne doivent pas être optimisés pour la taille.
- -fprofile-reproductible contrôle le niveau de reproductibilité du profil collecté par -fprofile-generate. Cela permet de reconstruire un programme avec le même résultat, ce qui est utile, par exemple, pour les packages de distribution.
- -fprofile-prefix-path peut être utilisé en combinaison avec -fprofile-generate=profile_dir et -fprofile-use=profile_dir pour informer GCC où se trouve le répertoire de base de l'arborescence des sources de génération au cas où il diffère entre l'instrumentation et les générations optimisées.
- -fanalyzer permet une nouvelle passe d'analyse statique et les avertissements associés. Cette passe effectue une exploration fastidieuse des chemins à travers le code dans l'espoir de détecter diverses erreurs courantes, telles que des bogues à double libération. Cette option doit être considérée comme expérimentale dans cette version. En particulier, l'analyse du code non-C ne fonctionnera probablement pas.
- Améliorations de l'optimisation inter-procédurale:
- Le passage inter-procédural de remplacement scalaire d'agrégats (IPA-SRA) a été réimplémenté pour fonctionner au moment de la liaison et peut désormais également supprimer le calcul et renvoyer les valeurs de retour inutilisées.
- -finline-functions est désormais activé à -O2 et a été réajusté pour une meilleure taille de code par rapport aux compromis de performances d'exécution. L'heuristique inliner a également été considérablement accélérée pour éviter un impact négatif sur les temps de compilation de -flto -O2.
- Le clonage de fonction peut désormais utiliser des informations de plage de valeurs pour prédire l'efficacité des transformations individuelles.
- Pendant l'optimisation du temps de liaison, la règle de définition C ++ One est utilisée pour augmenter la précision de l'analyse d'alias basée sur le type.
- Améliorations de l'optimisation du temps de liaison:
- Un nouveau lto-dump binaire a été ajouté. Le programme peut exporter diverses informations sur un fichier objet de bytecode LTO.
- La phase parallèle du LTO peut détecter automatiquement le serveur de travaux d'une marque en cours d'exécution ou peut revenir au nombre de cœurs disponibles.
- Le bytecode LTO peut être compressé avec l'algorithme zstd. Le script de configuration peut détecter automatiquement la prise en charge de zstd.
- La plupart des valeurs --param peuvent maintenant être spécifiées à la granularité de l'unité de traduction. Cela inclut tous les paramètres contrôlant l'inliner et d'autres optimisations inter-procédurales. Contrairement aux versions antérieures, GCC 10 ignorera les paramètres contrôlant les optimisations spécifiées au moment de la liaison et appliquera les paramètres spécifiés au moment de la compilation de la même manière que pour les indicateurs d'optimisation.
- Améliorations de l'optimisation par profil:
- La maintenance des profils lors de la compilation et du partitionnement de code chaud / froid a été améliorée.
- En utilisant -fprofile-values, un binaire instrumenté peut suivre plusieurs valeurs (jusqu'à 4), par exemple appels indirects et fournir des informations de profil plus précises.
Améliorations spécifiques aux langages
Famille C
- Nouveaux attributs:
- La fonction access et l'attribut type ont été ajoutés pour décrire comment une fonction accède aux objets qui lui sont passés par pointeur ou référence, et pour associer ces arguments à des arguments entiers indiquant la taille des objets. L'attribut est utilisé pour permettre la détection des accès non valides par des fonctions définies par l'utilisateur, telles que celles diagnostiquées par -Wstringop-overflow.
- L'attribut symver peut être utilisé pour lier des symboles à des nœuds de version spécifiques sur les plateformes ELF. Ceci est préférable à l'utilisation d'un assemblage en ligne avec GNU comme directive symver car cette dernière n'est pas compatible avec les optimisations de temps de liaison.
- Nouveaux avertissements:
- -Wstring-compare, activé par -Wextra, met en garde contre les expressions d'égalité et d'inégalité entre zéro et le résultat d'un appel à strcmp.
- -Wzero-length-bounds, activé par -Warray-bounds, met en garde contre les accès à des éléments de tableaux de longueur nulle qui pourraient chevaucher d'autres membres du même objet.
- Améliorations des avertissements existants:
- -Warray-bounds détecte plus d'accès hors limites aux tableaux membres ainsi que les accès aux éléments des tableaux de longueur nulle.
- -Wformat-overflow utilise pleinement les informations de longueur de chaîne calculées par la passe d'optimisation strlen.
- -Wrestrict détecte les accès qui se chevauchent aux objets alloués dynamiquement.
- -Wreturn-local-addr diagnostique plus d'instances d'instructions de retour renvoyant des adresses de variables automatiques.
- -Wstringop-overflow détecte plus de magasins hors limites dans les tableaux membres, y compris les tableaux de longueur nulle, les objets alloués dynamiquement et les tableaux de longueur variable, ainsi que plus d'instances de lectures de tableaux de caractères non terminés par des fonctions intégrées de chaîne. L'avertissement détecte également les accès hors limites par des appels à des fonctions définies par l'utilisateur déclarées avec le nouvel accès d'attribut.
- Les caractères étendus dans les identificateurs peuvent désormais être spécifiés directement dans l'encodage d'entrée (UTF-8, par défaut), en plus de la syntaxe UCN (\uNNNN ou \UNNNNNNNN) déjà prise en charge:
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 static const int π = 3; int get_naïve_pi() { return π; }
Fortran
- use_device_addr de la version 5.0 de la spécification OpenMP est désormais pris en charge. Notez que sinon OpenMP 4.5 est partiellement pris en charge dans le compilateur Fortran; le plus grand élément manquant est le mappage des éléments de structure.
- La taille de la mémoire tampon par défaut pour les E / S utilisant des fichiers non formatés a été augmentée à 1048576. La taille de la mémoire tampon pour peut désormais être définie au moment de l'exécution via les variables d'environnement GFORTRAN_FORMATTED_BUFFER_SIZE et GFORTRAN_UNFORMATTED_BUFFER_SIZE pour les fichiers formatés et non formatés, respectivement.
- Les incompatibilités entre les listes d'arguments réelles et factices dans un seul fichier sont désormais rejetées avec une erreur. Utilisez la nouvelle option -fallow-argument-mismatch pour transformer ces erreurs en avertissements; cette option est implicite avec -std=legacy. -Wargument-mismatch a été supprimée.
- Le traitement d'une constante littérale BOZ a été retravaillé pour assurer une meilleure conformité aux normes Fortran 2008 et 2018. Dans ces normes Fortran, une constante littérale BOZ est une entité sans type et sans genre. Dans le cadre de la refonte, les extensions documentées et non documentées de la norme Fortran émettent désormais des erreurs lors de la compilation. Certaines de ces extensions sont autorisées avec le -fallow-invalid-boz, où l'erreur est dégradée en avertissement et le code est compilé comme avec l'ancien gfortran.
- À n'importe quel niveau d'optimisation à l'exception de -Os, gfortran utilise désormais le remplissage en ligne pour les arguments au lieu d'appeler une routine de bibliothèque. Si la source contient un grand nombre d'arguments qui doivent être reconditionnés, la taille du code ou le temps de compilation peut devenir excessif. Si tel est le cas, -fno-inline-arg-packing peut être utilisé pour désactiver la compression d'arguments en ligne.
Source : annonce GNU
Partager