2016-05-13 6 views
1

Ich muss herausfinden, die Verschachtelungsebene einer Funktionsaufrufstelle (oder jede Anweisung, für diese Angelegenheit) mit einem LLVM Function-Pass. Ich habe den folgenden Code geschrieben, aber es gibt immer 0 als Verschachtelungsebenen zurück.Wie finde ich die Schleifentiefe einer Call-Site mit einem LLVM Function Pass?

virtual bool runOnFunction(Function &F) { 
    LoopInfo &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo(); 
    errs() << "Function: " << F.getName() << "\n"; 

    for (User *U : F.users()) { 
    CallSite CS(dyn_cast<Instruction>(U)); 
    Function *callerFn = CS.getCaller(); 
    if (callerFn && !callerFn->isDeclaration()) { 
     errs() <<callerFn->getName() << "--> " << F.getName()<<"\n"; 
     Instruction *callInstr = CS.getInstruction(); 
     BasicBlock *callerBB = callInstr->getParent(); 
     callerBB->dump(); 
     bool isLoop = LI.getLoopFor(callerBB); 
     errs()<<"Is Loop: "<<isLoop<<"\n"; 
     int LoopDepth = LI.getLoopDepth(callerBB); 
     errs()<<"Loop Depth: "<< LoopDepth <<"\n"; 

    } 

    } 

Antwort

1

Ich brauche die Verschachtelungsebene eines Funktionsaufruf Website zu finden (oder eine Anweisung, was das betrifft)

Für Schleifen, können Sie dies Ihren Pass wird die Bearbeitung in die folgende Art und Weise:

namespace { 
    struct LoopDepthPass: public FunctionPass { 
    static char ID; 
    LoopDepthPass:() : FunctionPass(ID) {} 

    void getAnalysisUsage(AnalysisUsage &AU) const override { 
     AU.setPreservesCFG(); 
     AU.addRequired<LoopInfoWrapperPass>(); 
    } 

    bool runOnFunction(Function& F) override { 
     LoopInfo &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo(); 
     for (LoopInfo::iterator LIT = LI.begin(); LIT != LI.end(); ++LIT) { 
     Loop* ll = *LIT; 
     ll->dump(); 
     } 
     return false; 
    } 
}; 

diesen Pass ausführen mit dem opt Befehl.

Nehmen Sie die folgende Beispieleingabe:

int main(int argc, char* argv[]) { 
    int a; 

    for (int i = 0; i < 1000; i++){ 
    for (int j = 0; j < 1000; j++) 
     a = i + j; 
    } 
    return 0; 
} 

Der Ausgang wäre:

Loop at depth 1 containing: %for.cond<header><exiting>,%for.body,%for.cond.1,%for.end,%for.inc.7<latch>,%for.body.4,%for.inc 
    Loop at depth 2 containing: %for.cond.1<header><exiting>,%for.body.4,%for.inc<latch> 

ich die loop->dump() ausgedruckt haben, können Sie leicht auch für andere Eigenschaft anzupassen.