2016-05-15 7 views

Antwort

0

Solche Operationen können durch Schreiben einer LLVM Pass durchgeführt werden. Im Wesentlichen sollten Sie eine runOnFunction() implementieren, die Anweisungen während des Prozesses abfangen kann. Der folgende Durchlauf liest das Vergleichsprädikat von Verzweigungsbefehlen.

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

Programm Beispiel:

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

Befehl:

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

Ausgang:

> 32 
+0

Ich möchte alle Metadaten, die mit einem 'if' Anweisung angebracht. Es werden keine Metadaten gedruckt. Mein Code: 'if (ICmpInst * iCmpInst = dyn_cast (& * i)) { \t Fehler() << iCmpInst-> getOpcodeName() << '\ t'; \t Fehler() << iCmpInst-> getPredicate() << '\ t'; \t SmallVector , 8> MDs; \t iCmpInst-> getAllMetadata (MDs); \t SmallVector Namen; F.getContext(). GetMDKindNames (Namen); für (SmallVector , 8> :: Iterator II = MDs.begin(), EE = MDs..end(); II! = EE; ++ II) { \t errs() << "name:" << Names[II-> zuerst] << "\ n"; } } ' –

+0

@DhritiKhanna: Haben Sie versucht, mit dem -g Flag in Clang zu kompilieren? – ConsistentProgrammer

+0

Ich habe es gerade versucht. Es gibt diese Warnung Warnung: Ignorieren Debug-Informationen mit einer ungültigen Version (1) in file.bc und druckt nichts. –