11
votes

Analyse et modification du code IRL LLVM

Je veux lire (parse) LLVM IR code (qui est enregistré dans un fichier texte) et ajouter une partie de mon propre code à celui-ci. J'ai besoin d'un exemple de faire cela, c'est-à-dire comment cela se fait en utilisant les bibliothèques fournies par LLVM à cet effet. Donc, fondamentalement, ce que je veux, c'est lire dans le code IR à partir d'un fichier texte dans la mémoire (peut-être que la bibliothèque LLVM ne représente-elle pas dans la forme ast, je ne sais pas), apportez des modifications, telles que l'ajout de plus de nœuds dans l'AST, puis enfin écrire Retourner l'AST dans le fichier texte IR.

Bien que j'ai besoin de lire et de modifier le code IR, j'apprécie grandement si quelqu'un pouvait fournir ou me référer à un exemple qui vient de lire (par exemple).


0 commentaires

5 Réponses :


1
votes

Le moyen le plus simple de le faire consiste à examiner l'un des outils existants et de voler du code. Dans ce cas, vous voudrez peut-être examiner la source de LLC. Cela peut prendre un code de bit ou un fichier .ll en entrée. Vous pouvez modifier le fichier d'entrée n'importe quand que vous souhaitez, puis écrivez le fichier à l'aide de quelque chose de similaire au code de LLVM-DI si vous souhaitez un fichier texte.


0 commentaires

2
votes

Ceci est généralement fait en implémentant une passe / transformation LLVM. De cette façon, vous n'avez pas à analyser l'IR du tout parce que LLVM le fera pour vous et vous opérerez sur une représentation en mémoire orientée objet de l'IR.

Ce est le point d'entrée pour écrire une passe LLVM. Ensuite, vous pouvez regarder l'une des passes standard déjà implémentées qui viennent groupées avec LLVM (regardez dans lib / transforme ).


2 commentaires

Ce serait ce que je ferai finalement. Mais à ce moment, depuis que je suis en train d'apprendre, je veux pouvoir voir les fichiers IR dans les fichiers texte.


Je ne vois pas le problème. La plupart des outils LLVM peuvent lire / écrire la représentation textuelle de l'IR. En particulier, émettre la représentation textuelle, ajoutez l'interrupteur -s à votre ligne de commande. (Aussi, rappelez-vous toujours que la représentation binaire et textuelle est absolument équivalente).



1
votes

L'outil opt prend le code IRL LLVM, exécute une transmission dessus, puis cracez une IR transformée de LLVM de l'autre côté.

Le piratage le plus facile à démarrer est lib \ Transforms \ Hello \ Hello.cpp. Hack It, courir en option avec votre fichier source comme entrée, inspecter la sortie.

En dehors de cela, les Docs pour écriture sont vraiment assez bons.


0 commentaires

28
votes

Premièrement, pour résoudre un malentendu évident: LLVM est un cadre de manipulation de code dans le format IR. Il n'y a pas de asts en vue (*) - vous lisez ir, transformez / manipulez-le / analysez-le, et vous écrivez IR Retour.

lecture ir est vraiment simple: p>

 some_stream << *Mod;


4 commentaires

Merci Eli. Votre réponse a été très utile.


Heads Up, je pense que cela devrait être "Paysirfile" avec une minuscule p. llvm.org/docs/doxygen/html/irleader_2irdeader_8h_source.html


@ user2027722: Yep, les API de LLVM changent si souvent qu'il est difficile de garder des échantillons à jour. J'ai un repo github pour cela: github.com/eliben/llvm-clang-samples que je garde aussi synchronis que possible, et c'est plus une source de vérité que de réponses aléatoires


ERREUR: "LLVMContext" n'a pas été déclaré dans cette portée



1
votes

Comme mentionné ci-dessus le meilleur moyen d'écrire une passe. Mais si vous voulez simplement itération à travers les instructions et faire quelque chose avec le LLVM fournit une classe Insparavenitor. C'est une classe qui implémente le modèle de visiteur pour des instructions. Il est très simple à l'utilisateur à l'utilisateur, donc si vous voulez éviter d'apprendre à mettre en œuvre un laissez-passer, vous pourriez recourir à cela.


0 commentaires