URL: https://linuxfr.org/news/llvm-3-2-et-clang-3-2-publies Title: LLVM 3.2 et Clang 3.2 publiés Authors: yogitetradim Sylvestre Ledru, rewind, Nÿco, tuiu pol, claudex, Bruno Michel, Pierre Jarillon et NeoX Date: 2012年12月20日T22:06:19+01:00 License: CC By-SA Tags: objective-c Score: 51 [LLVM](http://fr.wikipedia.org/wiki/LLVM "Définition Wikipédia") (à l'origine Low Level Virtual Machine) est une machine virtuelle principalement destinée à la mise au point des langages informatiques. Clang est un compilateur basé sur LLVM. Il vise à compiler à la fois le C, C++ et Objective-C. Signe de son actuelle maturité, il devrait être le compilateur C par défaut de [FreeBSD 10](http://www.phoronix.com/scan.php?page=news_item&px=MTEwMj) Sept mois après la [dernière mouture](http://linuxfr.org/news/llvm-3-1-et-conference-euro-llvm-2012), la suite LLVM sort dans sa version 3.2. Au programme de nombreuses corrections de bugs et [améliorations](http://www.phoronix.com/scan.php?page=article&item=llvm_clang32_final&num=1) dans l'optimisation du code, notamment avec une meilleure prise en charge des nouveaux [jeux d'instructions](http://www.phoronix.com/scan.php?page=news_item&px=MTI1Mjg) , une meilleure [vectorisation](http://www.phoronix.com/scan.php?page=news_item&px=MTI0NjM) et enfin, une modification du back-end avec le compilateur [Nvidia](http://www.phoronix.com/scan.php?page=news_item&px=MTI1NDU). NdM : *Merci à [Nÿco](http://linuxfr.org/users/nyco), [Pierre Jarillon](http://linuxfr.org/users/jarillon), [Sylvestre Ledru](http://linuxfr.org/users/grayswandir), [Bruno Michel](http://linuxfr.org/users/nono) et [rewind](http://linuxfr.org/users/rewind) pour leur participation à la rédaction de cette dépêche.* ---- [Note de publication de LLVM 3.2](http://llvm.org/releases/3.2/docs/ReleaseNotes.html) [Les présentations de la LLVM compilers meeting](http://llvm.org/devmtg/2012-11/) [Note de publication de Clang 3.2](http://llvm.org/releases/3.2/tools/clang/docs/ReleaseNotes.html) ---- # LLVM ## Vectorisation Une nouvelle [vectorisation des boucles](http://blog.llvm.org/2012/12/new-loop-vectorizer.html) a été mise en place. La vectorisation consiste à utiliser des instructions avancées, type MMX ou SSE, qui agissent sur des ensembles de valeurs plutôt qu'une seule valeur à la fois. LLVM disposait déjà d'une [vectorisation au niveau des blocs de base](http://linuxfr.org/news/llvm-3-1-et-conference-euro-llvm-2012#toc_13), c'est-à-dire que des instructions vectorielles viennent remplacer des ensembles d'instructions localement. Avec la vectorisation des boucles, il s'agit d'identifier des boucles dont les opérations peuvent être faites en parallèle grâce à des instructions vectorielles. Les premiers benchmarks montrent une accélération entre 2 et 3 fois par rapport à un code normal. ## Nouveau backend PTX [_Parallel Thread eXecution_ (PTX)](http://en.wikipedia.org/wiki/Parallel_Thread_Execution) est un langage assembleur créé par NVidia pour [CUDA](http://fr.wikipedia.org/wiki/CUDA "Définition Wikipédia"). Il sert d'intermédiaire entre le programme CUDA (un dérivé de C) et le code binaire qui est utilisé par la carte graphique. Le programme `nvcc` transforme le code CUDA en assembleur PTX puis le pilote de la carte compile l'assembleur PTX en code binaire. LLVM permet de générer de l'assembleur PTX. C'est NVidia qui a développé cette partie après avoir [fait le choix de LLVM](http://blog.llvm.org/2011/12/nvidia-cuda-41-compiler-now-built-on.html) pour leur chaîne de compilation. Ce nouveau backend vient remplacer l'ancien qui était expérimental. ## Amélioration de la génération de code L'ensemble d'instructions vectorielles AVX2 a été amélioré pour les architectures x86 et amd64. Un assembleur complet pour ARM est maintenant complètement intégré à LLVM. La génération de code pour les architectures [MIPS](http://fr.wikipedia.org/wiki/Architecture_MIPS) et [PowerPC](http://www.phoronix.com/scan.php?page=news_item&px=MTIzNTE) a été grandement améliorée. ## En vrac La [documentation](http://llvm.org/docs/) de LLVM est maintenant gérée à l'aide de [Sphinx](http://sphinx.pocoo.org/). # Clang # ## Amélioration des diagnostics ## ### -Wuninitialized ### Avec la fonction suivante, ```c int f(int b) { int n; if (b) n = 1; return n; } ``` L'utilisation de Clang avec l'argument _-Wuninitialized_ produira les messages d'erreur suivants : ```sh $ clang -c -Wuninitialized foo.c foo.c:3:7: warning: variable 'n' is used uninitialized whenever 'if' condition is false [-Wsometimes-uninitialized] if (b) ^ foo.c:5:10: note: uninitialized use occurs here return n; ^ foo.c:3:3: note: remove the 'if' if its condition is always true if (b) ^~~~~~ foo.c:2:8: note: initialize the variable 'n' to silence this warning int n; ^ = 0 1 warning generated. ``` ## Attribut `tls_model` Le nouvel attribut `tls_model` permet de spécifier le [modèle mémoire](http://www.akkadia.org/drepper/tls.pdf) utilisé pour les variables locales à un thread (_Thread-Local Storage_). Cet attribut est spécifique à Clang mais peut être utile pour ceux qui ont des besoins très précis. ## Attribut pour la sûreté des types Certaines API permettent de passer des données à l'aide d'un pointeur générique `void*`, tout en précisant le type de données à l'aide d'un paramètre. C'est par exemple le cas pour l'[API MPI](http://www.idris.fr/data/cours/parallel/mpi/mpi_aide_memoire_C.html) qui dispose d'un type `MPI_Datatype` pour spécifier le type au bout du pointeur. LLVM permet désormais de pouvoir vérifier si le pointeur passé en paramètre est du bon type par rapport au paramètre de typage. Pour cela, un ensemble d'attributs permet d'identifier quel paramètre est le pointeur et quel paramètre est le type. Les paramètres des fonctions `fcntl()` et `ioctl()` sont également gérés de la même manière. ## Gestion des commentaires de documentation Clang permet maintenant, grâce à l'option `-Wdocumentation`, de gérer les commentaires de documentation (au format Doxygen) et de s'assurer de leur cohérence avec le code. Voir le [compte-rendu de la présentation faite à la Rencontre des développeurs LLVM 2012 à ce sujet](http://linuxfr.org/news/rencontre-des-developpeurs-llvm-2012#toc_2). ## Prise en charge de C11 et C++11 Clang gère maintenant le mot-clef `_Alignof` introduit dans C11. La prise en charge de C++11 est, quant à elle, [presque complète](http://clang.llvm.org/cxx_status.html#cxx11), elle s'est vue ajouter la déclaration avancée (_forward declaration_) des `enum`. # Debian # [LLVM](http://packages.debian.org/sid/llvm-3.2) et [Clang](http://packages.debian.org/experimental/clang) 3.2 sont aussi déjà disponibles dans Debian.

AltStyle によって変換されたページ (->オリジナル) /