web-dev-qa-db-fra.com

Comment faire clang compile to llvm IR

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.

129
pythonic

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 .

177
Eli Bendersky

Utilisation

clang -emit-llvm -o foo.bc -c foo.c
clang -o foo foo.bc
20
Christoph

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.

18
Jeremy Salwen

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):

  1. générer tout .ll des dossiers

    clang-3.8 -S -emit-llvm *.c
    
  2. les lier en un seul

    llvm-link-3.8 -S -v -o single.ll *.ll
    
  3. (Facultatif) Optimisez votre code (peut-être une analyse d'alias)

    opt-3.8 -S -O3 -aa -basicaaa -tbaa -licm single.ll -o optimised.ll
    
  4. Generate Assembly (génère un optimised.s fichier)

    llc-3.8 optimised.ll
    
  5. Créer un exécutable (nommé a.out)

    clang-3.8 optimised.s
    
11
Kiko Fernandez

Avez-vous lu clang documentation ? Vous êtes probablement à la recherche de -emit-llvm.

11
rotoglup