使用Clang打印参数的函数AST

问题描述:

我想获取传递给函数的参数。例如,如果我有电话使用Clang打印参数的函数AST

printf(“%d%d”,i,j);

输出应该是

%d%d

Ĵ

我能够得到函数调用使用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:字符*
argType:整数
argType:整数

请帮我得到的参数。

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

+0

嗨马丁斯,你的答案是非常有益的马丁斯。我不知道printPretty(...)函数。现在,我可以打印参数。谢谢。 – 2012-03-09 18:39:54

你的回答非常有帮助martins。我不知道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