使用clang为函数创建参数

6

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

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的Rewriter类。在我编写的以下函数中,

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()来添加参数?

1个回答

7

Clang不支持修改其AST,并且不支持将AST重新导出为源代码(保留注释、宏和预处理器指令)。手动添加AST节点很可能会违反AST不变式,从而导致崩溃。您应该使用Rewriter根据从AST中提取的信息执行源代码的重写。

如果您仍想进行AST修改,则应通过重新构建要修改的AST部分来执行,而不是直接在原地进行更改。重建步骤应通过调用Sema上的方法来执行,该方法知道在构建AST时如何提供适当的不变式。


谢谢!我正在使用Rewriter,但是在重写obj-c消息方面遇到了一些问题,你能看一下我的问题吗?https://dev59.com/-GIj5IYBdhLWcg3wTDVn? - BergP
Clang插件如何添加例如工具链? - gnzlbg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接