2012-03-07 5 views
9

Я хочу получить аргументы, переданные функции. например, если у меня есть звонокПечать аргументов функции с использованием Clang AST

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

выход должен быть

% d% d
я
J

Я смог добраться до вызовов функций с помощью VisitCallExpr() в RecursiveASTVisitor. Также можно получить количество аргументов и типы аргументов. Но я не знаю, как получить аргументы.

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

Выход:

типа аргумент: символ *
типа аргумент: INT
типа аргумента: Int

Пожалуйста, помогите мне получить аргументы.

ответ

9

Вы вызываете E> getArg (i) -> getType() - но это тип аргумента. Используйте E-> getArg (i), чтобы получить выражение Expr *, представляющее значение аргумента. Затем используйте метод printPretty(...), чтобы довольно-напечатать его в строку, если вам нужно значение строки.

+0

Привет стрижей, ваш ответ был очень полезным стрижи. Я не знал о функции printPretty (...). Теперь я могу напечатать аргументы. Спасибо. –

11

Ваш ответ был очень полезным мартинсом. Я не знал о функции printPretty (...). Теперь я могу напечатать аргументы. ниже мой код для печати аргументов.

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

и результат выглядит следующим образом:

"%d%d" 
i 
j 
Смежные вопросы