2016-05-15 19 views

答えて

0

このような操作は、LLVM Passを記述することによって実行できます。基本的には、処理中に命令を代行できるrunOnFunction()を実装する必要があります。次のパスは、分岐命令から比較述語を読み込みます。

namespace { 
    struct PredicateNamePass: public FunctionPass { 
    static char ID; // Pass identification, replacement for typeid 
    PredicateNamePass() : FunctionPass(ID) {} 
    bool runOnFunction(Function &F) override { 
     for (Instruction& I : inst_range(F)) { 
     if (I.isTerminator()) { 
      if (strcmp(I.getOperand(0)->getName().str().c_str(), "cmp") == 0) 
       if (CmpInst *cp = dyn_cast<CmpInst>(I.getPrevNode())) 
        errs() << cp->getPredicate() << '\n'; 
     } 
     } 
     return false; 
    } 
    }; 
} 

プログラム例:

int main(int argc, char* argv[]) { 
    int a = 10; 
    if(argc == 3) 
     a = 11; 
    else 
     a++; 
    return 0; 
} 

コマンド:

> opt -load ../build.llvm/lib/LLVMPredicateNamePass.so \ 
    -PredicateNamePass <example.bc> /dev/null 

出力:

> 32 
+0

私は 'if'命令で接続されているすべてのメタデータが欲しいです。メタデータは印刷されません。私のコード: 'if(ICmpInst * iCmpInst = dyn_cast (&* i)){ \t errs()<< iCmpInst-> getOpcodeName()<< '\ t'; \t errs()<< iCmpInst-> getPredicate()<< '\ t'; \t SmallVector 、8> MDs; \t iCmpInst-> getAllMetadata(MDs); \t SmallVector 名前; F.getContext()。getMDKindNames(Names); \t errs(errs(0)): for(SmallVector 、8> :: iterator II = MDs.begin()、EE = MDs.end(); II!= EE; ()<< "name:" << Names[II-> first "<<" \ n "; } } ' –

+0

@DhritiKhanna:clangで-gフラグを使ってコンパイルを試しましたか? – ConsistentProgrammer

+0

私はちょうど今試しました。この警告は '警告:file.bcの無効なバージョン(1)でデバッグ情報を無視し、何も表示しません。 –

関連する問題