2012-05-25 6 views
6

Ho codice sorgente che assomiglia a questo,Creazione di parametri per una funzione con clang

void update(); 

void update() 
{ 
} 

Iam cercando di analizzare questo codice con clangore e modificare il codice per questo.

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

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

Ho esaminato le classi di Rewriter di clang. Nella funzione che ho scritto come mostrato di seguito,

MyRecursiveASTVisitor::VisitFunctionDecl(FunctionDecl *f) 

FunctionDecl trovi metodo setparams() che ho potuto usare. Dovrei creare parametri con questo metodo.

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

I primi quattro argomenti della funzione di creazione possono essere ottenuti da FunctionDecl. Non sono sicuro di cosa debbano essere gli altri.

Come si creano i tipi e si assegnano anche valori in clang? I tipi non devono essere incorporati e potrebbero essere simili a quello aggiunto (v4sf) nel codice sorgente trasformato.

In questo modo (utilizzando i metodi clang) per eseguire le trasformazioni o posso utilizzare Rewriter.InsertText() per aggiungere i parametri?

risposta

6

Clang non è progettato per supportare la mutazione del suo AST e non supporta la riesportazione del codice sorgente AST come codice sorgente (mantenimento di commenti, macro e direttive del preprocessore). L'aggiunta manuale di nodi AST può violare gli invarianti AST, il che può causare arresti anomali. È necessario utilizzare Rewriter per eseguire la riscrittura del codice sorgente, in base alle informazioni estratte dall'AST.

Se si desidera eseguire ancora le modifiche AST, è necessario farlo ricostruendo la parte dell'AST che si desidera modificare, anziché modificarla in posizione. Le fasi di ricostruzione devono essere eseguite chiamando i metodi su Sema, che sa come fornire gli invarianti appropriati quando si crea l'AST.

+0

Grazie! Sto usando Rewriter, ma ho alcuni problemi con la riscrittura dei messaggi obj-c, potresti guardare la mia domanda http://stackoverflow.com/questions/20418933/clang-tool-rewrite-objcmessageexpr? – BergP

+0

come aggiungere plug-in clang, ad es. strumentazione? – gnzlbg