2012-05-25 43 views
6

tôi có mã nguồn mà trông như thế này,Tạo tham số cho một hàm với kêu vang

void update(); 

void update() 
{ 
} 

Iam cố gắng để phân tích mã này với kêu vang và sửa đổi mã này.

typedef float v4sf attribute ((vector_size(16))); 
void update(v4sf& v1, v4sf& v2); 

void update(v4sf& v1, v4sf& v2) 
{ 
} 

Tôi đã xem các lớp Ghi đè của bài viết. Trong chức năng mà tôi đã viết như được hiển thị bên dưới,

MyRecursiveASTVisitor::VisitFunctionDecl(FunctionDecl *f) 

FunctionDecl có phương thức setParams() mà tôi có thể sử dụng. Tôi sẽ phải tạo các tham số với phương thức này.

static ParmVarDecl *Create(ASTContext &C, DeclContext *DC, 
          SourceLocation StartLoc, 
          SourceLocation IdLoc, IdentifierInfo *Id, 
          QualType T, TypeSourceInfo *TInfo, 
          StorageClass S, StorageClass SCAsWritten, 
          Expr *DefArg); 

Bốn đối số đầu tiên cho hàm tạo có thể lấy từ FunctionDecl. Tôi không chắc những gì còn lại của họ.

Làm cách nào để tạo các loại và cũng gán các giá trị cho chúng trong tiếng kêu? Các loại không cần phải được xây dựng và có thể giống như loại được thêm vào (v4sf) trong mã nguồn được chuyển đổi.

Có phải cách này (sử dụng phương pháp clang) để thực hiện các phép biến đổi hoặc tôi có thể sử dụng Rewriter.InsertText() để thêm các tham số không?

Trả lời

6

Clang không được thiết kế để hỗ trợ đột biến AST của nó, và nó không hỗ trợ tái xuất AST như mã nguồn (lưu giữ các chú thích, macro và chỉ thị tiền xử lý). Việc thêm các nút AST theo cách thủ công có thể vi phạm các bất biến AST, điều này có thể dẫn đến sự cố. Bạn nên sử dụng Rewriter để thực hiện viết lại mã nguồn, dựa trên thông tin bạn trích xuất từ ​​AST.

Nếu bạn vẫn muốn thực hiện sửa đổi AST, bạn nên làm như vậy bằng cách xây dựng lại phần AST bạn muốn sửa đổi, thay vì thay đổi nó tại chỗ. Các bước xây dựng lại nên được thực hiện bằng cách gọi phương thức trên Sema, mà biết cách cung cấp các bất biến thích hợp khi xây dựng AST.

+0

Cảm ơn bạn! Tôi đang sử dụng Rewriter, nhưng tôi có một số vấn đề với viết lại tin nhắn obj-c, bạn có thể xem câu hỏi của tôi http://stackoverflow.com/questions/20418933/clang-tool-rewrite-objcmessageexpr? – BergP

+0

cách plugin clang thêm ví dụ: thiết bị đo đạc? – gnzlbg

Các vấn đề liên quan