Llvm 使用clang为函数创建参数
我有这样的源代码Llvm 使用clang为函数创建参数,llvm,clang,Llvm,Clang,我有这样的源代码 void update(); void update() { } 我正试图用叮当声解析这段代码,并将代码修改成这样 typedef float v4sf attribute ((vector_size(16))); void update(v4sf& v1, v4sf& v2); void update(v4sf& v1, v4sf& v2) { } 我看了一下clang的重写器类。在我编写的函数中,如下所示 MyRecursiveAST
void update();
void update()
{
}
我正试图用叮当声解析这段代码,并将代码修改成这样
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);
create函数的前四个参数可以从FunctionDecl获得。我不确定其他人应该是什么
我如何创建类型并在clang中为它们赋值?这些类型不需要是内置的,可以是转换后的源代码中添加的类型(v4sf)
这是使用clang方法进行转换的方式,还是可以使用Rewriter.InsertText()添加参数?clang的设计不支持AST的变异,也不支持将AST作为源代码重新导出(保留注释、宏和预处理器指令)。手动添加AST节点可能会违反AST不变量,从而导致崩溃。您应该使用
重写器
根据从AST中提取的信息对源代码进行重写
如果仍要执行AST修改,应通过重建要修改的AST部分来执行,而不是就地更改。重建步骤应该通过调用
Sema
上的方法来执行,它知道如何在构建AST时提供适当的不变量。谢谢!我正在使用Rewriter,但是我在重写obj-c消息时遇到了一些问题,你能看看我的问题吗?铿锵插件是如何添加例如插装的?