2012-03-07 18 views
9

Chcę uzyskać argumenty przekazane do funkcji. na przykład, jeśli mam wywołanieDrukuj argumenty funkcji używając Clang AST

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

wyjście powinno być

% d% d
i
j

jestem w stanie dostać się do funkcji połączeń przy użyciu VisitCallExpr() w RecursiveASTVisitor. Również może uzyskać liczbę argumentów i typów argumentów. Ale nie wiem, jak zdobyć argumenty.

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; 
} 

wyjściowa:

argType: char *
argType: int
argType: int

Proszę mi pomóc coraz argumenty.

Odpowiedz

9

Nazywasz E-> getArg (i) -> getType() - ale jest to typ argumentu. Użyj E-> getArg (i), aby uzyskać Expr * reprezentujący wartość argumentu. Następnie użyj metody printPretty(...), aby ładować ją do napisu, jeśli potrzebujesz wartości ciągu.

+0

Hi Martins, odpowiedź była bardzo pomocna Martins. Nie wiedziałem o funkcji printPretty (...). Teraz jestem w stanie wydrukować argumenty. Dziękuję Ci. –

11

Twoja odpowiedź była bardzo pomocna w oknach. Nie wiedziałem o funkcji printPretty (...). Teraz jestem w stanie wydrukować argumenty. poniżej jest mój kod do drukowania argumentów.

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; 
} 

a wyjście wygląda następująco:

"%d%d" 
i 
j