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

4

1 回答 1

7

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

如果您仍想执行 AST 修改,您应该通过重建您希望修改的 AST 部分来执行此操作,而不是就地更改它。重建步骤应该通过调用 on 方法来执行Sema,它知道在构建 AST 时如何提供适当的不变量。

于 2012-05-26T05:29:43.567 回答