Je veux que clang compile mon C/C++
code en LLVM
bytecode plutôt qu'en exécutable binaire. Comment puis-je y parvenir? Et si j'obtiens le LLVM
bytecode, comment puis-je l'utiliser pour le compiler davantage en exécutable binaire.
En gros, je veux ajouter une partie de mon propre code au LLVM
bytecode avant de compiler en exécutable binaire.
Réponses:
Étant donné un fichier C / C ++
foo.c
:Produit
foo.ll
qui est un fichier LLVM IR.L'
-emit-llvm
option peut également être transmise directement au front-end du compilateur, et non au pilote au moyen de-cc1
:Produit
foo.ll
avec l'IR.-cc1
ajoute des options intéressantes comme-ast-print
. Consultez-cc1 --help
pour plus de détails.Pour compiler LLVM IR suite à l'assemblage, utilisez l'
llc
outil:Produit
foo.s
avec l'assemblage (par défaut, l'architecture de la machine sur laquelle vous l'exécutez).llc
est l'un des outils LLVM - voici sa documentation .la source
Utilisation
la source
.o
devrait faire référence aux fichiers d'objets binaires,.s
aux fichiers d'assemblage et autre chose (par convention.ll
) aux fichiers LLVM IR. Sinon, il est facile de se tromper. Clang / LLVM n'ont plus d'éditeur de liens pour les objets binaires (bien qu'il y en ait un en préparation). L'éditeur de liens LLVMllvm-ld
joint simplement plusieurs fichiers IR en un seul.bc
est utilisé; aussi, gardez à l'esprit que celallvm-ld
peut servir d'interface pour la chaîne d'outils système, c'est-à-dire que ma réponse précédente en utilisantllvm-ld -native
devrait fonctionner comme prévu ....foo.bc
est un fichier bitcode LLVMclang -emit-llvm -o test.bc -c test.c && file test.bc: test.bc: LLVM IR bitcode
.Si vous avez plusieurs fichiers source, vous souhaitez probablement utiliser l'optimisation du temps de liaison pour générer un fichier bitcode pour l'ensemble du programme. Les autres réponses données vous feront vous retrouver avec un fichier bitcode pour chaque fichier source.
Au lieu de cela, vous souhaitez compiler avec l'optimisation du temps de liaison
et pour la dernière étape de liaison, ajoutez l'argument -Wl, -plugin-opt = also-emit-llvm
Cela vous donne à la fois un programme compilé et le bitcode correspondant (program.bc). Vous pouvez ensuite modifier program.bc comme vous le souhaitez et recompiler le programme modifié à tout moment en faisant
mais sachez que vous devez inclure à nouveau tous les indicateurs de l'éditeur de liens nécessaires (pour les bibliothèques externes, etc.) à cette étape.
Notez que vous devez utiliser l'éditeur de liens Gold pour que cela fonctionne. Si vous voulez forcer clang à utiliser un éditeur de liens spécifique, créez un lien symbolique vers cet éditeur nommé "ld" dans un répertoire spécial appelé "fakebin" quelque part sur votre ordinateur, et ajoutez l'option
à toutes les étapes de liaison ci-dessus.
la source
Si vous avez plusieurs fichiers et que vous ne voulez pas avoir à taper chaque fichier, je vous recommande de suivre ces étapes simples (j'utilise
clang-3.8
mais vous pouvez utiliser n'importe quelle autre version):générer tous les
.ll
fichiersliez-les en un seul
(Facultatif) Optimisez votre code (peut-être une analyse d'alias)
Générer l'assemblage (génère un
optimised.s
fichier)Créer un exécutable (nommé
a.out
)la source
-S
option (à l'étape 2), je précise que je souhaite produire la sortie en LLVM IR. Fondamentalement, mettez tous les fichiers * .ll en un seul. Je fais cela pour vérifier que les optimisations changent vraiment le code, c'est-àsingle.ll
- dire etoptimised.ll
devraient maintenant avoir un aspect différent (au niveau du code) et vous pouvez également afficher le rapport pour voir s'il y a une différence.-basicaaa
est un mauvais drapeau,-basicaa
doit être utilisé à la place.Avez-vous lu la
clang
documentation ? Vous recherchez probablement-emit-llvm
.la source