我的源代码看起来像这样,
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()来添加参数?
答案 0 :(得分:6)
Clang并非旨在支持其AST的变异,并且它不支持将AST重新导出为源代码(保留注释,宏和预处理器指令)。手动添加AST节点可能会违反AST不变量,这可能导致崩溃。您应该使用Rewriter
根据从AST中提取的信息执行源代码的重写。
如果您仍想执行AST修改,则应通过重建要修改的AST部分来实现,而不是在适当的位置进行更改。重建步骤应该通过调用Sema
上的方法来执行,{{1}}知道如何在构建AST时提供适当的不变量。