Journal LLVM 11.0.0

Posté par  (site Web personnel) . Licence CC By‑SA.
Étiquettes :
33
13
oct.
2020

Demat'iNal,

Après 6 release candidates, la version 11.0.0 de l'écosystème LLVM a finalement été rendue publique.

LLVM suit un cycle de sortie de 6 mois, quelles sont donc les grandes nouveautés ? On notera déjà l'arrivée du compilateur Flang dans la suite officielle LLVM, qui se dote ainsi d'un compilateur Fortran. Il vient remplacer le peu usité llvmgo qui a été retiré du dépôt officiel.

LLVM release note

LLVM possédait déjà un type vectoriel, p.e. <i32 x 4> pour un vecteur de 4 entiers 32 bits. Ce type de taille fixe est maintenant complété par un type vectoriel de taille variable, noté <vscale x 4 x i32> pour un vecteur de 4, 8, 12 etc entiers de 32 bits, pour pouvoir cibler des jeux d'instruction comme SVE de ARM.

Plusieurs ajustements ont été faits pour la gestion propagation des valeurs poison et undef. Le lecteur intéressé se délectera de cette video du LLVM Virtual Developer Meeting sur la différence entre undef et poison.

Il est maintenant possible de positionner l'attribut probe-stack à "inline-asm" ce qui fournit, sur les architectures x86 (implémenté par votre serviteur), SystemZ et PowerPC, une protection contre l'attaque stack clash

Clang release note

Clang est maintenant doté d'un recoverable AST, qui permet de mieux gérer la représentation des erreurs; En cas d'erreur de syntaxe, le code suivant l'erreur est plus facilement parsé dans de bonnes conditions. Cette fonctionnalité est activée par défaut pour le front-end C++.

De nouveaux avertissements voient le jour : -Wpointer-to-int-cast, Wuninitialized-const-reference et -Wimplicit-const-int-float-conversion. Leur dénommination me parait suffisament explicite ;-)

Clang fournit désormais des types intrinsèques, _ExtInt(N)N est un entier spécifiant la taille du type entier. Cela permet de déclarer des entiers de 57 bits.

Les projets reposant sur une génération a priori des profiles utilisés par les options de Profile Guided Optimization devront regénérer leurs profiles, l'algorithme de hash utilisé ayant reçu un correctif de bug par votre serviteur.

L'option -O est dorénavant un alias de -O1 et non plus -O2.

En spécifiant -fpic/-fPIC -fno-semantic-interposition la sémantique d'interposition requise par ELF n'est plus respectée, pour le plus grand plaisir des optimisations.

L'option -fstack-clash-protection permet de tirer parti des protéctions contre stack clash implémentée au niveau LLVM.

Plusieurs options relatives à la gestion des nombres flottants: -ffp-exception-behavior={ignore,maytrap,strict} et -ffp-model={precise,strict,fast}.

D'un point de vue langage, le support d'OpenMP5 a été amélioré, la version du standard C utilisée par défaut est gnu17, la defect report P1766R1 qui restreint l'usage de structure anonymes dans un typedef, à la C, est appliquée de manière rétroactive à toutes les version de C++

Others

la suite de compilation LLVM inclut également des outils basés sur clang, un éditeur de lien, lld, une implémentation de la bibliothèque standard C++, libc++, un optimiseur polyhèdrique polly, et, pour ceux qui ont suivi, un compilateur Fortran flang.

En vrac, Flang supporte Fortran2018, <numbers> fait son arrivée dans la libc++, pas mal de travail niveau performance et de nouveaux diagnostiques dans clangd et plein d'autres choses que je ne comprends pas bien ;-)
Je vous invite à lire leur notes si ces sujets vous intéresse !

  • # OpenMP

    Posté par  . Évalué à 3 (+1/-0). Dernière modification le 13/10/20 à 18:13.

    le support d'OpenMP5 a été amélioré

    Je ne connais pas bien OpenMP est une API qui est implémentée par les compilateurs ou une bibliothèque qui doit avoir un support dans les compilateurs ?

    Edit: un bout de recherche m'a permis de voir que c'était une API désolé pour le bruit

    • [^] # Re: OpenMP

      Posté par  (site Web personnel) . Évalué à 6 (+4/-0). Dernière modification le 13/10/20 à 20:49.

      D'un point de vue outil, le support OpenMP implique :

      1. du travail au niveau du front-end (parser les directives OpenMP, et les traduire en appels au runtime OpenMP)
      2. du travail au niveau runtime (implémenter à la fois les symboles standardisés de la bililiothèque, et ceux générés par le front-end)
      3. (optionnel, je suppose, mais c'est fait comme ça dans LLVM) modéliser la sémantique des symboles de la libomp, pour pouvoir optimiser certaines séquences
    • [^] # Re: OpenMP

      Posté par  . Évalué à 3 (+1/-0). Dernière modification le 20/10/20 à 11:33.

      Pour compléter la réponse de serge_sans_paille, OpenMP c'est 3 choses:

      1. Une collection de directives de compilation pour exprimer où le code doit être parallélisé ou sérialisé ;
      2. une API vers une bibliothèque pour pouvoir modifier le comportement du programme à l'exécution (changement de type d'ordonnancement en cours de route, utilisation de verrous explicites, changement du nombre de threads pour une région parallèle donnée, etc.) ;
      3. un ensemble de variables d'environnement paramétrables par l'utilisateur du programme compilé (pour préciser le nombre de threads dans le programme, comment les répartir sur la topologie sous-jacente, quel type d'ordonnancement adopter quand le programme spécifie que l'utilisateur peut choisir, si on peut passer par un GPU, etc.).
  • # Flang n'est pas encore vraiment opérationnel

    Posté par  (site Web personnel) . Évalué à 4 (+3/-0). Dernière modification le 13/10/20 à 22:11.

    Attention, Flang (aussi appelé f18) dans LLVM11 peut parser du code Fortran, mais il appelle un autre compilateur, par défaut gfortran, pour la compilation :

    $ f18 --help
    f18: LLVM Fortran compiler
    
    Usage: f18 [options] <input files>
    
    Defaults:
      When invoked with input files, and no options to tell
      it otherwise, f18 will unparse its input and pass that on to an
      external compiler to continue the compilation.
      The external compiler is specified by the F18_FC environment
      variable. The default is 'gfortran'.
      If invoked with no input files, f18 reads source code from
      stdin and runs with -fdebug-measure-parse-tree -funparse.
    
    ...
    

    Il faudra donc encore patienter.
    A noter que le paquet flang-11 est disponible dans la Fedora Rawhide :
    https://pkgs.org/download/flang

  • # Rust 1.47

    Posté par  . Évalué à 2 (+1/-0).

    La dernière version de Rust sortie la semaine dernière supporte également LLVM 11 comme back-end, et ça offre des gain appréciables en terme de rapidité de compilation (une partie étant en fait un correction de régressions causées par LLVM 10).

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n’en sommes pas responsables.