2011-10-16 46 views
8

Tôi muốn ghi lại một số hành vi động vào một số biến toàn cầu. Vì vậy, tôi đã viết một pass để cụ mã và chèn một số hướng dẫn để cập nhật các biến toàn cầu. Tôi đã thử sử dụng hàm tạo GlobalVariable để định nghĩa một biến toàn cục, nhưng có hai vấn đề. Trước tiên, làm thế nào tôi có thể xác định các biến toàn cầu trong mô-đun chứa hàm chính? Thứ hai, làm thế nào tôi có thể khai báo các biến toàn cầu trong các mô-đun khác? Nó giống như "extern double someThing;".Làm thế nào tôi có thể khai báo một biến toàn cục trong LLVM?

Các chương trình mục tiêu được viết bằng C.

+0

Ngôn ngữ nào bạn đang sử dụng? ([LLVM] (http://llvm.org/) không phải là một ngôn ngữ, đó là "một bộ sưu tập các trình biên dịch và công cụ chuỗi công cụ có thể tái sử dụng và mô-đun"). –

+2

Có vẻ như họ đang sử dụng API LLVM để xây dựng các chương trình trực tiếp, thay vì biên dịch một ngôn ngữ. –

+1

Có, tôi chỉ muốn chèn một số hướng dẫn. – dalibocai

Trả lời

21

Có một công cụ mà có thể trả lời này và nhiều câu hỏi khác về LLVM API: llc -march=cpp. Bạn có thể tạo một tệp bitcode bằng cách sử dụng Clang hoặc llvm-gcc và sau đó xây dựng một mã C++ sẽ tái tạo lại cùng một mô-đun bằng cách sử dụng phụ trợ cpp.

Một sản lượng mẫu, cho thấy làm thế nào để xác định một int * biến toàn cầu:

// Global Variable Declarations 

GlobalVariable* gvar_ptr_abc = new GlobalVariable(/*Module=*/*mod, 
     /*Type=*/PointerTy_0, 
     /*isConstant=*/false, 
     /*Linkage=*/GlobalValue::CommonLinkage, 
     /*Initializer=*/0, // has initializer, specified below 
     /*Name=*/"abc"); 
gvar_ptr_abc->setAlignment(4); 

// Constant Definitions 
ConstantPointerNull* const_ptr_2 = ConstantPointerNull::get(PointerTy_0); 

// Global Variable Definitions 
gvar_ptr_abc->setInitializer(const_ptr_2); 
+0

Có vẻ như C++, không phải C (cuộc gọi 'ConstantPointerNull :: get()'). –

+6

@Keith Thompson, bạn không thể viết một LLVM vượt qua trong C anyway, vậy vấn đề là gì? –

+1

OP cho biết các chương trình mục tiêu được viết bằng C. (Tôi không quen với LLVM, vì vậy tôi sẽ không bình luận thêm.) –

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