Sortie de la suite de compilateurs GCC 9

Après un an de développement publié sortie d'un ensemble gratuit de compilateurs GCC 9.1, la première version majeure de la nouvelle branche GCC 9.x. Conformément à nouveau schéma numéros de version, la version 9.0 a été utilisée dans le processus de développement et peu de temps avant la sortie de GCC 9.1, la branche GCC 10.0 avait déjà bifurqué, sur la base de laquelle la prochaine version importante, GCC 10.1, serait formée.

GCC 9.1 se distingue par la stabilisation du support du standard C++17, la poursuite de la mise en œuvre des capacités du futur standard C++20 (nom de code C++2a), l'inclusion dans l'interface du langage D et le support partiel d'OpenMP 5.0. , prise en charge presque complète d'OpenACC 2.5, augmentation de l'évolutivité des optimisations interprocédurales et des optimisations au stade de la liaison, expansion des outils de diagnostic et ajout de nouveaux avertissements, backends pour OpenRISC, C-SKY V2 et AMD GCN GPU.

principal changements:

  • Ajout de la prise en charge du langage de programmation D. GCC inclut une interface avec un compilateur GDC (Gnu D Compiler) et des bibliothèques d'exécution (libphobos), qui vous permettent d'utiliser le standard GCC pour créer des programmes dans le langage de programmation D. Le processus d'activation de la prise en charge du langage D dans GCC commencé en 2011, mais traîné en raison de la nécessité de mettre le code en conformité avec les exigences du CCG et des problèmes de transfert des droits de propriété intellectuelle à Digital Mars, qui développe le langage de programmation D ;
  • Des améliorations ont été apportées au générateur de code. Par exemple, l'utilisation de différentes stratégies pour développer les expressions Switch (table de sauts, test de bits, arbre de décision) en fonction des situations a été implémentée. Ajout de la possibilité de transformer des fonctions linéaires qui incluent une expression Switch à l'aide de l'optimisation « -ftree-switch-conversion » (par exemple, un ensemble de conditions telles que « cas 2 : comment = 205 ; pause ; cas 3 : comment = 305 ; pause ; » sera converti en « 100 * comment + 5 » ;
  • Optimisations interprocédurales améliorées. Les paramètres de déploiement en ligne ont été adaptés aux bases de code C++ modernes et étendus avec de nouveaux paramètres max-inline-insns-small, max-inline-insns-size, uninline-function-insns, uninline-function-time, uninline-thunk-insns et uninlined. -le temps de la réflexion. Amélioration de la précision et de l’agressivité de la séparation des codes froid/chaud. Évolutivité améliorée pour les très grandes unités de traduction (par exemple, lors de l'application de l'optimisation au stade de la liaison avec de grands programmes) ;
  • Le mécanisme d'optimisation basé sur les résultats du profilage de code (PGO - Profile-guided optimisation) a été amélioré, ce qui génère un code plus optimal basé sur une analyse des caractéristiques d'exécution du code. Option récapitulative "-fprofil-utilisation" inclut désormais les modes d'optimisation "-fversion-loops-for-strides", "-floop-interchange", "-floop-unroll-and-jam" et "-ftree-loop-distribution". Suppression de l'inclusion d'histogrammes avec compteurs dans les fichiers, ce qui réduisait la taille des fichiers avec profils (les histogrammes sont désormais générés à la volée lors des optimisations lors de la liaison) ;
  • Optimisations améliorées du temps de liaison (LTO). Une simplification des types a été apportée avant de générer le résultat, ce qui a permis de réduire considérablement la taille des fichiers objets LTO, de réduire la consommation mémoire au stade de la liaison et d'améliorer la parallélisation des opérations. Le nombre de partitions (-param lto-partitions) a été augmenté de 32 à 128, ce qui améliore les performances sur les systèmes dotés d'un grand nombre de threads CPU. Un paramètre a été ajouté pour contrôler le nombre de processus d'optimisation
    "-param lto-max-streaming-parallélisme" ;

    En conséquence, par rapport à GCC 8.3, les optimisations introduites dans GCC 9 permis réduisez le temps de compilation de Firefox 5 et LibreOffice 66 d'environ 6.2.3%. La taille des fichiers objets a diminué de 7 %. Le temps de liaison sur un processeur à 8 cœurs a diminué de 11 %. L'étape d'optimisation séquentielle de l'étape de liaison est désormais 28 % plus rapide et consomme 20 % de mémoire en moins. La consommation de mémoire de chaque processeur de l'étage parallélisé du LTO a diminué de 30 % ;

  • La plupart des spécifications de programmation parallèle sont implémentées pour les langages C, C++ et Fortran. OpenACC 2.5, qui définit des outils de déchargement des opérations sur les GPU et les processeurs spécialisés tels que NVIDIA PTX ;
  • Un support partiel du standard a été implémenté pour C et C++ Ouvrez MP 5.0 (Open Multi-Processing), qui définit l'API et les méthodes d'application des méthodes de programmation parallèle pour les langages C, C++ et Fortran sur les systèmes multicœurs et hybrides (CPU+GPU/DSP) à mémoire partagée et unités de vectorisation (SIMD) ;
  • De nouveaux avertissements ont été ajoutés pour le langage C : "-Adresse-du-membre emballé" (valeur de pointeur non alignée vers un membre compressé d'une structure ou d'une union) et
    «-Wabsolute-value" (lors de l'accès aux fonctions de calcul d'une valeur absolue, s'il existe une fonction plus appropriée pour l'argument spécifié, par exemple, fabs(3.14) doit être utilisé à la place de abs(3.14). Nouveaux avertissements ajoutés pour C++ : "-Wdeprecated-copy",
    "-Winit-list-lifetime", "-Wredundant-move", "-Wpessimizing-move" et "-Wclass-conversion". De nombreux avertissements précédemment disponibles ont été étendus ;

  • Ajout du support expérimental pour une partie du futur standard du langage C, nom de code C2x. Pour activer la prise en charge de C2x, utilisez les options "-std=c2x" et "-std=gnu2x" (pour activer les extensions GNU). La norme en est encore à un stade précoce de développement, par conséquent, parmi ses capacités, seule l'expression _Static_assert avec un argument est prise en charge (_Static_assert avec deux arguments est standardisée en C11) ;
  • La prise en charge du standard C++17 a été déclarée stable. Dans le frontend, les capacités du langage C++17 sont entièrement implémentées, et dans libstdc++, les fonctions de bibliothèque définies dans la norme sont proches d'une implémentation complète ;
  • A continué mise en oeuvre éléments du futur standard C++2a. Par exemple, la possibilité d'inclure des plages lors de l'initialisation a été ajoutée, des extensions pour les expressions lambda ont été implémentées, la prise en charge des membres vides des structures de données et des attributs probables/improbables a été ajoutée, la possibilité d'appeler des fonctions virtuelles dans des expressions conditionnelles a été fournie. , etc.
    Pour activer la prise en charge de C++2a, utilisez les options "-std=c++2a" et "-std=gnu++2a". Ajout de fichiers d'en-tête de bits et de version à libstdc++ pour C++2a, std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible et std::type_identity traits, std::midpoint, std::lerp fonctions , std :: bind_front,
    std::visit, std::is_constant_evaluated et std::assume_aligned, ajout de la prise en charge du type char8_t, implémentation de la possibilité de vérifier le préfixe et le suffixe des chaînes (starts_with, ends_with) ;

  • Ajout de la prise en charge des nouveaux processeurs ARM
    Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE et Neoverse N1. Ajout de la prise en charge des instructions introduites dans Armv8.3-A pour travailler avec des nombres complexes, de la génération de nombres pseudo-aléatoires (rng) et du marquage de mémoire (memtag), ainsi que des instructions pour bloquer les attaques liées à l'exécution spéculative et au fonctionnement de l'unité de prédiction de branche. . Pour l'architecture AArch64, un mode de protection a été ajouté intersections de pile et de tas (« -fstack-clash-protection »). Pour utiliser les fonctionnalités de l'architecture Armv8.5-A, l'option « -march=armv8.5-a » a été ajoutée

  • Il comprend un backend pour générer du code pour les GPU AMD basés sur la microarchitecture GCN. L'implémentation se limite pour l'instant à la compilation d'applications monothread (le support pour réaliser des calculs multi-thread via OpenMP et OpenACC sera proposé ultérieurement) et au support des GPU Fiji et Vega 10 ;
  • Ajout d'un nouveau backend pour les processeurs OuvertRISC;
  • Backend ajouté pour les processeurs C-SKY V2, produit par la société chinoise du même nom pour divers appareils grand public ;
  • Toutes les options de ligne de commande qui exploitent les valeurs d'octets prennent en charge les suffixes kb, KiB, MB, MiB, GB et GiB ;
  • Mis en œuvre l'option «-flive-patching=[inline-only-static|inline-clone]» vous permet d'obtenir une compilation sécurisée pour les systèmes de mise à jour en direct grâce au contrôle à plusieurs niveaux sur l'utilisation de l'interprocédure (IPA) optimisations ;
  • Ajout de l'option "--completion" pour un contrôle précis de l'achèvement des options lors de l'utilisation de bash ;
  • Les outils de diagnostic fournissent des affichages d'extraits de texte source indiquant le numéro de ligne et marquant visuellement les informations associées, telles que les types d'opérandes. Pour désactiver l'affichage des numéros de ligne et des étiquettes, les options « -fno-diagnostics-show-line-numbers » et « -fno-diagnostics-show-labels » sont fournies ;

    Sortie de la suite de compilateurs GCC 9

  • Étendu des outils de diagnostic des erreurs dans le code C++, une meilleure lisibilité des informations sur les causes des erreurs et la mise en évidence des paramètres problématiques ;

    Sortie de la suite de compilateurs GCC 9

  • Ajout de l'option « -fdiagnostics-format=json », qui permet de générer une sortie de diagnostic dans un format lisible par machine (JSON) ;
  • Ajout de nouvelles options de profilage « -fprofile-filter-files » et « -fprofile-exclude-files » pour sélectionner les fichiers source à traiter ;
  • AddressSanitizer permet de générer un code de vérification plus compact pour les variables automatiques, ce qui réduit la consommation de mémoire du fichier exécutable en cours de vérification ;
  • Sortie améliorée dans "-fopt-info» (informations détaillées sur les optimisations ajoutées). Ajout de nouveaux préfixes « optimisé » et « manqué », en plus du préfixe « note » précédemment disponible. Ajout de la sortie d'informations sur la prise de décision sur le déroulement en ligne et la vectorisation des cycles ;
  • Ajout de l'option « -fsave-optimization-record », lorsqu'elle est spécifiée, GCC enregistre le fichier SRCFILE.opt-record.json.gz avec une description des décisions sur l'utilisation de certaines optimisations. La nouvelle option diffère du mode « -fopt-info » en incluant des métadonnées supplémentaires, telles que des informations sur le profil et les chaînes en ligne ;
  • Ajout des options « -fipa-stack-alignment » et « -fipa-reference-addressable » pour contrôler l'alignement de la pile et l'utilisation de modes d'adressage (écriture seule ou lecture exacte) pour les variables statiques lors des optimisations interprocédurales ;
  • De nouvelles fonctions intégrées sont introduites pour contrôler la liaison d'attributs ainsi que le comportement lié à la prédiction de branchement et à l'exécution d'instructions spéculatives : "__builtin_has_attribute«,«__builtin_expect_with_probability" Et "__builtin_speculation_safe_value". Un nouvel attribut a été ajouté pour les fonctions, variables et types copier;
  • La prise en charge complète des entrées/sorties asynchrones a été implémentée pour le langage Fortran ;
  • La prise en charge des plates-formes Solaris 10 (*-*-solaris2.10) et Cell/BE (Cell Broadband Engine SPU) est obsolète et sera supprimée dans la prochaine version majeure. La prise en charge des architectures Armv2, Armv3, Armv5 et Armv5E a été interrompue. La prise en charge d'Intel MPX (Memory Protection Extensions) a été interrompue.

Source: opennet.ru

Ajouter un commentaire