2012-03-07 15 views
9

Quiero que los argumentos pasen a una función. por ejemplo, si tengo la llamadaImprimir argumentos de una función usando Clang AST

printf ("% d% d", i, j);

la salida debe ser

% d% d

i j

soy capaz de llegar a la función de llamadas usando VisitCallExpr() en RecursiveASTVisitor. También puede obtener la cantidad de argumentos y los tipos de argumentos. Pero no sé cómo obtener los argumentos.

bool MyRecursiveASTVisitor::VisitCallExpr (clang::CallExpr *E) 
{ 
    for(int i=0, j=E->getNumArgs(); i<j; i++) 
    { 
     llvm::errs() << "argType: " << E->getArg(i)->getType().getAsString() << "\n"; 
    } 
    return true; 
} 

Salida:

argType: char *
argType: int
argType: int

Por favor, ayuda para conseguir los argumentos.

Respuesta

9

Está llamando a E-> getArg (i) -> getType() - pero ese es el tipo de argumento. Use E-> getArg (i) para obtener Expr * que represente el valor del argumento. A continuación, utilice el método printPretty(...) para imprimirlo bastante en una cadena, si necesita un valor de cadena.

+0

Martins Hola, su respuesta fue muy Martins votos. No sabía acerca de la función printPretty (...). Ahora, puedo imprimir los argumentos. Gracias. –

11

su respuesta fue muy útil martins. No sabía acerca de la función printPretty (...). Ahora, puedo imprimir los argumentos. a continuación está mi código para imprimir los argumentos.

bool MyRecursiveASTVisitor::VisitCallExpr (clang::CallExpr *E) 
{ 
    clang::LangOptions LangOpts; 
    LangOpts.CPlusPlus = true; 
    clang::PrintingPolicy Policy(LangOpts); 

    for(int i=0, j=E->getNumArgs(); i<j; i++) 
    { 
     std::string TypeS; 
     llvm::raw_string_ostream s(TypeS); 
     E->getArg(i)->printPretty(s, 0, Policy); 
     llvm::errs() << "arg: " << s.str() << "\n"; 
    } 
    return true; 
} 

y la salida tiene el siguiente aspecto:

"%d%d" 
i 
j 
Cuestiones relacionadas