2014-02-19 4 views
5

Ich muss bestimmte Anweisungen in clang durch Hinzufügen einer Anweisung unmittelbar davor instrumentieren. Ich habe einen Zeiger auf ein Expr-Objekt, mit dem ich eine andere Anweisung kurz vor der Anweisung einfügen muss, die sie enthält. Im Moment verwende ich einen Hacky-Ansatz, der den SourceLocation-Zeiger einfach zurück bewegt, bis ich ein sehe; oder oder {. Aber das funktioniert nicht in allen Fällen. Wenn ich beispielsweise versuche, ein for-Statement zu instrumentieren, schlägt es fehl. Gibt es eine Klasse in Clang, die eine Methode bietet, dies auf eine sauberere Art und Weise zu tun?So instrumentieren Sie eine Anweisung kurz vor einer anderen Anweisung mit clang

EDIT: Hier ist Schnipsel meines Codes. Ich muss eine Bestätigung direkt vor der Anweisung einfügen, die eine Zeiger-Dereferenzierung enthält.

bool MyRecursiveASTVisitor::VisitUnaryOperator(UnaryOperator *E){ 
    if (E->getOpcode() == UO_Deref){ 
     Expr *e1 = E->getSubExpr(); 
     SourceLocation SL = E->getLocStart(); 
    } 
    return true; 
} 
+0

Sie Klirren verwenden Frage SO Prüfung können Plugin, LibTooling, von libclang? – ekeren

+0

Ich benutze LibTooling, denke ich. Ich habe einen Startcode für die Instrumentierung verwendet, daher bin ich mir nicht ganz sicher. – anirudh

Antwort

2

Sie können getSourceRange() auf der Anweisung, die SourceRange SourceRange Klasse zurückgibt hat getBegin() die SourceLocation zurück.

Sie https://github.com/eschulte/clang-mutate und sehen ein Beispiel Prüfung können ...

EDIT:

Um Ausdr aus Stmt extrahieren Sie diese How to get Stmt class object from Expr object in Clang

+0

Ich habe nicht den Stmt-Zeiger, aber alles, was ich habe, ist der Zeiger auf den Ausdruck innerhalb der Anweisung. Gibt es eine Möglichkeit, mit dem Expr-Zeiger zum Stmt-Zeiger zu gelangen? – anirudh

+0

@anirudh - Kannst du Code-Schnipsel zeigen ... Ich bin mir nicht sicher, ob ich verstehe, was du hast – ekeren