LLVM-16.0.5

Introduction à LLVM

Le paquet LLVM contient une collection de compilateur modulaire et réutilisable et des technologies de chaînes d'outils. Le cœur des bibliothèques Low Level Virtual Machine (LLVM) fournit un optimiseur moderne indépendant de la source et de la cible, ainsi que le support de génération de code pour beaucoup des processeurs populaires (ainsi que quelques autres moins courants !). Ces bibliothèques sont construites autour d'une représentation du code connu sous le nom de représentation LLVM intermédiaire ("LLVM IR").

Clang fournit de nouvelles interfaces C, C++, Objective C et Objective C++ pour LLVM et est requis par certains paquets de bureau comme firefox et pour Rust si vous le construisez avec le LLVM du système.

Le paquet Compiler RT fournit un nettoyeur à l'exécution et des bibliothèques de suivi pour les développeurs qui utilisent Clang et LLVM.

This package is known to build and work properly using an LFS 12.0 platform.

Informations sur le paquet

  • Téléchargement (HTTP) : https://github.com/llvm/llvm-project/releases/download/llvmorg-16.0.5/llvm-16.0.5.src.tar.xz

  • Téléchargement (FTP) :

  • Somme de contrôle MD5 : d9185fc007c32aea27a6de3c7c1eb90d

  • Taille du téléchargement : 54 Mo

  • Estimation de l'espace disque requis : 3,1 Go (938 Mo installé, plus 20 Go pour les tests et 308 Mo pour la documentation)

  • Estimation du temps de construction : 13 SBU (plus 8 SBU pour les tests, tous deux avec parallélisme = 8)

Téléchargements supplémentaires

Modules Cmake pour LLVM

Modules Cmake pour LLVM

Téléchargements recommandés

Clang

Téléchargements facultatifs

Compiler RT

Dépendances de LLVM

Requises

CMake-3.27.2

Facultatives

Doxygen-1.9.7, git-2.41.0, Graphviz-8.1.0, libxml2-2.10.4, Pygments-2.16.1, rsync-3.2.7 (pour les tests), recommonmark-0.7.1 (pour construire la documentation), texlive-20230313 (ou install-tl-unx), Valgrind-3.21.0, PyYAML-6.0.1, Zip-3.0, OCaml, psutil (pour les tests) et Z3

Installation de LLVM

Deux archives supplémentaires llvm-cmake.src.tar.xz et llvm-third-party.src.tar.xz sont requises par le système de construction de LLVM. Les développeurs en amont s'attendent à ce qu'elles soient extraites au même niveau que llvm-16.0.5.src.tar.xz et que les répertoires extraits soient renommés en cmake et third-party. Extrayez-les et modifiez le système de construction pour éviter de créer des répertoires aux noms ambiguës en dehors de la hiérarchie llvm-16.0.5.src :

tar -xf ../llvm-cmake.src.tar.xz                                   &&
tar -xf ../llvm-third-party.src.tar.xz                             &&
sed '/LLVM_COMMON_CMAKE_UTILS/s@../cmake@llvm-cmake.src@'          \
    -i CMakeLists.txt                                              &&
sed '/LLVM_THIRD_PARTY_DIR/s@../third-party@llvm-third-party.src@' \
    -i cmake/modules/HandleLLVMOptions.cmake

Installez clang dans l'arborescence des sources en exécutant les commandes suivantes :

tar -xf ../clang-16.0.5.src.tar.xz -C tools &&
mv tools/clang-16.0.5.src tools/clang

Si vous avez téléchargé compiler-rt, installez-le dans l'arborescence des sources en exécutant les commandes suivantes :

tar -xf ../compiler-rt-16.0.5.src.tar.xz -C projects &&
mv projects/compiler-rt-16.0.5.src projects/compiler-rt

Il y a plusieurs scripts Python dans ce paquet qui utilisent /usr/bin/env python pour accéder au Python du système qui sur LFS est Python-3.11.4. Utilisez la commande suivante pour corriger ces scripts :

grep -rl '#!.*python' | xargs sed -i '1s/python$/python3/'

Si vous avez téléchargé clang, appliquez le correctif suivant pour activer SSP par défaut dans les programmes compilés.

patch -Np2 -d tools/clang <../clang-16.0.5-enable_default_ssp-1.patch

Si vous avez téléchargé compiler-rt, corrigez un cas de test cassé par le SSP par défaut dans clang :

sed 's/clang_dfsan/& -fno-stack-protector/' \
    -i projects/compiler-rt/test/dfsan/origin_unaligned_memtrans.c

Installez LLVM en exécutant les commandes suivantes :

mkdir -v build &&
cd       build &&

CC=gcc CXX=g++                                  \
cmake -DCMAKE_INSTALL_PREFIX=/usr               \
      -DLLVM_ENABLE_FFI=ON                      \
      -DCMAKE_BUILD_TYPE=Release                \
      -DLLVM_BUILD_LLVM_DYLIB=ON                \
      -DLLVM_LINK_LLVM_DYLIB=ON                 \
      -DLLVM_ENABLE_RTTI=ON                     \
      -DLLVM_TARGETS_TO_BUILD="host;AMDGPU;BPF" \
      -DLLVM_BINUTILS_INCDIR=/usr/include       \
      -DLLVM_INCLUDE_BENCHMARKS=OFF             \
      -DCLANG_DEFAULT_PIE_ON_LINUX=ON           \
      -Wno-dev -G Ninja ..                      &&
ninja

Si vous avez installé recommonmark-0.7.1 et ses dépendances, vous pouvez générer la documentation html et les pages de manuel avec les commandes suivantes :

cmake -DLLVM_BUILD_DOCS=ON            \
      -DLLVM_ENABLE_SPHINX=ON         \
      -DSPHINX_WARNINGS_AS_ERRORS=OFF \
      -Wno-dev -G Ninja ..            &&
ninja docs-llvm-html  docs-llvm-man

La documentation de clang peut être aussi construite :

ninja docs-clang-html docs-clang-man

La suite de tests de LLVM peut produire de nombreux core dump. Ils occuperont un grand espace disque et le processus de gestion des core dump peut grandement ralentire les tests. Pour tester les résultats en désactivant les core dump, assurez-vous que Systemd-254 est reconstruit avec la prise en charge de Linux-PAM-1.5.3 et que la session de login actuelle a été démarrée après la mise à jour du fichier /etc/pam.d/system-session pour inclure pam_systemd.so puis exécutez :

systemctl   --user start dbus &&
systemd-run --user --pty -d -G -p LimitCORE=0 ninja check-all

Les tests sont construits avec tous les cœurs disponibles, mais lancés avec le nombre de cœurs en ligne (la différence c'est que les cœurs disponibles peuvent être limités avec taskset, mais les rendre hors ligne demande d'écrire 0 dans /sys/devices/system/cpu/cpu<N>/online en tant qu'utilisateur root et les rend temporairement indisponibles pour toutes les taches du système). Un test nommé Linux/clone_setns.cpp échouera si CONFIG_USER_NS n'est pas activé dans la configuration du noyau. Les tests nommés AtoiAndFriendsOOBTest, StrtolOOBTest, StrtollOOBTest, interception_malloc_test.cpp et scanf-allocate.cpp sont connus pour échouer avec Glibc-2.38.

Maintenant, en tant qu'utilisateur root :

ninja install &&
cp bin/FileCheck /usr/bin

Si vous avez construit la documentation de llvm, elle a été installée par la commande précédente, mais elle doit être déplacée. En tant qu'utilisateur root :

install -v -d -m755 /usr/share/doc/llvm-16.0.5            &&
mv -v /usr/share/doc/LLVM/llvm /usr/share/doc/llvm-16.0.5 &&
rmdir -v --ignore-fail-on-non-empty /usr/share/doc/LLVM

Si vous avez construit la documentation de clang, elle a été installée, mais doit aussi être déplacée. De nouveau, en tant qu'utilisateur root :

install -v -d -m755 /usr/share/doc/llvm-16.0.5             &&
mv -v /usr/share/doc/LLVM/clang /usr/share/doc/llvm-16.0.5 &&
rmdir -v --ignore-fail-on-non-empty /usr/share/doc/LLVM

Explication des commandes

-DLLVM_ENABLE_FFI=ON : Ce paramètre permet à LLVM d'utiliser libffi.

-DLLVM_BUILD_LLVM_DYLIB=ON : ce paramètre construit les bibliothèques en statique et les lie toutes en une unique bibliothèque partagée. C'est la méthode recommandée pour la construction de la bibliothèque partagée.

-DCMAKE_BUILD_TYPE=Release : ce paramètre active les optimisations du compilateur pour augmenter la vitesse du code et diminuer sa taille. Il désactive aussi quelques vérifications de compilation, non nécessaires à un système en production.

-DLLVM_TARGETS_TO_BUILD="host;AMDGPU;BPF" : ce paramètre active la construction de la même cible que l'hôte, et aussi pour le GPU r600 AMD utilisé par les pilotes r600 et radeonsi de Mesa. La cible BPF est reqise pour construire v4l-utils-1.24.1. Par défaut tout est activé. Vous pouvez indiquer une liste de cibles séparées par des virgules. Les cibles valides sont : host, X86, Sparc, PowerPC, ARM, AArch64, Mips, Hexagon, Xcore, MSP430, NVPTX, SystemZ, AMDGPU, BPF, CppBackend ou all.

-DLLVM_LINK_LLVM_DYLIB=ON : utilisé avec -DLLVM_BUILD_LLVM_DYLIB=ON, ce paramètre active la liaison des outils avec la bibliothèque partagée plutôt que des bibliothèques statiques. Il réduit aussi légèrement leur taille et s'assure également que llvm-config utilisera bien libLLVM-16.so.

-DLLVM_ENABLE_RTTI=ON : ce paramètre est utilisé pour construire LLVM avec des informations de type à l'exécution. Cela est requis pour la construction de Mesa-23.1.6.

-DLLVM_BINUTILS_INCDIR=/usr/include : ce paramètre est utilisé pour dire au système de construction où se trouvent les en-têtes de binutils, installés dans LFS. Cela permet la construction de LLVMgold.so, qui est nécessaire pour construire les programmes avec clang et l'optimisation à l'édition des liens (LTO).

-DLLVM_INCLUDE_BENCHMARKS=OFF : est utilisé pour désactiver la génération des cibles de construction pour les tests de rapidité de LLVM. Cette option nécessite du code supplémentaire qui n'est actuellement pas disponible.

-DCLANG_DEFAULT_PIE_ON_LINUX=ON : rend l'option -fpie active par défaut lors de la compilation des programmes. Avec la fonctionnalité ASLR du noyau, cela empêche certains types d'attaques basées sur la connaissance de la disposition de l'espace mémoire.

-DBUILD_SHARED_LIBS=ON : S'il est utilisé à la place de -DLLVM_BUILD_LLVM_DYLIB=ON et -DLLVM_LINK_LLVM_DYLIB=ON, ce paramètre construit les bibliothèques LLVM (environ 60) en tant que bibliothèques partagées plutôt que statiques.

-DLLVM_ENABLE_DOXYGEN : Active la génération de la documentation HTML navigable si vous avez installé Doxygen-1.9.7. Vous devriez lancer make doxygen-html ensuite, et installer la documentation générée à la main.

Contenu

Programmes installés: amdgpu-arch, analyze-build, bugpoint, c-index-test, clang, clang++ (liens symboliques vers clang-16), clang-16, clang-check, clang-cl, clang-cpp (les deux derniers sont des liens symboliques vers clang), clang-extdef-mapping, clang-format, clang-linker-wrapper, clang-offload-bundler, clang-offload-packager, clang-refactor, clang-rename, clang-repl, clang-scan-deps, diagtool, dsymutil, FileCheck, git-clang-format, hmaptool, intercept-build, llc, lli, llvm-addr2line (lien symbolique vers llvm-symbolizer), llvm-ar, llvm-as, llvm-bcanalyzer, llvm-bitcode-strip (lien symbolique vers llvm-objcopy), llvm-cat, llvm-cfi-verify, llvm-config, llvm-cov, llvm-c-test, llvm-cvtres, llvm-cxxdump, llvm-cxxfilt, llvm-cxxmap, llvm-debuginfo-analyzer, llvm-debuginfod, llvm-debuginfod-find, llvm-diff, llvm-dis, llvm-dlltool (lien symbolique vers llvm-ar), llvm-dwarfdump, llvm-dwarfutil, llvm-dwp, llvm-exegesis, llvm-extract, llvm-gsymutil, llvm-ifs, llvm-install-name-tool (lien symbolique vers llvm-objcopy), llvm-jitlink, llvm-lib (lien symbolique vers llvm-ar), llvm-libtool-darwin, llvm-link, llvm-lipo, llvm-lto, llvm-lto2, llvm-mc, llvm-mca, llvm-ml, llvm-modextract, llvm-mt, llvm-nm, llvm-objcopy, llvm-objdump, llvm-opt-report, llvm-otool (lien symbolique vers llv-objdump), llvm-pdbutil, llvm-profdata, llvm-profgen, llvm-ranlib (lien symbolique vers llvm-ar), llvm-rc, llvm-readelf (lien symbolique vers llvm-readobj), llvm-readobj, llvm-reduce, llvm-remark-size-diff, llvm-remarkutil, llvm-rtdyld, llvm-sim, llvm-size, llvm-split, llvm-stress, llvm-strings, llvm-strip (lien symbolique vers llvm-objcopy), llvm-symbolizer, llvm-tapi-diff, llvm-tblgen, llvm-tli-checker, llvm-undname, llvm-windres (lien symbolique vers llvm-rc), llvm-xray, nvptx-arch, opt, sancov, sanstats, scan-build, scan-build-py, scan-view, split-file et verify-uselistorder
Bibliothèques installées: libLLVM.so, libLLVM*.a (100 bibliothèques), libLTO.so, libRemarks.so, libclang.so, libclang-cpp.so, libclang*.a (42 bibliothèques) et LLVMgold.so
Répertoires installés: /usr/include/{clang,clang-c,llvm,llvm-c}, /usr/lib/{clang,cmake/{clang,llvm},libear,libscanbuild}, /usr/share/{clang,opt-viewer,scan-build,scan-view} et /usr/share/doc/llvm-16.0.5

Descriptions courtes

amdgpu-arch

liste les GPU AMD installés. Il a besoin de libhasa-runtime64.so à l'exécution, qui ne fait pas partie de BLFS

analyze-build

est un outil d'analyse statique

bugpoint

est l'outil de réduction de cas de test automatique

c-index-test

est utilisé pour tester l'API libclang et montrer son utilisation

clang

est le compilateur Clang C, C++ et Objective-C

clang-check

est un outil pour effectuer une analyse de code statique et afficher des arbres de syntaxe abstraite (AST)

clang-extdef-mapping

est un outil pour récupérer le nom USR et l'emplacement des définitions externes dans un fichier source

clang-format

est un outil pour formater du code C/C++/Java/JavaScript/Objective-C/Protobuf

clang-linker-wrapper

est une enveloppe autour de l'éditeur des liens de l'hôte

clang-offload-bundler

est un outil pour rassembler/désassembler des fichiers reçus d'OpenMP associés avec un fichier source commun

clang-offload-packager

est un outil pour regrouper plusieurs fichiers objets en un seul binaire, qui peut ensuite être utilisé pour créer un gros binaire contenant du code de déchargement

clang-refactor

est un outil de réusinage basé sur Clang pour C, C++ et Objective-C

clang-rename

est un outil pour renommer des symboles dans les programmes C/C++

clang-scan-deps

est un outil pour scanner les dépendances dans un fichier source

diagtool

est une combinaison d'outils pour gérer les diagnostics de clang

FileCheck

est un outil qui lit deux fichiers (un depuis l'entrée standard, un spécifié en ligne de command) et utiliser l'un pour vérifier l'autre.

dsymutil

et un outil utilisé pour manipuler les fichiers de symboles de débogage DWARF archivés, compatible avec la commande Darwin dsymutil

git-clang-format

lance clang-format sur des correctifs générés par git (requiert git-2.41.0)

hmaptool

est un outil Python pour décharger et construire des correspondances d'en-têtes

intercept-build

génère une base de données des commandes de construction pour un projet

llc

est le compilateur statique LLVM

lli

est utilisé pour exécuter directement des programmes en bytecode LLVM

llvm-addr2line

est un outil utilisé pour convertir les adresses en noms de fichiers et en numéro de ligne

llvm-ar

est le créateur d'archive de LLVM

llvm-as

est l'assembleur de LLVM

llvm-bcanalyzer

est l'analyseur de bytecode LLVM

llvm-bitcode-strip

supprime le bitcode LLVM d'un objet

llvm-cat

est un outil pour concaténer des modules llvm

llvm-cfi-verify

identifie si les l'intégrité du flot de contrôle protège toutes les instructions de flot de contrôle indirect dans le fichier objet, DSO ou binaire fournit

llvm-config

Affiche les options de compilation de LLVM

llvm-cov

est utilisé pour émettre des informations de couverture

llvm-c-test

est un désassembleur de bytecode

llvm-cvtres

est un outil pour convertir des fichiers de resource Microsoft en COFF

llvm-cxxdump

est utilisé pour l'afficheur de donnée C++ ABI

llvm-cxxfilt

est utilisé pour réassembler les symboles C++ dans le code llvm

llvm-cxxmap

est utilisé pour réassembler les symboles C++ mutilés

llvm-debuginfo-analyzer

affiche une représentation logique des informations de débogage bas niveau

llvm-debuginfod

est un service qui fournit les informations de débogage sur une API HTTP pour l'analyse de binaires nettoyés

llvm-debuginfod-find

est une interface au démon llvm-debuginfod pour trouver des artéfact debuginfod

llvm-diff

est le diff de LLVM

llvm-dis

est le désassembleur LLVM

llvm-dwarfdump

affiche le contenu des sections DWARF dans les fichiers objet

llvm-dwarfutil

est un outil pour copier et manipuler des infos de débogage

llvm-dwp

fusionne des fichiers DWARF séparés

llvm-elfabi

est utilisé pour lire des informations sur l'ABI d'un binaire ELF

llvm-exegesis

est un outil de test de performance qui utilise les informations disponibles dans LLVM pour mesurer les caractéristiques des instructions de la machine hôte comme la latence ou le décomposition de port

llvm-extract

est utilisé pour extraire une fonction depuis un module LLVM

llvm-gsymutil

est utilisé pour traiter des fichiers au format de symbolisme GSYM qui converti les adresses mémoires en noms de fonction et en numéro de ligne de fichier. Ces fichiers sont plus petits que les fichiers DWARF et Breakpad

llvm-ifs

est utilisé pour fusionner les interfaces avec les fichiers objets

llvm-install-name-tool

est utilisé pour réécrire les commandes de chargement vers le format binaire MachO

llvm-jitlink

est utilisé pour analyser des fichiers objet relocalisables pour rendre leur contenu exécutable dans un processus cible

llvm-libtool-darwin

fournit les fonctions libtool de base sur les systèmes Darwin. C'est surtout utile si vous générez des binaires pour les systèmes macOS

llvm-link

est le linker LLVM

llvm-lipo

est utilisé pour créer des binaires universels à partir de fichiers MachO

llvm-lto

est l'éditeur de lien LLVM LTO (optimisation à l'édition de lien)

llvm-lto2

est un banc de test pour l'interface LTO basée sur la résolution

llvm-mc

est un assembleur / désassembleur de code machine distinct

llvm-mca

est un outil d'analyse de performance pour mesurer statiquement les performances du code machine

llvm-ml

est un analyseur pour le balisage de code machine

llvm-modextract

est un outil pour extraire un module de fichiers de code binaire multi-modules

llvm-mt

est un outil pour générer des fichiers et des catalogues signés à partir d'un manifeste d'assemblage (utilisé par le SDK de Microsoft)

llvm-nm

est utilisé pour lister les tables de symboles des fichiers objets et bytecode LLVM

llvm-objcopy

est la version de LLVM d'un outil objcopy

llvm-objdump

est un afficheur de fichiers objets LLVM

llvm-opt-report

est un outil pour générer un rapport d'optimisation depuis les fichiers d'enregistrement d'optimisations YAML

llvm-pdbutil

est un afficheur de PDB (Program Database). PDB est un format de Microsoft

llvm-profdata

est un petit outil pour manipuler et afficher des fichiers de données de profil

llvm-profgen

génère les informations de profilage SPGO de LLVM

llvm-ranlib

est utilisé pour générer un index pour une archive LLVM

llvm-rc

est un outil indépendant de la plateforme pour compiler des scripts de ressources en fichiers de ressources binaires

llvm-readobj

affiche des informations bas niveau et spécifiques au format à propos de fichiers objets

llvm-reduce

est utilisé pour automatiquement réduire les cas de tests lors du lancement d'une suite de tests

llvm-remark-size-diff

rapporte les différences en nombre d’instruction et taille de pile entre deux fichiers remark

llvm-remarkutil

convertit les fichiers remark entre un bitstream et YAML ou affiche les information du nombre d'instruction par fonction dans les fichiers remark

llvm-rtdyld

est l'outil MC-JIT LLVM

llvm-size

est l'afficheur de taille d'objet de LLVM

llvm-split

est le séparateur de module de LLVM

llvm-stress

est utilisé pour générer des fichier .ll aléatoires

llvm-strings

affiche les chaînes contenues dans un binaire (fichier objet, exécutable ou bibliothèque archivée)

llvm-symbolizer

convertit des adresses en emplacements dans le code source

llvm-tblgen

est le générateur de code C++ depuis la description de la cible de LLVM

llvm-tli-checker

est le vérificateur TargetLibraryInfo contre SDK de LLVM

llvm-undname

est un outil pour recomposer les noms

llvm-xray

est une implémentation du système de traçage des appels de fonction XRay de Google

nvptx-arch

liste les GPU NVIDIA installés. À l'exécution il a besoin de libcuda.so qui ne fait pas partie de BLFS

opt

est l'optimiseur LLVM

sancov

est l'outil de traitement de la couverture du simplificateur

sanstats

est l'outil de traitement de la couverture du simplificateur

scan-build

est un script Perl qui invoque l'analyseur statique Clang

scan-build-py

est un script Python qui invoque l'analyseur statique de Clang

scan-view

est une visonneuse de résultats d'analyse statique de Clang

split-file

sépare un fichier d'entrée en plusieurs parties séparées par des expressions régulières

verify-uselistorder

est l'outil de LLVM pour vérifier l'ordre d'utilisation des listes