2012-02-18 101 views

回答

6

直接回答你的問題是將此代碼放在一個自定義的FunctionPass

virtual bool runOnFunction(Function &F) { 
    for (Function::iterator bb = F.begin(), bb_e = F.end(); bb != bb_e; ++bb) { 
     for (BasicBlock::iterator ii = bb->begin(), ii_e = bb->end(); ii != ii_e; ++ii) { 
      if (CmpInst *cmpInst = dyn_cast<CmpInst>(&*ii)) { 
       handle_cmp(cmpInst); 
      } 
     } 
    } 
    return false; 
} 

void handle_cmp(CmpInst *cmpInst) { 
    if (cmpInst->getPredicate() == CmpInst::ICMP_SGT) { 
     errs() << "In the following instruction, SGT predicate\n"; 
     cmpInst->dump(); 
    } 
} 

你似乎在問了很多類似的問題,最近,所以我想給一個更普遍一點建議。

您在LLVM IR中看到的每條指令只是存在於LLVM代碼庫中的指令類的文本表示。在這種情況下,icmp代表ICmpInst,它是CmpInst的子類。一旦知道要處理CmpInst,只需閱讀頭文件中的類聲明即可輕鬆查看如何訪問其屬性。例如,很明顯,該指令的「謂詞」參數表示sgt和其他謂詞。

但是,您如何知道要查看哪個課程。這很容易用LLVM C++後端來完成,後者可以轉儲構建一些IR所需的等效C++代碼。剛剛從看它,你需要ICmpInst,也該謂語爲ICMP_SGT

LoadInst* int32_19 = new LoadInst(ptr_argc_addr, "", false, label_entry_15); 
    int32_19->setAlignment(4); 
    ICmpInst* int1_cmp = new ICmpInst(*label_entry_15, ICmpInst::ICMP_SGT, int32_19, const_int32_8, "cmp"); 
    BranchInst::Create(label_if_then, label_if_else, int1_cmp, label_entry_15); 

所以,你知道的:比如,給這片IR的:

%0 = load i32* %argc.addr, align 4 
    %cmp = icmp sgt i32 %0, 0 

將傾倒。

要在.ll文件,你只是做運行一些文字IR的C++後端:

llc -march=cpp -cppgen=program irfile.ll 

希望這有助於!

0

這裏是你的問題的解決:

ICmpInst *ICC=dyn_cast<ICmpInst>(inst); 
llvm::CmpInst::Predicate pr=ICC->getSignedPredicate(); 
switch(pr){ 
    case CmpInst::ICMP_SGT: errs()<<"------>SGT\n"; break; 
    case CmpInst::ICMP_SLT: errs()<<"------>SLT\n"; break; 
    case CmpInst::ICMP_SGE: errs()<<"------>SGE\n"; break; 
    case CmpInst::ICMP_SLE: errs()<<"------>SLE\n"; break; 
} 

比方說您有 「出師表」,這是指向該指令(%4 = ICMP SGT 123-132%2%3)的指令指針。在對ICCInst類的一個實例ICC進行dyanamic轉換之後。然後像上面那樣調用getSignedPredicate()它會返回一個謂詞。基於此,有切換案例。希望它能爲你工作。