2016-06-14 1 views
1

Je suis en train d'écrire un passage LLVM et j'ai besoin de trouver toutes les instructions qui auraient pu définir la mémoire lue par une instruction de chargement. .: par exemple LLVM obtenir des instructions de stockage possibles pour une instruction de chargement

%x = alloca i32, align 4 
store i32 123, i32* %x, align 4 
%0 = load i32, i32* %x, align 4 

Dans cet exemple, je veux obtenir de l'instruction de chargement à chaque instruction qui aurait pu initialiser/modifié% x. Dans ce cas, juste l'instruction de magasin précédente. J'ai essayé d'utiliser la chaîne use-def, mais cela me donne l'instruction pour la définition de la mémoire, qui est l'instruction alloca.

bool runOnModule(Module &M) override { 
     for(Function &fun : M) { 
      for(BasicBlock &bb : fun) { 
       for(Instruction &instr : bb) { 

        if(isa<LoadInst>(instr)){ 
         for (Use &U : instr.operands()) { 
          if (Instruction *Inst = dyn_cast<Instruction>(U)) { 
          errs() << *Inst << "\n"; 
          } 
         } 
        } 

       } 
      } 
     } 
     return false; 
    } 
}; 

Comment puis-je obtenir toutes les instructions de stockage possibles qui auraient pu définir la mémoire lue par une instruction de chargement?

Répondre

2

Vous pouvez convertir AllocaInst en valeur, puis vérifier son utilisation, s'il s'agit de charges ou de magasins.

Juste pour remarque: Valeur est superclasse Valeur < - Utilisateur < - Instruction < - UnaryInst < - AllocaInst, vous pouvez également consulter le diagramme d'héritage à http://llvm.org/docs/doxygen/html/classllvm_1_1Value.html#details

Value* val = cast<Value>(alloca_x); 
Value::use_iterator sUse = val->use_begin(); 
Value::use_iterator sEnd = val->use_end(); 
for (; sUse != sEnd; ++sUse) { 
    if(isa<LoadInst>(sUse)) // load inst 
    else if(isa<StoreInst>(sUse)) // store inst 
} 

Il y a aussi l'analyse de dépendance de mémoire passe qui à son tour utilise l'analyse d'alias, vous pouvez interroger l'instruction de stockage et elle retournera les instructions qui chargent ou stockent dans cette mémoire. Voir http://llvm.org/docs/doxygen/html/classllvm_1_1MemoryDependenceAnalysis.html pour plus d'informations.

+0

Cela fonctionne réellement. Mais n'y a-t-il pas une analyse plus simple comme atteindre les définitions déjà implémentées dans LLVM? Donc, je n'ai pas besoin de faire l'analyse qui remplace la définition d'autres définitions, etc. – user2600312

+0

Il y a aussi un passage de dépendance de mémoire qui utilise à son tour l'analyse d'alias, vous pouvez interroger l'instruction de stockage et retourner les instructions qui chargent ou stockent dans cette mémoire . Pour plus d'informations, voir http://llvm.org/docs/doxygen/html/classllvm_1_1MemoryDependenceAnalysis.html. –