Comment Insérer une LLVM de l'Enseignement?
J'ai cherché pendant des heures et je ne trouve rien qui puisse m'aider. Je suis en train de travailler sur un projet qui implique un FunctionPass. J'ai mis en place un runOnFunction(Fonction &f) la méthode et ça fonctionne bien. Fondamentalement, il doit:
1) Détecter un magasin d'instruction
2) Convertir l'adresse mémoire de la stocker des instructions à un Entier
3) de Modifier le nombre entier à l'aide d'un bit à bit ET de l'exploitation (0000FFFF)
4) Convertir l'entier de retour dans le pointeur
Jusqu'à présent, j'ai les suivantes:
virtual bool runOnFunction(Function &F) {
for (Function::iterator bb = F.begin(), bbe = F.end(); bb != bbe; ++bb) {
BasicBlock& b = *bb;
for (BasicBlock::iterator i = b.begin(), ie = b.end(); i != ie; ++i) {
if(StoreInst *si = dyn_cast<StoreInst>(&*i)) {
PtrToIntInst* ptrToInt = new PtrToIntInst(si->getPointerOperand(), IntegerType::get(si->getContext(), 32), "", si);
}
}
}
return true;
}
Je ne peux pas pour la vie de me comprendre comment l'insertion de l'instruction, ou même de trouver un moyen de créer une ET de l'instruction. Si quelqu'un pouvait me diriger dans la bonne direction, ce serait génial.
Merci d'avance.
OriginalL'auteur KritSandvich | 2012-11-13
Vous devez vous connecter pour publier un commentaire.
Je vous recommande de prendre un coup d'oeil à la Manuel du programmeur - il a une jolie couverture convenable de la base.
En particulier, il n'y a une section sur la création et l'insertion de nouvelles instructions. La façon la plus simple est juste de fournir une instruction comme le dernier argument en faveur de la nouvelle instruction du constructeur, qui sera ensuite insérer l'instruction immédiatement avant l'existant.
Alternativement, vous pouvez passer à l'affichage de bloc de base si vous souhaitez simplement ajouter à sa fin (mais n'oubliez pas que vous devez prendre soin de terminator!). Enfin, vous pouvez les appeler
getInstList()
sur l'affichage de bloc de base, puisinsert
oupush_back
pour insérer de nouvelles instructions.Comme un de côté, vous n'avez pas à effectuer une itération sur tous les blocs et ensuite toutes les instructions de chaque, vous pouvez simplement effectuer une itération sur les instructions directement; voir la section sur l'instruction itérateur dans le manuel du programmeur.
L'ajout d'instructions qui ne déclenchent pas de vérification du bloc de base, de sorte que vous pouvez avoir un mal formé bloc de base dans les étapes intermédiaires. Assurez-vous simplement à la place d'un indicateur de fin à la fin avant d'en terminer avec le pass de votre fonction.
OriginalL'auteur Oak
OriginalL'auteur Nick Lewycky
Vous pouvez utiliser un
IRBuilder
insérer facilement des nouvelles instructions avant une autre instruction ou à la fin d'un bloc de base.Alternativement, si vous avez besoin d'insérer une instruction après un autre, vous devez utiliser le
instruction list
dans le contenant bloc de base:Code et solution de prise de ici.
OriginalL'auteur stanm