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 ...
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 –