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