Создание параметров для функции с помощью clang

у меня есть исходный код, который выглядит так,

void update();

void update()
{
}

IAM пытается разобрать этот код с помощью 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 (), который я мог бы использовать. Мне пришлось бы создать params с помощью этого метода.

  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 ответов


Clang не предназначен для поддержки мутации своего AST и не поддерживает реэкспорт AST в качестве исходного кода (сохранение комментариев, макросов и директив препроцессора). Добавление узлов AST вручную может нарушить инварианты AST, что может привести к сбоям. Вы должны использовать Rewriter для выполнения перезаписи исходного кода на основе информации, извлеченной из AST.

Если вы все еще хотите выполнить модификации AST, вы должны сделать это, перестроив часть АСТ вы хотите изменить, а не изменять его на месте. Шаги перестроения должны выполняться путем вызова методов on Sema, который знает, как обеспечить соответствующие инварианты при построении AST.