评估clang工具中的常量表达式

时间:2013-08-28 11:02:02

标签: clang clang++

我正在编写一个Clang工具,我正在试图弄清楚如何评估一个字符串文字给定访问程序的AST。鉴于以下计划:

class DHolder { 
public:
  DHolder(std::string s) {}
};

DHolder x("foo");    

我在Clang工具中有以下代码:

const CXXConstructExpr *ctor = ... // constructs `x` above
const Expr *expr = ctor->getArg(0); // the "foo" expression
???

如何从代表Expr字符串文字的"foo"到我工具中的实际C ++字符串?我试过做类似的事情:

// From ExprConstant.cpp
Evaluate(result, info, expr);

但我不知道如何初始化resultinfo参数。

任何线索?

2 个答案:

答案 0 :(得分:3)

我意识到这是一个老问题,但是当我无法使用stringLiteral()绑定到任何参数(代码不是C ++ 11)时,我遇到了这个问题。例如,我有CXXMMemberCallExpr

addProperty(object, char*, char*, ...); // has 7 arguments, N=[0,6]

AST转储显示StringLiteral之前是CXXBindTemporaryExpr。因此,为了使我的memberCallExpr查询使用hasArgument(N,expr())进行绑定,我将查询包装为bindTemporaryExpr()(为了便于阅读,此处显示在单独的行中):

memberCallExpr(
    hasArgument(6, bindTemporaryExpr( 
        hasDescendant(stringLiteral().bind("argument"))
        )
    )
)

答案 1 :(得分:1)

执行此操作的正确方法是使用AST匹配器匹配字符串文字并将名称绑定到它,以便稍后可以引用它,如下所示:

StatementMatcher m = 
    constructExpr(hasArgument(0, stringLiteral().bind("myLiteral"))).bind("myCtor");

然后在匹配回调中执行此操作:

const CXXConstructExpr *ctor = 
    result.Nodes.getNodeAs<CXXConstructExpr("optionMatcher");

const StringLiteral *optNameLiteral = 
    result.Nodes.getNodeAs<StringLiteral>("optName");

然后可以通过

访问文字
optNameLiteral->getString().str();