2012-05-25 8 views
6

Ich habe Quellcode, die wie folgt aussieht,Erstellen Parameter für eine Funktion mit Klirren

void update(); 

void update() 
{ 
} 

Iam versuchen, diesen Code mit Klirren zu analysieren und den Code dieses ändern.

typedef float v4sf attribute ((vector_size(16))); 
void update(v4sf& v1, v4sf& v2); 

void update(v4sf& v1, v4sf& v2) 
{ 
} 

Ich schaute auf die Rewriter Klassen von Clang. In der Funktion, die ich, wie unten gezeigt schrieb,

MyRecursiveASTVisitor::VisitFunctionDecl(FunctionDecl *f) 

FunctionDecl hat setParams() -Methode, die ich verwenden könnte. Ich müsste mit dieser Methode Params erstellen.

static ParmVarDecl *Create(ASTContext &C, DeclContext *DC, 
          SourceLocation StartLoc, 
          SourceLocation IdLoc, IdentifierInfo *Id, 
          QualType T, TypeSourceInfo *TInfo, 
          StorageClass S, StorageClass SCAsWritten, 
          Expr *DefArg); 

Die ersten vier Argumente für die create-Funktion können von FunctionDecl abgerufen werden. Ich bin mir nicht sicher, was der Rest von ihnen sein muss.

Wie erstelle ich Typen und weise ihnen auch Werte zu? Die Typen müssen nicht eingebaut sein und könnten dem im transformierten Quellcode hinzugefügten (v4sf) ähnlich sein.

Auf diese Weise (mithilfe von Clang-Methoden) Transformationen durchführen oder kann ich Rewriter.InsertText() verwenden, um die Parameter hinzuzufügen?

Antwort

6

Clang ist nicht dafür ausgelegt, Mutationen seiner AST zu unterstützen, und es unterstützt nicht das erneute Exportieren der AST als Quellcode (unter Beibehaltung von Kommentaren, Makros und Präprozessordirektiven). Das manuelle Hinzufügen von AST-Knoten verletzt wahrscheinlich AST-Invarianten, was zu Abstürzen führen kann. Sie sollten den Code Rewriter verwenden, um den Quellcode basierend auf Informationen, die Sie aus dem AST extrahieren, erneut zu schreiben.

Wenn Sie weiterhin AST-Änderungen durchführen möchten, sollten Sie dies tun, indem Sie den Teil des AST, den Sie ändern möchten, neu erstellen, anstatt ihn an Ort und Stelle zu ändern. Die Neuerstellungsschritte sollten durchgeführt werden, indem Methoden unter Sema aufgerufen werden, die wissen, wie die entsprechenden Invarianten beim Erstellen des AST bereitgestellt werden.

+0

Vielen Dank! Ich benutze Rewriter, aber ich habe ein paar Probleme mit dem Umschreiben von Obj-c-Nachrichten, könnten Sie meine Frage http://stackoverflow.com/questions/20418933/clang-tool-rewrite-objcmessageexpr? – BergP

+0

Wie fügen Clang-Plugins z.B. Instrumentierung? – gnzlbg

Verwandte Themen