Ich schreibe einen LLVM-Durchlauf und ich muss jeden Befehl finden, der den von einer Ladeanweisung gelesenen Speicher definiert haben könnte. Zum Beispiel:LLVM erhält mögliche Speicheranweisungen für eine Ladeanweisung
%x = alloca i32, align 4
store i32 123, i32* %x, align 4
%0 = load i32, i32* %x, align 4
In diesem Beispiel möchte ich von der Ladeanweisung zu jeder Anweisung, die% X initialisiert/geändert haben könnte. In diesem Fall nur die vorherige Speicheranweisung. Ich habe versucht, die Use-Def-Kette zu verwenden, aber das gibt mir die Anweisung für die Definition des Speichers, der die alloca-Anweisung ist.
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;
}
};
Wie kann ich alle möglichen Speicheranweisungen erhalten, die den von einer Ladeanweisung gelesenen Speicher definiert haben könnten?
Das funktioniert tatsächlich. Aber gibt es nicht eine einfachere Analyse als das Erreichen von Definitionen, die bereits in LLVM implementiert sind? Also muss ich die Analyse nicht machen, welche Definition andere Definitionen etc. überschreibt. – user2600312
Es gibt auch Speicherabhängigkeits-Durchlauf, der abwechselnd Alias-Analyse verwendet, Sie können Speicheranweisungen abfragen und es werden die Anweisungen zurückgeben, die von diesem Speicher geladen oder gespeichert werden . Weitere Informationen finden Sie unter http://llvm.org/docs/doxygen/html/classllvm_1_1MemoryDependenceAnalysis.html. –