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.  ---- [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.