2016-05-13 46 views
1

我需要使用LLVM函數傳遞找出函數調用站點(或任何指令)的嵌套級別。我已經編寫了下面的代碼,但它總是返回0作爲嵌套級別。如何使用LLVM函數傳遞找出呼叫站點的環路深度?

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"; 

    } 

    } 

回答

1

我需要找出一個函數調用點的嵌套級別(或任何 指令,對於這個問題)

For循環,你可以這樣做可以在編輯您的通行證採用以下方式:

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; 
    } 
}; 

使用opt命令執行此傳遞。

假設下面的示例輸入:

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; 
} 

輸出將是:

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> 

我已經打印出來loop->dump(),你可以很容易地適應它的另一個屬性了。