2017-06-08 7 views
0

Je me demandais comment nous pouvons supprimer un tas d'instructions dans LLVM. J'ai essayé les éléments suivants (sur la base d'un poste de la liste de diffusion LLVM-dev)la suppression d'un tas d'instructions llvm

// delete all instructions between [start,end) 

void deleteAllInstructionsInRange(Instruction* startInst,Instruction* endInst) 
{ 
    BasicBlock::iterator it(startInst); 
    BasicBlock::iterator it_end(endInst); 
    it_end--; 

    Instruction* currentInst ; 

    while(it != it_end) 
    { 
     currentInst = &*it; 

     // this cannot be done at the end of the while loop. 
     // has to be incremented before "erasing" the instruction 
     ++it; 

     if (!currentInst->use_empty()) 
     { 
      currentInst->replaceAllUsesWith(UndefValue::get(currentInst->getType())); 
     } 

     currentInst->eraseFromParent(); 


    } 

} 

Tout fonctionne comme prévu, sauf pour la dernière itération. Quelqu'un comprend pourquoi? (J'ai essayé d'utiliser gdb mais cela donne une erreur de segfault dans la dernière itération)

Répondre

0

La façon dont votre boucle est construite fait que le code interne essaie de supprimer ce qui est un itérateur invalide: it == it_end. Un simple if (it == it_end) continue; après it++ aidera.

Vous ne savez pas comment les itératives LLVM sont construites, mais pour les conteneurs stl, erase renverra un itérateur incrémenté, donc vous n'aurez même pas besoin de la boucle bizarre. Un bref regard sur le docs semble confirmer cela.