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