2012-05-25 6 views
6

que tienen el código fuente que se parece a esto,parámetros Creación de una función con sonido metálico

void update(); 

void update() 
{ 
} 

Iam intentar analizar este código con sonido metálico y modificar el código para esto.

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

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

Miré las clases Rewriter de clang. En la función que escribí como se muestra abajo,

MyRecursiveASTVisitor::VisitFunctionDecl(FunctionDecl *f) 

FunctionDecl tiene método setParams() que podría utilizar. Tendría que crear parámetros con este método.

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

Los primeros cuatro argumentos de la función create se pueden obtener desde FunctionDecl. No estoy seguro de lo que el resto de ellos tiene que ser.

¿Cómo creo tipos y también les asigno valores en clang? Los tipos no necesitan ser compilados y podrían ser similares a los que se agregaron (v4sf) en el código fuente transformado.

¿De esta manera (usando métodos clang) para hacer transformaciones o puedo usar Rewriter.InsertText() para agregar los parámetros?

Respuesta

6

Clang no está diseñado para admitir la mutación de su AST, y no es compatible con la reexportación del AST como código fuente (conservando los comentarios, las macros y las directivas de preprocesador). Agregar nodos AST manualmente es probable que viole las invariantes AST, lo que puede provocar bloqueos. Debe usar Rewriter para realizar reescrituras del código fuente, según la información que extraiga del AST.

Si aún desea realizar modificaciones AST, debe hacerlo reconstruyendo la parte del AST que desea modificar, en lugar de cambiarla en su lugar. Los pasos de reconstrucción deben realizarse llamando a métodos en Sema, que sabe cómo proporcionar las invariantes apropiadas al crear el AST.

+0

¡Gracias! Estoy usando Rewriter, pero tengo algunos problemas con la reescritura de mensajes obj-c, ¿podría mirar mi pregunta http://stackoverflow.com/questions/20418933/clang-tool-rewrite-objcmessageexpr? – BergP

+0

cómo se agregan los complementos clang, p. ¿instrumentación? – gnzlbg

Cuestiones relacionadas