URL: https://linuxfr.org/news/sortie-de-gcc-6 Title: Sortie de GCC 6 Authors: khivapia bubarđŸŠ„, Davy Defaud, M5oul, patrick_g, palm123, ZeroHeure et BenoĂźt Sibaud Date: 2016ćčŽ04月17æ—„T21:31:50+02:00 License: CC By-SA Tags: gcc, gnu, compilateur, llvm, c++14, objective-c et libreoffice Score: 91 La sortie de la nouvelle version majeure du [compilateur GCC](http://gcc.gnu.org/) du projet GNU [va ĂȘtre annoncĂ©e](https://gcc.gnu.org/ml/gcc-announce/2016/). Écrit Ă  l’origine par Richard Stallman, 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, C++, Objective-C, Fortran, Java, Go et Ada et fonctionne sur une [multitude d’architectures](http://en.wikipedia.org/wiki/GNU_Compiler_Collection#Architectures). La suite de la dĂ©pĂȘche vous propose en avance de phase une revue de certaines parties des amĂ©liorations et nouvelles fonctionnalitĂ©s. Alors que GCC devenait un peu plus lent Ă  chaque publication d’une nouvelle version, cette mouture marque un tournant en Ă©tant plus rapide que les deux versions prĂ©cĂ©dentes, et plus rapide que d’autres compilateurs dans la plupart des situations, tout en gĂ©nĂ©rant souvent des binaires plus petits. ![logo GCC](https://img.linuxfr.org/img/687474703a2f2f6763632e676e752e6f72672f696d672f6763636567672d36352e706e67/gccegg-65.png) ---- [Liste des changements de GCC 6.1](https://gcc.gnu.org/gcc-6/changes.html) [Le rĂ©capitulatif sur le blog Red Hat](https://developerblog.redhat.com/2016/02/23/upcoming-features-in-gcc-6/) [La prĂ©cĂ©dente dĂ©pĂȘche pour la version 5.1](https://linuxfr.org/news/le-compilateur-gcc-5-1-harder-better-faster-stronger) ---- # Introduction # De nouvelles optimisations, un raffinement de celles existantes, ainsi que de nouvelles fonctionnalitĂ©s pour les langages et architectures prises en charge, sont Ă  l’ordre du jour. L’amĂ©lioration de l’usage par les dĂ©veloppeurs continue par l’optimisation des alertes et des outils Ă  sa disposition. GCC suit donc dĂ©sormais un systĂšme de numĂ©rotation de versions majeures en _.1_ puis _.x_. Cette 6.1 est la premiĂšre version stable, tout comme 5.1 le fut. # Nouvelles fonctionnalitĂ©s Ă  la compilation En particulier, l’optimisation Ă  l’édition des liens a Ă©tĂ© amĂ©liorĂ©e (tant pour les performances du code gĂ©nĂ©rĂ© que les performances du compilateur), et on voit pour la premiĂšre fois arriver la possibilitĂ© de dĂ©charger le processeur de certains calculs sur la puce graphique avec les puces d’AMD et la bibliothĂšque OpenMP ! ## Nouvelles optimisations ## - L’analyse d’_aliasing_ de types gĂšre maintenant mieux les accĂšs Ă  des pointeurs diffĂ©rents. Cela rĂ©sulte en une amĂ©lioration des informations de type de l’ordre de 20 Ă  30 % pour certains programmes C++ de trĂšs haut niveau (donc avec des types complexes). Cette meilleure prĂ©diction de type lors du dĂ©rĂ©fĂ©rencement de pointeurs permet d’activer plusieurs optimisations. - Ces optimisations cassent bien sĂ»r le code si les dĂ©rĂ©fĂ©rencements se faisaient avec des constructions de typage ambigu (comme une union en C ou en utilisant `reinterpret_cast` en C++). Ce genre de programme pourrait maintenant avoir besoin de l’option `-fno-strict-aliasing` pour ĂȘtre compilĂ© correctement. Les typages ambigus invalides sur des variables globales sont maintenant rapportĂ©es par l’alerte (_warning_) spĂ©cifique `-Wodr-type-mismatch`. - Cette mĂȘme analyse prend maintenant en charge les attributs GNU `weakref` et `alias`, ce qui permet d’utiliser une variable et son alias dans une mĂȘme unitĂ© de compilation, ce qui arrive souvent avec les optimisations Ă  l’édition des liens. - La propagation de valeurs fait maintenant l’hypothĂšse que le pointeur `this` des classes C++ est non nul. Cela permet de se passer de nombreuses vĂ©rifications de non‐nullitĂ© de pointeurs, tout en cassant des bases de code qui se reposaient sur ce comportement indĂ©fini du langage (comme Qt 5, Chromium et Kdevelop !). Il est possible d’utiliser `-fno-delete-null-pointer-checks` pour maintenir la compatibilitĂ© du code, et d’identifier les portions qui posent problĂšme avec des tests dynamiques utilisant l’option `-fsanitize=undefined`. - Nouvelles fonctionnalitĂ©s d’optimisation inter‐procĂ©durales. Rappelons que le compilateur dĂ©cide de l’[_inlining_](https://fr.wikipedia.org/wiki/Extension_inline) des fonctions : c’est‐à‐dire que le code va ĂȘtre dupliquĂ© Ă  chaque endroit oĂč elle est appelĂ©e, gagnant ainsi un appel de fonction (et les sauvegarde et crĂ©ation de contexte de pile affĂ©rents), mais perdant en taille de code (et donc mettant plus de pression sur le cache et les dĂ©codeurs). Il dĂ©cide aussi de cloner les fonctions : par exemple, si une fonction Ă  deux arguments `f(a, b)` est appelĂ©e soit par `f(1, b)` soit par `f(2, b)`, elle peut ĂȘtre clonĂ©e en deux fonctions diffĂ©rentes `f1(b)` et `f2(b)`. Il faut bien sĂ»r que le compilateur soit sĂ»r de la valeur de `a` et cette information s’obtient par la propagation des constantes ou une analyse statique. - La passe d’_inlining_ ou de clonage des fonctions repose sur des heuristiques de tailles et de durĂ©e d’exĂ©cution du code. Ces heuristiques sont maintenant plus prĂ©cises grĂące Ă  une analyse des sauts, rĂ©alisĂ©e avant la construction du profil du programme. - Le clonage des fonctions Ă©limine maintenant des paramĂštres des fonctions de maniĂšre plus agressive. ##AmĂ©liorations des performances du code gĂ©nĂ©rĂ© par les optimisations au moment de l’édition des liens (_link‐time optimization_, LTO). ## - Les attributs `warning` et `error` sont maintenant prĂ©servĂ©s Ă  l’édition des liens, on peut donc compiler des programmes avec Ă  la fois l’optimisation Ă  l’édition des liens et l’amĂ©lioration de la robustesse des sources face aux attaques de type _buffer / stack overflow_ permise par l’option `-D_FORTIFY_SOURCE=2`. - La fusion de types dĂ©finie par le standard Fortran 2008 a Ă©tĂ© corrigĂ©e, permettant l’interopĂ©rabilitĂ© entre des programmes C et Fortran. Plus de dĂ©tails sur ce point sont disponibles dans les notes de version sur le site de GCC. - Comme prĂ©cisĂ© plus haut, plus d’informations sur les types sont passĂ©es Ă  l’édition des liens ce qui permet une meilleure prĂ©cision sur les types lors de la LTO en cas d’_aliasing_. - La taille des fichiers d’objets LTO a Ă©tĂ© rĂ©duite : par exemple, sur Firefox 46.0, on gagne 11 %. - La parallĂ©lisation de la phase d’optimisation Ă  l’édition des liens (qu’on active par l’option `-flto=n`) a Ă©tĂ© significativement amĂ©liorĂ©e : les donnĂ©es Ă©tudiĂ©es en partitionnant le programme (pour dĂ©couper en blocs optimisables indĂ©pendamment et donc en parallĂšle). Par exemple, toujours sur Firefox 46.0, ces donnĂ©es ont Ă©tĂ© rĂ©duites de 66 % ! - Le greffon de l’éditeur de liens (`gold` ou `bfd`) a Ă©tĂ© Ă©tendu de sorte Ă  passer des informations sur le type de binaire gĂ©nĂ©rĂ© par le _back‐end_ de GCC. Cela permet de configurer le gĂ©nĂ©rateur de code pour prendre en charge une Ă©dition de liens (avec optimisation, bien sĂ»r) incrĂ©mentale ! Il suffit de passer l’option `-r` Ă  `gcc` et d’utiliser un Ă©diteur de liens Ă  greffons. Pour rappel, la prise en charge des greffons des Ă©diteurs de liens Ă  greffons a Ă©tĂ© activĂ©e dans la version prĂ©cĂ©dente de GCC pour rĂ©duire la quantitĂ© d’information nĂ©cessaire Ă  la phase de LTO qui Ă©tait stockĂ©e dans les bibliothĂšques statiques (fichiers `.a` qui sont en rĂ©alitĂ© une collection de fichiers `.o`). Il n’y a cependant pas de magie, mais un nouveau compromis est possible : - soit on Ă©dite les liens avec `ld -r`, qui rĂ©alise la LTO lors de l’édition finale des liens et rĂ©alise avec les informations transmises individuellement sur chaque objets une optimisation globale (donc lente Ă  l’édition des liens) sur le programme ; - soit on Ă©dite les liens avec `gcc -r`, qui produit l’objet binaire avec LTO sur les informations dont il dispose, mais qui ne reviendra pas sur les optimisations dĂ©jĂ  rĂ©alisĂ©es quand il arrivera Ă  l’édition finale des liens. Cette derniĂšre Ă©dition des liens sera ainsi plus rapide mais manquera peut‐ĂȘtre des opportunitĂ©s qu’une LTO globale aurait vues. [Honza Hubička](http://hubicka.blogspot.fr/2016/03/building-libreoffice-with-gcc-6-and-lto.html), dĂ©veloppeur LibreOffice, propose un article de comparaison de compilations entre diffĂ©rentes versions de GCC, mais aussi avec LLVM, en utilisant les LTO sur GCC 6. ## Nouvelles informations sur les erreurs et alertes Ă  la compilation ## Peut‐ĂȘtre suite Ă  la pression mise par _clang_ (du projet LLVM) sur les aspects de facilitation du travail du programmeur, il y a dĂ©jĂ  plusieurs annĂ©es de cela, les dĂ©veloppeurs de GCC amĂ©liorent depuis plusieurs versions les messages d’erreur en vue d’amĂ©liorer la productivitĂ© des utilisateurs. Voir en particulier [cette publication dĂ©taillĂ©e de Mark Wielaard](https://gnu.wildebeest.org/blog/mjw/2016/02/15/looking-forward-to-gcc6-many-new-warnings/). Quelques exemples : - aprĂšs l’apparition de messages d’erreur plus explicites et en couleurs dans les versions prĂ©cĂ©dentes, la version 6.1 de GCC indique maintenant l’ensemble des caractĂšres qui posent problĂšme plutĂŽt qu’un seul ; - les messages d’erreur sont agrĂ©mentĂ©s de recommandations sur la maniĂšre de rĂ©soudre le problĂšme (par exemple une faute de frappe sur un nom de variable ou remplacer `.` par `->` sur un pointeur) ; - certaines fautes de frappe d’arguments sur la ligne de commande gcc sont maintenant dĂ©tectĂ©es et une suggestion est faite Ă  l’utilisateur (par exemple, tenter d’éditer des liens avec la bibliothĂšque _static-fortran_ au lieu de _static-**g**fortran_) ; - le dĂ©veloppeur est maintenant prĂ©venu lorsqu’il effectue certaines comparaisons tautologiques ou encore lorsque des chaĂźnes de `if ... else ... if` contiennent plusieurs fois la mĂȘme condition ; - de nombreuses alertes supplĂ©mentaires sont levĂ©es. Parmi elles, les indentations trompeuses sont maintenant dĂ©tectĂ©es et le compilateur lance une alerte avec le flag `-Wmisleading-indentation`. Le dĂ©ni plausible d’Apple sur la faille `goto fail;` deviendra impossible Ă  tenir Ă  l’avenir. Concernant cette nouvelle alerte, voir [la publication sur le blog Red Hat](https://developerblog.redhat.com/2016/02/26/gcc-6-wmisleading-indentation-vs-goto-fail/). De maniĂšre gĂ©nĂ©rale il est fortement recommandĂ© de compiler tout code avec `-Wall -Wextra` et de traiter toutes les alertes remontĂ©es par le compilateur ! Selon le principe « pas de fenĂȘtre brisĂ©e » (_no broken window_), manquer de soin par petites touches sur un projet incite Ă  prendre de moins en moins soin du code. Il devient vite peu fiable et trĂšs coĂ»teux Ă  maintenir et Ă  faire Ă©voluer. ## Tests dynamiques de code ## Dans la lignĂ©e des outils qui instrumentent le code, souvent portĂ©s depuis _clang_, et qui permettent de dĂ©tecter des problĂšmes Ă  l’exĂ©cution dans la famille des `fsanitize=` : - Une nouvelle option a Ă©tĂ© ajoutĂ©e parmi celles qui permettent de dĂ©tecter certains problĂšmes lors de tests dynamiques au dĂ©veloppement : on peut maintenant vĂ©rifier les bornes des tableaux C de type `array` de maniĂšre plus stricte qu’auparavant, via l’option `-fsanitize=bounds-strict`. Cela active la vĂ©rification dĂ©jĂ  existante `-fsanitize=bounds` et instrumente le code pour les tableaux de longueur variable. ## Nouvelles bibliothĂšques et fonctionnalitĂ©s ## - ImplĂ©mentation de la spĂ©cification d’OpenMP en version 4.5 pour les compilateurs C et C++. - Les compilateurs C/C++ permettent d’utiliser des attributs au sein des Ă©numĂ©rations (par exemple, marquer via un attribut dĂ©prĂ©ciĂ© l’une des valeurs d’une Ă©numĂ©ration). - Le compilateur C++ suppose que le code est en C++ 2014 par dĂ©faut (contre C++ 98 auparavant). L’activation du C++ 14 strict se fait avec ``-std=c++14``. Sinon on bĂ©nĂ©ficie des extensions GNU au langage, correspondant Ă  ``-std=gnu++14``. - Le compilateur et la bibliothĂšque standard C++ (_libstdc++_) proposent les concepts et quelques extensions du futur standard C++ 2017 de maniĂšre expĂ©rimentale. En particulier, les rapports techniques (fonctionnalitĂ©s expĂ©rimentales considĂ©rĂ©es pour inclusion Ă©ventuelle dans les futures Ă©volutions du standard) _File Systems_ ou _Library Fundamentals v2_. - AmĂ©liorations de la bibliothĂšque _libgccjit_ qui permet de compiler du code Ă  la volĂ©e. - Prise en charge de la nouvelle bibliothĂšque standard [_C Musl_](https://en.wikipedia.org/wiki/Musl) sous Linux (architectures AArch64 / ARM / MIPS / PowerPC / i386 / x32 / x86_64). Rappelons que cette nouvelle bibliothĂšque se veut Ă  la fois performante et trĂšs lĂ©gĂšre, ce qui permet de la compiler en statique dans les exĂ©cutables sans qu’ils grossissent dĂ©mesurĂ©ment. # NouveautĂ©s sur les architectures gĂ©rĂ©es # Outre les habituelles dĂ©prĂ©ciations et/ou suppression d’architectures, pour lesquelles personnes ne s’est manifestĂ© pour les maintenir, on note Ă  cĂŽtĂ© les amĂ©liorations et nouveautĂ©s suivantes : - AmĂ©liorations pour les architectures ARM : on notera la prise en charge de l’option `-march=native` sous AArch64 (architectures ARM 64 bits) pour que GCC dĂ©tecte tout seul le processeur sur lequel il est exĂ©cutĂ©, afin d’optimiser le code spĂ©cifiquement pour lui. - Prise en charge du langage intermĂ©diaire HSA (pour les systĂšmes AMD, gĂ©nĂ©ralement avec un processeur central et un processeur graphique Radeon intĂ©grĂ©) : en utilisant une extension pour la bibliothĂšque OpenMP du projet GNU ([_libgomp_](https://gcc.gnu.org/onlinedocs/libgomp/)), on peut transformer des constructions OpenMP simples en langage HSAIL, pour les exĂ©cuter sur les puces graphiques d’AMD dont le pilote prend ce langage en charge. - Prise en charge des instructions vectorielles [AVX512](https://en.wikipedia.org/wiki/AVX-512) (donc, comme leur nom l’indique, sur 512 bits) pour les encore rares processeurs Intel Xeon de la gĂ©nĂ©ration Skylake. - Prise en charge des nouvelles instructions `monitorx` and `mwaitx` d’AMD. Elles sont similaires aux instructions `monitor` et `mwait` dĂ©jĂ  prises en charge dans le (vieux) jeu d’instructions complĂ©mentaires [[SSE3]], en ajoutant de nouvelles fonctionnalitĂ©s (un compte Ă  rebours) et un nouvel encodage. Ces instructions surveillent une zone mĂ©moire et rĂ©veillent le processeur lors d’un accĂšs ou, maintenant, quand le compte Ă  rebours est expirĂ©. - Prise en charge des futurs processeurs AMD fondĂ©s sur l’architecture Zen. Cette nouvelle architecture amd64 (x86-64) ne sera plus basĂ©e sur le type Bulldozer (avec deux cƓurs d’exĂ©cution entiers avec chacun leur cache de donnĂ©es partageant un cache d’instructions, les unitĂ©s de calcul sur les flottants et parfois les Ă©tages de dĂ©codage d’instructions) mais sera toute nouvelle (et partagera vraisemblablement des idĂ©es de conception avec les processeurs ARM 64 bits conçus par AMD). EspĂ©rons que cela permette Ă  AMD de se relancer dans la course Ă  des processeurs x86 64 bits performants ! - Prise en charge initiale des processeurs POWER9 d’IBM. On en sait peu sur ces processeurs Ă  l’heure actuelle, si ce n’est qu’ils reposeront sur la spĂ©cification OpenPOWER ISA 3.0, avec de nouvelles instructions vectorielles VSX-3 et un bus de transfert de donnĂ©es entre processeurs central et graphique baptisĂ© NVLink et conçu par NVIDIA. Comme d’habitude avec les processeurs POWER d'IBM, on peut s’attendre Ă  des monstres de puissance de calcul. - Prise en charge du processeur z13 d’IBM, ainsi que des amĂ©liorations pour systĂšmes IBM S/390. En rĂ©sumĂ©, GCC 6 avec les LTO compile mieux, plus vite et sort des binaires plus petits que toutes les autres versions antĂ©rieures. Il dĂ©passe Ă©galement le compilateur _clang_ du projet LLVM. Pour ce dernier, seule une ancienne version 3.5 compile plus vite, mais en produisant des binaires jusqu’à 20 % plus gros. Toutes les autres versions de LLVM sont dĂ©passĂ©es par cette nouvelle version majeure de GCC. Quant Ă  la derniĂšre version de LLVM et son usage des LTO, GCC 6 lui donne une leçon, puisqu’il est jusqu’à 40 % plus rapide. LLVM travaille dĂ©jĂ  dans sa version en dĂ©veloppement Ă  essayer de rattraper ce retard.

AltStyle ă«ă‚ˆăŁăŠć€‰æ›ă•ă‚ŒăŸăƒšăƒŒă‚ž (->ă‚ȘăƒȘă‚žăƒŠăƒ«) /