【问题标题】:Creating parameters for a function with clang使用 clang 为函数创建参数
【发布时间】:2012-05-25 01:44:01
【问题描述】:

我有这样的源代码,

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

【问题讨论】:

    标签: llvm clang


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢!我正在使用 Rewriter,但我在重写 obj-c 消息时遇到了一些问题,你能看看我的问题stackoverflow.com/questions/20418933/… 吗?
    • clang 插件如何添加例如仪器仪表?
    猜你喜欢
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 2015-06-14
    相关资源
    最近更新 更多