Es gibt eine Möglichkeit, Informationen zur Aufrufanweisung zu extrahieren (mithilfe der CallInst-Klasse von LLVM). Gibt es eine Möglichkeit, Metadaten einer 'if' Anweisung auch zu extrahieren? Wie die Variable Name, Operator oder Literal?Kann ich Bedingungen aus 'if'-Anweisungen von LLVM IR extrahieren?
0
A
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
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"; } } ' –
@DhritiKhanna: Haben Sie versucht, mit dem -g Flag in Clang zu kompilieren? – ConsistentProgrammer
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. –