Le projet LLVM est surtout connu pour son compilateur C/C++/ObjC : clang. LLVM offre cependant beaucoup plus qu'un compilateur. Cette présentation sera une brève introduction aux différents outils disponibles pour la programmation en C++: indexation, formatage, analyse statique, annotations, réécriture de code source, ...
2. LLVM, Clang & C++
Présentation du projet
Clang
Instrumentation
Complétion & Indexation
Formatage de code source
Analyse statique
Réécriture de code source
3. Le projet LLVM
● Ce n’est plus un acronyme !
● Collection modulaire de composants réutilisables liés à la
compilation :
○ LLVM Core : optimiseurs IR, génération de code
○ Clang: compilateur C/C++/ObjC
○ LLDB: debugger
○ libcxx: implémentation de la librairie standard C++11/14
○ …
● Licence de style BSD
● http://www.llvm.org
4. Clang
● Compilateur C, C++ (C++98,11 & 14), ObjC :
○ rapide + faible consommation mémoire
○ diagnostiques expressifs
○ compatible gcc
○ parser unifié C, C++, ObjC
● environ 855k lignes de C++11 (stats ohloh)
● conception modulaire: librairies réutilisables
○ lldb
○ exemples de réutilisation dans la suite de la présentation !
● Plateforme:
○ OS: MacOS, Linux, BSD, Windows
○ arch: x86, arm
● Quelques annonces récentes :
○ le compilateur v6 de ARM est basé sur LLVM + Clang
○ le prochain compilateur d’Intel utilise Clang mais garde son propre backend
● http://clang.llvm.org
5. Instrumentation (i.e. sanitizers)
● Contribué par Google (pour Clang & GCC)
● Instrumentation à la compilation pour vérifier à l'exécution :
○ asan : Use-after-{free,return}, {heap,stack,global}-buffer-overflow
○ tsan : détection de course de données, ordre d’initialisation des globaux
○ msan : lecture de mémoire non initialisée
○ ubsan : comportement non définis par la norme
● Objectif:
○ vitesse
○ pas de faux positifs
● Démo: asan
6. Complétion & Indexation
● Clang fournit la libclang
○ libclang donne accès à l’AST d’une unité de compilation
○ l’utilisateur peut parcourir l’AST pour faire ses propres analyses et/ou
traitements sur le code source
○ En fonction du contexte d’un curseur, libclang fournit les complétions
possibles
● Plus besoin de développer son propre parser C++11 !
● Démo: vim+clang_complete
○ complétion
○ indexation
7. Formatage de code source
● Le formatage, c’est important !
● Formatage != indentation
● Pas si simple que ça a implémenter
○ les algos pour le retour à la ligne ressemblent beaucoup à ceux de TeX
● Fonctionnalité dans libFormat
● Utilisé en différentes incarnations: clang-format,
clang-format-diff, plugins Emacs/Vim/VS/…
● Démo: vim+clang_format
8. Analyse statique
● Analyse statique != compilation
● Clang propose un moteur d’analyse statique:
○ Démo : clang --analyze
● Clang propose aussi un outil pour rajouter “simplement” ses
propres vérifications, au niveau AST et/ou utilisant le moteur
d’analyse statique si besoin est :
○ Démo : clang-tidy
9. Réécriture de code source
● Les bases de code de LLVM / Clang étaient en C++98
● Problème : comment les faire migrer vers C++11 ?
○ A la main...
○ Anticiper les évolutions du C++
○ Utiliser des outils
● Démo : clang-modernize