URL: https://linuxfr.org/news/sortie-de-gcc-8-1 Title: Sortie de GCC 8.1 Authors: patrick_g ZeroHeure, Davy Defaud, gusterhack, RyDroid, palm123, jcr83, _seb_ et Bruno Michel Date: 2017年11月22日T13:22:26+01:00 License: CC By-SA Tags: richard_stallman, gcc, objective-c et fortran Score: 68 La sortie de la nouvelle version majeure du [compilateur GCC](http://gcc.gnu.org/) du projet GNU a été annoncée le 2 mai 2018. Écrit à l’origine par [Richard Stallman](https://stallman.org/), le logiciel GCC (_GNU Compiler Collection_) est le [compilateur](http://fr.wikipedia.org/wiki/Compilateur) de référence du monde du logiciel libre. Il accepte des codes sources écrits en [C](https://fr.wikipedia.org/wiki/C_(langage)), [C++](https://fr.wikipedia.org/wiki/C%2B%2B), [Objective-C](https://fr.wikipedia.org/wiki/Objective-C), [Fortran](https://fr.wikipedia.org/wiki/Fortran), [Go](https://fr.wikipedia.org/wiki/Go_(langage)) et [Ada](https://fr.wikipedia.org/wiki/Ada_(langage)). De plus, il fonctionne sur [une multitude d’architectures](http://en.wikipedia.org/wiki/GNU_Compiler_Collection#Architectures). La suite de la dépêche vous propose une revue de certaines améliorations et nouvelles fonctionnalités de cette nouvelle version. ---- [Liste officielle des changements de GCC 8.1](https://gcc.gnu.org/gcc-8/changes.html) [La liste de Phoronix](https://www.phoronix.com/scan.php?page=news_item&px=GCC-8-Compiler-Features-List) [Usability improvements in GCC 8](https://developers.redhat.com/blog/2018/03/15/gcc-8-usability-improvements/) [GNU Toolchain Update — Spring 2018](https://developers.redhat.com/blog/2018/03/26/gnu-toolchain-update-2018/) [Annonce de la sortie de GCC 8.1](https://gcc.gnu.org/ml/gcc/2018-05/msg00017.html) ---- # Général ## Nouveaux diagnostics GCC 8.1 propose de nombreuses améliorations dans les diagnostics qui sont émis en cas de problème à la compilation. L’emplacement des erreurs de syntaxe est mieux indiqué et dans la plupart des cas GCC suggérera même ce qu’il faut insérer pour corriger l’erreur. Les en‐têtes (`#include`) manquants sont également indiqués par des messages plus explicites et des suggestions sont faites pour corriger la plupart des cas. Le développeur David Malcolm [a écrit un excellent article](https://developers.redhat.com/blog/2018/03/15/gcc-8-usability-improvements/) qui détaille toutes ces améliorations des diagnostics de GCC 8.1. ## Sécurité La nouvelle option `-fstack-clash-protection` génère automatiquement du code pour empêcher les attaques de type [_stack clash_](https://blog.qualys.com/securitylabs/2017/06/19/the-stack-clash), de façon à allouer une seule page de la pile à la fois et à y accéder immédiatement après l’allocation. Les futurs processeurs Intel seront dotés d’une nouvelle technologie de sécurité nommée _Control‐flow Enforcement Technology_ ([CET](https://software.intel.com/sites/default/files/managed/4d/2a/control-flow-enforcement-technology-preview.pdf)). En gros, cela consiste à stopper les attaques de type [Return‐oriented Programming](https://fr.wikipedia.org/wiki/Return-oriented_programming) en ayant une pile fantôme (_shadow stack_) qui va gérer les adresses de retour et générer une erreur en cas de problème. La gestion de CET est déjà présente dans GCC 8.1 via les options `-mcet`, `-mibt`, `-mshstk` et `-fcf-protection`. ## PGO L’infrastructure PGO (_Profile Guided Optimization_) a été largement améliorée dans cette version de GCC. PGO consiste à compiler une première fois le code avec l’option `-fprofile-generate` afin de l’instrumenter. On fait ensuite tourner le code en conditions réelles pour mesurer les performances et générer un profil précis de l’application. Puis, on réalise une seconde passe de compilation, cette fois‐ci avec l’option `-fprofile-use`, pour générer un code optimisé. Dans GCC 8.1, les profils générés sont plus précis et plus fiables. L’option `-freorder-blocks-and-partition` qui sépare les fonctions dans des régions dites _hot_ et _cold_ est maintenant activée dès le niveau de compilation `-O2`. Cela permet à GCC d’optimiser plus agressivement les portions de code qui sont les plus sensibles aux performances. ## Divers Deux nouvelles passes optimisant la transformation des boucles dans le code (_[loop nest optimization](https://en.wikipedia.org/wiki/Loop_nest_optimization)_) ont été ajoutées dans cette version de GCC. On trouve donc `-floop-unroll-and-jam` qui se charge du déroulage et de la fusion de boucles et `-floop-interchange` qui s’occupe d’améliorer la localisation spatiale des données. Ces deux passes sont activées par défaut à partir du niveau d’optimisation `-O3`. Une nouvelle directive _pragma_ `GCC unroll` a été implémentée pour les langages de la famille C, ainsi que pour Fortran et Ada. Cela offre à l’utilisateur un contrôle plus fin des optimisations de déroulage de boucles. Les fonctionnalités d’optimisation inter‐procédurales sont revues avec une amélioration de la précision des métriques qui estiment la pertinence de l’« _inlining_ » et du « _cloning_ ». La fonction LTO (_Link‐time optimization_) préserve mieux les informations de débogage dans les exécutables ELF. Cela permet, par exemple, à la fonction _pretty-printers_ de la bibliothèque C++ libstdc++ de fonctionner même dans le cas d’un exécutable optimisé via LTO. # Langages de programmation ## Fortran La version principale de _libfortran_ a été changée pour la version 5. GCC 8.1 apporte la prise en charge des _Parameterized derived types_ (une fonction présente dans la norme Fortran 2003) et améliore également la prise en charge de la norme Fortran 2008. ## Golang GCC 8.1 fournit une implémentation complète des paquets utilisateur de Go 1.10.1. Le ramasse‐miettes est maintenant complètement concurrent et la fonctionnalité d’_escape analysis_ est implémentée, ce qui réduit le nombre d’allocations dans le [tas](https://fr.wikipedia.org/wiki/Tas_(informatique)) en allouant à la place les valeurs dans la [pile](https://fr.wikipedia.org/wiki/Pile_(informatique)). ## C/C++ Plusieurs nouvelles options font leur apparition pour la compilation de code C et C++ afin d’avertir l’utilisateur sur d’éventuels problèmes (ces options sont bien évidemment incluses dans `-Wall` ou `-Wextra`). On retrouve donc : - `-Wmultistatement-macros`, qui avertit au sujet des macros qui ont des multiples déclarations utilisant collectivement plusieurs instructions comme `if`, `else`, `while`, `switch`, ou bien `for` ; - `-Wstringop-truncation`, qui avertit lors d’appels non sûrs à des fonctions de manipulation de chaînes de caractères ; - `-Wif-not-aligned`, qui s’occupe des utilisations invalides d’objets ayant l’attribut `warn_if_not_aligned` ; - `-Wmissing-attributes`, qui émet un warning quand il manque un ou plusieurs attributs dans une déclaration de fonction ; - `-Wpacked-not-aligned`, qui avertit quand un `struct` ou un `union` est déclaré avec l’attribut `packed` de façon incorrecte ; - `-Wcast-function-type`, qui avertit quand un pointeur de fonction est « casté » de façon incompatible ; - `-Wsizeof-pointer-div`, qui émet une alerte (_warning_) en cas de division de la taille d’un pointeur par la taille des éléments qu’il pointe ; - `-Wcast-align=strict`, qui alerte l’utilisateur quand un pointeur est « casté » et que cela implique une augmentation des contraintes d’alignement. # Cibles matérielles ## x86-64 En ce qui concerne les processeurs Intel, cette nouvelle version de GCC apporte la prise en charge de la famille _Cannon Lake_ (gravure en 10 nm) qui va être déployée au cours de l’année 2018. Il suffit d’utiliser l’option `-march=cannonlake` pour profiter des optimisations spécifiques (et cela active les extensions AVX512VBMI, AVX512IFMA et SHA). Le successeur de _Cannon Lake_, qui se nomme _Ice Lake_ et qui sortira normalement en 2019, est également présent dans cette version de GCC. En passant l’option `-march=icelake` on active automatiquement les extensions AVX512VNNI, GFNI, VAES, AVX512VBMI2, VPCLMULQDQ, AVX512BITALG, RDPID et AVX512VPOPCNTDQ. ## ARM et AArch64 La prise en charge de la version 64 bits de l’architecture ARM a bien évolué dans GCC 8.1. C’est tout d’abord la variante [Armv8.4-A](https://community.arm.com/processors/b/blog/posts/introducing-2017s-extensions-to-the-arm-architecture) qui fait son entrée (option `-march=armv8.4-a`) et qui apporte un EL2 sécurisé, l’accélération matérielle des algorithmes de hachage SHA2-512, SHA-3, SM3, et SM4 ainsi que l’amélioration des fonctions de virtualisation et de partitionnement mémoire (_Memory Partitioning and Monitoring_, soit MPAM). On retrouve également dans cette version de GCC la prise en charge des processeurs Cortex-A75 et Cortex-A55, ainsi que la variante [DynamIQ](https://en.wikipedia.org/wiki/ARM_big.LITTLE#Successor) [[big.LITTLE]], qui associe ces deux processeurs. Les options de prise en charge d’architecture de type `-march` et `-mcpu` acceptent maintenant des extensions optionnelles, comme par exemple la prise en charge du calcul en virgule flottante ou les extensions vectorielles. Cela apporte beaucoup de flexibilité puisqu’il suffira, par exemple, de spécifier `-mcpu=cortex-a53+nofp` pour générer du code adapté au processeur Cortex-A53 mais sans gestion du calcul sur les flottants. Voir la [documentation](https://gcc.gnu.org/onlinedocs/gcc-8.1.0/gcc/ARM-Options.html#ARM-Options) à ce sujet. L’extension vectorielle [_Scalable Vector Extension_](https://community.arm.com/processors/b/blog/posts/technology-update-the-scalable-vector-extension-sve-for-the-armv8-a-architecture) (SVE) est maintenant prise en charge en tant qu’option à partir de la variante ARMv8.2-A (et supérieur). À la différence de l’AVX d’Intel, cette extension SVE ne nécessite plus de modifier le code quand la largeur des registres vectoriels augmente d’une génération de processeur à l’autre (d’où le _Scalable_ dans le nom). Avec un code source tirant parti du modèle de programmation _vector‐length agnostic_ il suffira d’utiliser l’option `-march=armv8.2-a+sve`et GCC pourra générer du code vectorisé qui sera automatiquement adapté à l’architecture sous‐jacente de 128 bits jusqu’à 2 048 bits.