2016-06-14 8 views
1

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?

Antwort

2

können Sie den AllocaInst auf Value und dann überprüfen Sie seine Verwendung, wenn sie Lasten oder speichert.

Just for side note: Wert ist Super Wert < - Benutzer < - Instruction < - UnaryInst < - AllocaInst, können Sie in der Klassendiagramm auch einen Blick auf 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 
} 

Es gibt Auch Speicherabhängigkeitsanalyse übergeben, die wiederum Alias-Analyse verwendet, können Sie Speicherbefehl abfragen und es werden die Anweisungen, die aus diesem Speicher lädt oder speichert. Weitere Informationen finden Sie unter http://llvm.org/docs/doxygen/html/classllvm_1_1MemoryDependenceAnalysis.html.

+0

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

+0

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