使用Clang AST打印函数的参数

Sri*_*dam 10 c++ llvm clang abstract-syntax-tree format-string

我想获取传递给函数的参数.例如,如果我有电话

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

输出应该是

%d%d
i
j

我可以使用RecursiveASTVisitor中的VisitCallExpr()进行函数调用.还能够获取参数的数量和参数类型.但我不知道如何得到论点.

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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

argType:char*
argType:int
argType:int

请帮助我得到论点.

Sri*_*dam 12

你的回答对马丁斯非常有帮助.我不知道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;
}
Run Code Online (Sandbox Code Playgroud)

输出看起来像这样:

"%d%d"
i
j
Run Code Online (Sandbox Code Playgroud)


Mār*_*iko 10

你正在调用E-> getArg(i) - > getType() - 但这是参数的类型.使用E-> getArg(i)得到表示参数值的Expr*.然后使用printPretty(...)方法将它打印成字符串,如果你需要字符串值.