使用clang为函数创建参数

时间:2012-05-25 01:44:02

标签: llvm clang

我的源代码看起来像这样,

void update();

void update()
{
}

我试图用clang解析这段代码并将代码修改为此。

typedef float v4sf attribute ((vector_size(16)));
void update(v4sf& v1, v4sf& v2);

void update(v4sf& v1, v4sf& v2)
{
}

我看了一下clang的重写类。在我写的函数中,如下所示,

MyRecursiveASTVisitor::VisitFunctionDecl(FunctionDecl *f) 

FunctionDecl有我可以使用的setParams()方法。我必须使用这种方法创建参数。

  static ParmVarDecl *Create(ASTContext &C, DeclContext *DC,
                             SourceLocation StartLoc,
                             SourceLocation IdLoc, IdentifierInfo *Id,
                             QualType T, TypeSourceInfo *TInfo,
                             StorageClass S, StorageClass SCAsWritten,
                             Expr *DefArg);

可以从FunctionDecl获取create函数的前四个参数。我不确定其余的必须是什么。

如何创建类型并在clang中为它们赋值?这些类型不需要内置,可以像转换后的源代码中添加的那样(v4sf)。

这样(使用clang方法)进行转换还是可以使用Rewriter.InsertText()来添加参数?

1 个答案:

答案 0 :(得分:6)

Clang并非旨在支持其AST的变异,并且它不支持将AST重新导出为源代码(保留注释,宏和预处理器指令)。手动添加AST节点可能会违反AST不变量,这可能导致崩溃。您应该使用Rewriter根据从AST中提取的信息执行源代码的重写。

如果您仍想执行AST修改,则应通过重建要修改的AST部分来实现,而不是在适当的位置进行更改。重建步骤应该通过调用Sema上的方法来执行,{{1}}知道如何在构建AST时提供适当的不变量。