Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Llvm 使用clang为函数创建参数_Llvm_Clang - Fatal编程技术网

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消息时遇到了一些问题,你能看看我的问题吗?铿锵插件是如何添加例如插装的?