Ho cercato ore e non riesco a trovare nulla che possa aiutarmi. Sto lavorando a un progetto che prevede un FunctionPass. Ho implementato un metodo runOnFunction (Funzione & f) e funziona bene. Fondamentalmente si deve:Come inserire un'istruzione LLVM?
1) Rilevare un istruzione di memorizzazione
2) Convertire l'indirizzo di memoria della istruzione di memorizzazione di un intero
3) Modificare il numero intero utilizzando un'operazione AND (0000FFFF)
4) Convertire il numero intero di nuovo nel puntatore
Finora ho ottenuto il seguente:
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;
}
Non riesco, per la vita di me, a capire come inserire effettivamente l'istruzione, o persino a trovare un modo per creare un'istruzione AND. Se qualcuno potesse indicarmi la giusta direzione, sarebbe fantastico.
Grazie in anticipo.
Come si prende cura del terminatore in caso di passaggio di un blocco di base in allegato? – PatoBeltran
@PatoBeltran L'aggiunta di istruzioni in questo modo non attiva la verifica del blocco di base, pertanto è possibile avere un blocco di base non valido in tali fasi intermedie. Assicurati di posizionare un terminatore alla fine prima di completare la funzione di passaggio. – Oak