使用clang为函数创建参数

exc*_*ray 6 llvm clang

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

void update();

void update()
{
}
Run Code Online (Sandbox Code Playgroud)

我试图用clang解析这段代码并修改代码.

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

void update(v4sf& v1, v4sf& v2)
{
}
Run Code Online (Sandbox Code Playgroud)

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

MyRecursiveASTVisitor::VisitFunctionDecl(FunctionDecl *f) 
Run Code Online (Sandbox Code Playgroud)

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

create函数的前四个参数可以从FunctionDecl获得.我不确定其他人必须是什么.

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

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

Ric*_*ith 7

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

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