Sortie de la suite de compilateurs GCC 10

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

GCC 10.1 se distingue par l'implémentation de nombreuses innovations dans le langage C++ développé pour le standard C++20, des améliorations liées au futur standard du langage C (C2x), de nouvelles optimisations dans les backends du compilateur et un support expérimental. mode d'analyse statique. De plus, lors de la préparation d'une nouvelle branche, le projet a transféré le référentiel de SVN vers Git.

principal changements:

  • Добавлен mode expérimental d'analyse statique "-fanalyseur», qui effectue une analyse interprocédurale gourmande en ressources des chemins d’exécution de code et des flux de données dans un programme. Le mode est capable de détecter des problèmes au stade de la compilation, tels que des doubles appels à la fonction free() pour une zone mémoire, des fuites de descripteurs de fichiers, le déréférencement et le passage de pointeurs nuls, l'accès à des blocs de mémoire libérés, l'utilisation de valeurs non initialisées, etc. L'utilisation du nouveau mode pour le code OpenSSL a déjà permis d'identifier vulnérabilité dangereuse.
  • Optimisations interprocédurales améliorées. La passe IPA-SRA (Interprocedural Scalar Shared Remplacement) a été repensée pour fonctionner au moment de la liaison et, entre autres choses, supprime désormais les valeurs inutilisées calculées et renvoyées. Dans le mode d'optimisation "-O2", l'option "-finline-functions" est activée, qui est réajustée pour privilégier un code plus compact par rapport aux performances d'exécution. Le travail de l'heuristique pour le déploiement de fonctions en ligne a été accéléré. Les heuristiques d’expansion en ligne et de clonage de fonctions peuvent désormais utiliser des informations sur les plages de valeurs pour prédire l’efficacité des transformations individuelles. Pour C++, la précision de l’analyse des alias basée sur le type a été améliorée.
  • Optimisations améliorées du temps de liaison (LTO). Ajout d'un nouvel exécutable lto-dump pour réinitialiser les informations sur les fichiers objets avec le bytecode LTO. Les passes LTO parallèles déterminent automatiquement le nombre de tâches de création exécutées simultanément et, si elles ne peuvent pas être déterminées, utilisent les informations sur le nombre de cœurs de processeur comme facteur de parallélisation. Ajout de la possibilité de compresser le bytecode LTO à l'aide de l'algorithme zstd.
  • 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. Amélioration de la maintenance des profils lors de la compilation et de la séparation du code chaud/froid. Via l'option "-fprofile-valeurs» peut désormais surveiller jusqu'à 4 valeurs de profil, par exemple pour les appels indirects et fournir des informations de profil plus précises.
  • Spécification de programmation parallèle implémentée pour les langages C, C++ et Fortran OpenACC 2.6, qui définit des outils de déchargement des opérations sur les GPU et les processeurs spécialisés tels que NVIDIA PTX. La mise en œuvre de la norme est presque terminée 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 sur les systèmes multicœurs et hybrides (CPU+GPU/DSP) à mémoire partagée et unités de vectorisation (SIMD). Ajout de fonctionnalités telles que les conditions lastprivate, les directives scan et loop, les expressions order et use_device_addr. Pour OpenMP et OpenACC, la prise en charge a été ajoutée pour les opérations de déchargement sur les GPU AMD Radeon (GCN) de quatrième génération (Fidji) et de cinquième génération (VEGA 10/VEGA 20).
  • Pour les langages de la famille C, la fonction « access » a été ajoutée pour décrire l'accès de la fonction aux objets passés par référence ou pointeur, et pour associer ces objets à des arguments entiers contenant des informations sur la taille des objets. Pour fonctionner en conjonction avec « access », l'attribut « type » est implémenté pour détecter un accès incorrect des fonctions utilisateur, par exemple lors de l'écriture de valeurs dans une zone en dehors des limites du tableau. L'attribut "symver" est également ajouté pour associer les symboles dans un fichier ELF à des numéros de version spécifiques.
  • Nouveaux avertissements ajoutés :
    • "-Wstring-compare" (activé avec "-Wextra") - avertit de la présence d'expressions dans lesquelles zéro est comparé au résultat de l'appel des fonctions strcmp et strncmp, ce qui équivaut à une constante du fait que la longueur d'un argument est supérieure à la taille du tableau du deuxième argument.
    • "-Wzero-length-bounds" (activé avec "-Warray-bounds") - avertit de l'accès à des éléments de tableau de longueur nulle, ce qui peut conduire à l'écrasement d'autres données.
    • Les avertissements « -Warray-bounds », « -Wformat-overflow », « -Wrestrict », « -Wreturn-local-addr » et « -Wstringop-overflow » ont été étendus pour augmenter le nombre de situations hors limites. qui sont manipulés.
  • Implémentation de la possibilité de spécifier directement des caractères larges dans les identifiants en utilisant le codage actuel (UTF-8 par défaut) plutôt que la notation UCN (\uNNNN ou \UNNNNNNNN). Par exemple:

    statique const int π = 3 ;
    int get_naïve_pi() {
    renvoyer π ;
    }

  • Pour le langage C, une partie des nouvelles fonctionnalités développées au sein du standard C2X ont été implémentées (activées en spécifiant -std=c2x et -std=gnu2x) : le support de la syntaxe « [[]] » est apparu pour définir les attributs comme dans C++ (par exemple, [[gnu ::const]], [[deprecated]], [[fallthrough]] et [[maybe_unused]]. Ajout de la prise en charge de la syntaxe "u8" pour définir des constantes avec des caractères UTF-8.
    Ajout de nouvelles macros à . Ajout des substitutions "%OB" et "%Ob" à strftime.

  • Le mode par défaut pour C est "-fno-common", qui permet un accès plus efficace aux variables globales sur certaines plateformes.
  • Pour le C++, environ 16 changements et innovations ont été implémentés, développés dans le standard C++20. Y compris le mot-clé ajouté « constinit »
    et la prise en charge des extensions de modèles a été implémentée "les concepts". Les concepts vous permettent de définir un ensemble d'exigences en matière de paramètres de modèle qui, au moment de la compilation, limitent l'ensemble d'arguments pouvant être acceptés en tant que paramètres de modèle. Les concepts peuvent être utilisés pour éviter les incohérences logiques entre les propriétés des types de données utilisés dans le modèle et les propriétés des types de données des paramètres d'entrée.

  • G++ permet de détecter un comportement non défini provoqué par la modification d'objets constants via constexpr. Consommation de mémoire réduite par le compilateur lors du calcul de constexpr. Ajout de nouveaux avertissements "-Wmismatched-tags" et "-Wredundant-tags".
  • De nouvelles options de ligne de commande ont été proposées :
    • "-fallocation-dce" pour supprimer les paires inutiles d'opérateurs "nouveau" et "supprimer".
    • "-fprofile-partial-training" pour désactiver l'optimisation de la taille pour le code qui n'a pas d'exécution de formation.
    • "-fprofile-reproductible pour contrôler le niveau de reproductibilité du profil.
    • "-fprofile-prefix-path" pour définir le répertoire de construction source de base utilisé pour la génération de profils séparés (pour "-fprofile-generate=profile_dir" et "-fprofile-use=profile_dir").
  • Dans le texte d'avertissement pour les options mentionnées, des hyperliens sont fournis qui vous permettent d'accéder à la documentation de ces options. La substitution d'URL est contrôlée à l'aide de l'option "-fdiagnostics-urls".
  • Opérateur de préprocesseur ajouté "__has_builtin", qui peut être utilisé pour vérifier les fonctions intégrées.
  • Ajout d'une nouvelle fonction intégrée "__builtin_roundeven" avec une implémentation de la fonction d'arrondi définie dans la spécification ISO/IEC TS 18661, similaire à "round", mais arrondissant une partie supérieure à 0.5 (à une valeur plus grande), inférieure à 0.5 - vers le bas (à zéro), et égal à 0.5 - à partir de la parité de l'avant-dernier chiffre.
  • Pour l'architecture AArch64, la prise en charge de l'extension SVE2 a été ajoutée et la prise en charge de SVE (Scalable Vector Extension) a été améliorée, y compris la prise en charge supplémentaire des fonctions et types SVE ACLE intégrés et l'utilisation de la vectorisation. La prise en charge de LSE (Large System Extensions) et TME (Transactional Memory Extension) a été étendue. Ajout de nouvelles instructions proposées dans Armv8.5-A et Armv8.6-A, y compris des instructions pour la génération de nombres aléatoires, l'arrondi, la liaison de balises mémoire,
    bfloat16 et multiplication matricielle. Prise en charge du processeur ajouté
    Bras Cortex-A77,
    Bras Cortex-A76AE,
    Bras Cortex-A65,
    Bras Cortex-A65AE,
    Bras Cortex-A34 et
    Marvell ThunderX3.

  • Ajout de la prise en charge d'ABI FDPIC (pointeurs de fonction 32 bits) pour ARM64. Traitement repensé et optimisé des opérations sur les entiers 64 bits. Prise en charge du processeur ajoutée
    Bras Cortex-A77,
    Bras Cortex-A76AE et
    Bras Cortex-M35P. Prise en charge étendue des instructions de traitement de données ACLE, notamment SIMD 32 bits, multiplication 16 bits, arithmétique de verrouillage et autres optimisations d'algorithmes DSP. Ajout d'un support expérimental pour les instructions ACLE CDE (Custom Datapath Extension).

  • Génération de code et vectorisation considérablement améliorées dans le backend pour les GPU AMD basés sur la microarchitecture GCN.
  • Ajout de la prise en charge des appareils de type XMEGA pour l'architecture AVR
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808, ATmega809, ATmega1608, ATmega1609, ATmega3208, ATmega3209 4808, ATmega4809 et ATmegaXNUMX.

  • Une nouvelle extension d'architecture de jeu d'instructions Intel ENQCMD (-menqcmd) a été ajoutée pour les architectures IA-32/x86-64. Ajout de la prise en charge des processeurs Intel Cooperlake (-march=cooperlake, inclut l'extension ISA AVX512BF16) et Tigerlake (-march=tigerlake, inclut les extensions ISA MOVDIRI, MOVDIR64B et AVX512VP2INTERSECT).
  • Une implémentation du HSAIL (Heterogeneous System Architecture Intermediate Language) pour les systèmes informatiques hétérogènes basés sur l'architecture HSA est obsolète et sera probablement supprimée dans une prochaine version.

Source: opennet.ru

Ajouter un commentaire