Вывести аргументы функции с помощью Clang AST - PullRequest
9 голосов
/ 07 марта 2012

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

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

Выход:

argType: char *
argType: int
argType: int

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

Ответы [ 2 ]

11 голосов
/ 09 марта 2012

ваш ответ был очень полезен мартинс.Я не знал о функции 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
9 голосов
/ 08 марта 2012

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

...