Je veux que Clang compile mon C/C++
code à LLVM
bytecode plutôt qu’un exécutable binaire. Comment puis-je y arriver? Et si j’obtiens le bytecode LLVM
, comment puis-je le prendre pour le compiler davantage en exécutable binaire.
Fondamentalement, je veux ajouter une partie de mon propre code au bytecode LLVM
avant la compilation en exécutable binaire.
Avec un fichier C/C++ foo.c
:
> clang -S -emit-llvm foo.c
Produit foo.ll
, Qui est un fichier LLVM IR.
L'option -emit-llvm
Peut également être passée directement au serveur frontal du compilateur, et non au pilote à l'aide de -cc1
:
> clang -cc1 foo.c -emit-llvm
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 ultérieurement dans Assembly, utilisez l’outil llc
:
> llc foo.ll
Produit foo.s
Avec Assembly (par défaut, l’architecture de la machine sur laquelle vous l’exécutez). llc
est l'un des outils de LLVM - voici sa documentation .
Utilisation
clang -emit-llvm -o foo.bc -c foo.c
clang -o foo foo.bc
Si vous avez plusieurs fichiers source, vous voudrez probablement utiliser l'optimisation temps-lien pour générer un fichier bitcode pour l'ensemble du programme. Les autres réponses données vous permettront de vous retrouver avec un fichier bitcode pour chaque fichier source.
Au lieu de cela, vous voulez compiler avec l'optimisation temps-lien
clang -flto -c program1.c -o program1.o
clang -flto -c program2.c -o program2.o
et pour la dernière étape de liaison, ajoutez l'argument -Wl, -plugin-opt = also-emit-llvm
clang -flto -Wl,-plugin-opt=also-emit-llvm program1.o program2.o -o program
Cela vous donne les deux un programme compilé et le bitcode correspondant (programme.bc). Vous pouvez ensuite modifier program.bc comme bon vous semble, et recompiler le programme modifié à tout moment en faisant
clang program.bc -o program
sachez toutefois que vous devez à nouveau inclure tous les indicateurs de l'éditeur de liens nécessaires (pour les bibliothèques externes, etc.).
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 de liens nommé "ld" dans un répertoire spécial appelé "fakebin" quelque part sur votre ordinateur, puis ajoutez l'option
-B/home/jeremy/fakebin
à toutes les étapes de liaison ci-dessus.
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 version):
générer tout .ll
des dossiers
clang-3.8 -S -emit-llvm *.c
les lier en un seul
llvm-link-3.8 -S -v -o single.ll *.ll
(Facultatif) Optimisez votre code (peut-être une analyse d'alias)
opt-3.8 -S -O3 -aa -basicaaa -tbaa -licm single.ll -o optimised.ll
Generate Assembly (génère un optimised.s
fichier)
llc-3.8 optimised.ll
Créer un exécutable (nommé a.out
)
clang-3.8 optimised.s
Avez-vous lu clang
documentation ? Vous êtes probablement à la recherche de -emit-llvm
.