Print arguments of a function using Clang AST

时光毁灭记忆、已成空白 提交于 2019-12-04 11:23:09

问题


I want to get the arguments passed to a function. for example, if I have the call

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

the output should be

%d%d
i
j

I am able to get to function calls using VisitCallExpr() in RecursiveASTVisitor. Also able to get the number of arguments and the argument types. But I don't know how to get the arguments.

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

Output:

argType: char *
argType: int
argType: int

Please help me getting the arguments.


回答1:


You are calling E->getArg(i)->getType() - but that is type of argument. Use E->getArg(i) to get Expr* representing value of argument. Then use printPretty(...) method to pretty-print it to string, if you need string value.




回答2:


your answer was very helpful martins. I didn't know about printPretty(...) function. Now, I am able to print the arguments. below is my code to print the arguments.

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

and the output looks like this:

"%d%d"
i
j


来源:https://stackoverflow.com/questions/9607852/print-arguments-of-a-function-using-clang-ast

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!