Sortie de GCC 7.1

La nouvelle version du compilateur libre GCC vient de sortir. Selon la nouvelle convention de numérotation, son numéro de version est 7.1, pour la première version stable de la branche GCC 7. Elle marque le trentième anniversaire du compilateur GCC limité au langage C, qui a depuis lors évolué comme une suite de compilateurs pour une flopée de langages : Ada, C, C++, Fortran, Go.

C++17

Parmi les nouveautés concernant C++, on peut noter une gestion expérimentale de l’entièreté de la norme C++17. Il faut encore l’activer manuellement lors de la compilation (avec l’option -std=c++1z), au moins jusqu’à la publication de la version finale de la norme. Les progrès par rapport à GCC 6 sont notables, comme montré dans le tableau ci-dessous. Néanmoins, la bibliothèque standard n’est pas encore à ce niveau d’implémentation.

[[fallthrough]] attribute P0188R1 7 __has_cpp_attribute(fallthrough)
Extension to aggregate initialization P0017R1 7 __cpp_aggregate_bases >= 201603
Wording for constexpr lambda P0170R1 7 __cpp_constexpr >= 201603
Lambda capture of *this by Value P0018R3 7 __cpp_capture_star_this >= 201603
Construction Rules for enum class variables P0138R2 7
Dynamic memory allocation for over-aligned data P0035R4 7 __cpp_aligned_new >= 201606
Guaranteed copy elision P0135R1 7
Refining Expression Evaluation Order for Idiomatic C++ P0145R3 7
constexpr if P0292R2 7 __cpp_if_constexpr >= 201606
Selection statements with initializer P0305R1 7
Template argument deduction for class templates P0091R3 7 __cpp_deduction_guides >= 201606
Declaring non-type template parameters with auto P0127R2 7 __cpp_template_auto >= 201606
Using attribute namespaces without repetition P0028R4 7
Structured bindings P0217R3 7 __cpp_structured_bindings >= 201606
Remove Deprecated Use of the register Keyword P0001R1 7
Remove Deprecated operator++(bool) P0002R1 7
Make exception specifications be part of the type system P0012R1 7 __cpp_noexcept_function_type >= 201510
Rewording inheriting constructors (core issue 1941 et al) P0136R1 7 __cpp_inheriting_constructors >= 201511
Inline variables P0386R2 7 __cpp_inline_variables >= 201606
DR 150, Matching of template template arguments P0522R0 7 __cpp_template_template_args >= 201611
Removing dynamic exception specifications P0003R5 7
Pack expansions in using-declarations P0195R2 7 __cpp_variadic_using >= 201611
A byte type definition P0298R0 7

Pour la bibliothèque standard :

constexpr std::hardware_{constructive,destructive}_interference_size P0154R1 No __cpp_lib_hardware_interference_size >= 201603
Core Issue 1776: Replacement of class objects containing reference members P0137R1 7 __cpp_lib_launder >= 201606
Variant: a type-safe union for C++17 P0088R3 7 __has_include(<variant>)
Library Fundamentals V1 TS Components: optional P0220R1 7 __has_include(<optional>)
Library Fundamentals V1 TS Components: any P0220R1 7 __has_include(<any>)
Library Fundamentals V1 TS Components: string_view P0220R1 7 __has_include(<string_view>)
Library Fundamentals V1 TS Components: memory_resource P0220R1 No __has_include(<memory_resource>)
Library Fundamentals V1 TS Components: apply P0220R1 7 __cpp_lib_apply >= 201603
Library Fundamentals V1 TS Components: shared_ptr<T[]> P0220R1 7 __cpp_lib_shared_ptr_arrays >= 201603
Library Fundamentals V1 TS Components: Searchers P0220R1 7 __cpp_lib_boyer_moore_searcher >= 201603
Library Fundamentals V1 TS Components: Sampling P0220R1 7 __cpp_lib_sample >= 201603
Constant View: A proposal for a std::as_const helper function template P0007R1 7 __cpp_lib_as_const >= 201510
make_from_tuple: apply for construction P0209R2 7 __cpp_lib_make_from_tuple >= 201606
Removing auto_ptr, random_shuffle(), And Old <functional> Stuff N4190 No (kept for backwards compatibility)
Deprecating Vestigial Library Parts in C++17 P0174R2 No
Making std::owner_less more flexible P0074R0 7 __cpp_lib_transparent_operators >= 201510
std::addressof should be constexpr LWG2296 7 __cpp_lib_addressof_constexpr >= 201603
Re-enabling shared_from_this P0033R1 7 __cpp_lib_enable_shared_from_this >= 201603
Adopt not_fn from Library Fundamentals 2 for C++17 P0005R4 7 __cpp_lib_not_fn >= 201603
Fixes for not_fn P0358R1 7
Fixing a design mistake in the searchers interface in Library Fundamentals P0253R1 7
Extending memory management tools P0040R3 7
shared_ptr::weak_type P0163R0 7 __cpp_lib_shared_ptr_weak_type >= 201606
Adopt Type Traits Variable Templates from Library Fundamentals TS for C++17 P0006R0 7 __cpp_lib_type_trait_variable_templates >= 201510
Adding [nothrow-]swappable traits P0185R1 7 (__is_swappable available since 6.1) __cpp_lib_is_swappable >= 201603
is_callable, the missing INVOKE related trait P0077R2 7 __cpp_lib_is_callable >= 201603
has_unique_object_representations P0258R2 7 __cpp_lib_has_unique_object_representations >= 201606
Polishing <chrono> P0092R1 7 __cpp_lib_chrono >= 201510
Adding more constexpr to <chrono> P0505R0 7 ???
Constexpr for std::char_traits P0426R1 7 (partial) ???
Integrating std::string_view and std::string P0254R2 7
Give ‘std::string’ a non-const ‘.data()’ member function P0272R1 7
Contiguous Iterators N4284 N/A
Emplace return type P0084R2 7 ???
Splicing Maps and Sets P0083R3 7 __cpp_lib_node_extract >= 201606
A Proposal to Add Constexpr Modifiers to reverse_iterator, move_iterator, array and Range Access P0031R0 7 __cpp_lib_array_constexpr >= 201603
The Parallelism TS Should be Standardized P0024R2 No __has_include(<execution>) , __cpp_lib_parallel_algorithm >= 201603
An algorithm to “clamp” a value between a pair of boundary values P0025R0 7 __cpp_lib_clamp >= 201603
Adopt Selected Library Fundamentals V2 Components for C++17 P0295R0 7 __cpp_lib_gcd >= 201606 , __cpp_lib_lcm >= 201606
Proposal to Introduce a 3-Argument Overload to std::hypot P0030R1 7 __cpp_lib_hypot >= 201603
Mathematical Special Functions for C++17 P0226R1 7 (6.1) __cpp_lib_math_special_functions >= 201603 (for GCC 6 or pre-C++17 define __STDCPP_WANT_MATH_SPEC_FUNCS__ to a non-zero value and test for __STDCPP_MATH_SPEC_FUNCS__ >= 201003L)
Adopt the File System TS for C++17 P0218R1 No __has_include(<filesystem>) , __cpp_lib_filesystem >= 201603
Relative Paths for Filesystem P0219R1 No
Adapting string_view by filesystem paths P0392R0 No
constexpr atomic<T>::is_always_lock_free P0152R1 7 __cpp_lib_atomic_is_always_lock_free >= 201603
Variadic lock_guard P0156R2 7 __cpp_lib_scoped_lock >= 201703
byte type definition P0298R3 7 ???
Elementary string conversions P0067R5 No ???

Diagnostics C et C++

Les diagnostics pour le code C et C++ ont été encore largement améliorés : GCC 6 apportait bon nombre d’améliorations, cette nouvelle itération continue le travail. Principalement, le compilateur propose des corrections pour les fautes de frappe, que ce soit des membres de structures, des fonctions, des macros, des énumérations ou des types.

spellcheck-fields.cc:52:13: error: 'struct s' has no member named 'colour'; did you mean 'color'?
   return ptr->colour;
               ^~~~~~
               color

De même, le préprocesseur propose des corrections pour les directives mal écrites :

test.c:5:2: error: invalid preprocessing directive #endfi; did you mean #endif?
 #endfi
  ^~~~~
  endif

Les chaînes de formattage (utilisées par printf et compagnie) ont aussi droit à des propositions de corrections :

test.c:51:29: warning: format '%s' expects argument of type 'char *', but argument 3 has type 'int' [-Wformat=]
   printf ("foo: %d  bar: %s baz: %d", 100, i + j, 102);
                          ~^                ~~~~~
                          %d

En C++, plus spécifiquement, certains points-virgules manquants sont signalés :

test.cc:4:11: error: expected ';' after class definition
 class a {} 
           ^
           ;

Au niveau de la sécurité, bon nombre de nouveaux messages permettent de détecter les risques de dépassement de capacité et d’autres formes d’accès invalides à la mémoire. Par exemple, des appels à malloc() avec une taille de mémoire négative donne un avertissement :

void* f (int n)
{
  return malloc (n > 0 ? 0 : n);
}

warning: argument 1 range [2147483648, 4294967295] exceeds maximum object size 2147483647 [-Walloc-size-larger-than=]

De même, certaines failles potentielles lors de l’utilisation de fonctions de la famille printf sont détectées :

void* f (int mday)
{
  char *buf = malloc (3);
  sprintf (buf, "%02i", mday % 100);
  return buf;
}

warning: 'sprintf may write a terminating nul past the end of the destination [-Wformat-overflow=]
note: 'sprintf' output between 3 and 4 bytes into a destination of size 3

Optimisation du code

GCC 7 apporte bon nombre de nouvelles passes d’optimisation du code. Par exemple, certains appels à sprintf peuvent être remplacés par des constantes, la taille de leur sortie peut être estimée (avec des bornes supérieures et inférieures). Les opérations d’écriture en mémoire sont rassemblées, afin d’effectuer moins d’instructions, chacune copiant plus de données.

Les passes interprocédurales peuvent analyser les bits des variables forcément à zéro (ce qui inclut l’alignement des pointeurs, déjà disponible avec GCC 6) et donner l’information aux autres passes. Pour les variables entières, les bornes sur les valeurs sont transmises aux autres algorithmes d’optimisation.

Certaines boucles ont la particularité d’avoir une condition toujours vraie pour une partie des itérations puis fausse pour les suivantes. Dans ce cas, GCC 7 peut séparer la boucle en deux parties, de telle sorte que la condition ne doit plus être vérifiée.

Calcul de haute performance

OpenMP est une série d’annotations pour le code C, C++ et Fortran qui indique au compilateur comment le paralléliser. GCC 6 implémentait la version 4.5 de la norme pour C et C++, GCC 7 l’apporte à Fortran, avec l’exception de la correspondance des éléments de structure.

GCC peut maintenant produire des exécutables au format BRIG 1.0. Il est utilisé dans le cadre de la plateforme AMD HSA. L’objectif est de déporter facilement du code OpenMP sur n’importe quel type d’accélérateur, comme un GPU, ce qui est défini depuis OpenMP 4.

NVIDIA n’est pas en reste, GCC peut maintenant produire des binaires au format NVPTX, utilisé sur les cartes graphiques de la marque. Cet export est utilisé pour décharger l’exécution de code OpenMP.

Autres langages

GCJ, le compilateur Java, n’était plus vraiment maintenu depuis des années, il est maintenant supprimé. Le compilateur Go est mis à jour pour la version 1.8 du langage.

Sources : GCC 7 Release Series, C++ Standards Support in GCC, libstdc++ Implementation Status.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s