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のリライタークラスを見ました。以下に示すように私が書いた関数では、

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 関数の最初の 4 つの引数は、FunctionDecl から取得できます。残りの部分がどうあるべきかわかりません。

タイプを作成し、clang でそれらに値を割り当てるにはどうすればよいですか? 型は組み込みである必要はなく、変換されたソース コードに追加されたもの (v4sf) のようなものである可能性があります。

この方法で (clang メソッドを使用して) 変換を行うか、Rewriter.InsertText() を使用してパラメーターを追加できますか?

4

1 に答える 1

7

Clang は AST の変更をサポートするように設計されておらず、AST をソース コードとして再エクスポートすることもサポートしていません (コメント、マクロ、およびプリプロセッサ ディレクティブを保持します)。AST ノードを手動で追加すると、AST 不変条件に違反する可能性が高くなり、クラッシュにつながる可能性があります。RewriterAST から抽出した情報に基づいて、 を使用してソース コードの書き換えを実行する必要があります。

それでも AST の変更を実行したい場合は、変更したい AST の部分をその場で変更するのではなく、再構築する必要があります。Sema再構築の手順は、AST を構築するときに適切な不変条件を提供する方法を知っている のメソッドを呼び出すことによって実行する必要があります。

于 2012-05-26T05:29:43.567 に答える