2016-05-04 2 views
1

Je pense à la création d'un outil pour m'aider à visualiser le code LLVM-IR généré pour chaque instruction/fonction de mon fichier source d'origine. Quelque chose comme this mais pour LLVM-IR.Analyse du code IR LLVM (avec symboles de débogage) pour mapper la source d'origine

Les étapes pour construire cet outil si loin semblent être:

  • Commencez par avec le constructeur AST LLVM-IR.
  • Parse code IR généré.
  • Sur la position du caret, obtenir l'élément AST.
  • Lire la portée de l'élément, la ligne, la colonne et le fichier et le signaler dans le fichier d'origine.

Est-ce la bonne façon de l'aborder? Est-ce que je banalisais trop?

+0

Rechercher s tout à fait correct. La chose que vous voulez réaliser est plutôt simple avec llvm, mais il faudra beaucoup de code d'interface utilisateur –

Répondre

2

Je pense que votre approche est tout à fait correcte. La partie de l'interface utilisateur sera probablement assez longue à mettre en œuvre, donc je vais me concentrer sur la partie llvm.

Disons que vous démarrez à partir d'un fichier d'entrée contenant votre LLVM-IR.

Étape 1 module de traitement:
Lire le contenu de fichier à une chaîne. Ensuite, construire un module à partir, et la traiter pour obtenir les informations de débogage:

llvm::MemoryBuffer* buf = llvm::MemoryBuffer::getMemBuffer(llvm::StringRef(fileContent)).release(); 
llvm::SMDiagnostic diag; 
llvm::Module* module = llvm::parseIR(buf->getMemBufferRef(), diag, *context).release(); 
llvm::DebugInfoFinder* dif = new llvm::DebugInfoFinder(); 
dif->processModule(*module); 

Étape 2 itérer sur les instructions:
Une fois fait avec cela, vous pouvez simplement itérer sur la fonction et les blocs et les instructions:

// pseudo code for loops (real code is a bit long) 
foreach(llvm::Function f in module.functions) 
{ 
    foreach(llvm::BasicBlock b in f.BasicBlockList) 
    { 
     foreach(llvm::Instruction inst in b.InstList) 
     { 
     llvm::DebugLoc dl = inst.getDebugLoc(); 
     unsigned line = dl->getLine(); 
     // accordingly populate some dictionary between your instructions and source code 
     } 
    } 
} 

Étape 3 mise à jour de votre interface utilisateur
Ceci est une autre histoire ...

+0

Quel est le contexte supposé être *? J'ai trouvé des exemples où getGlobalContext() est utilisé mais je ne l'ai pas défini sur mon "llvm/IR/LLVMContext.h". –

+0

c'est juste un nouveau contexte, de type llvm :: LLVMContext –

+1

Comme @ Regis Portalez a dit que le code est un peu plus long. Pour effectuer une itération sur chaque collection, je devais faire comme ceci: pour (auto curFref = m-> getFunctionList(). Begin(), endFref = module-> getFunctionList(). End(); curFref! = EndFref; ++ curFref) {...} –