2011-12-04 37 views
10

Khi xây dựng IR từ một AST hiện có, AST của tôi có một số giá trị chuỗi (tại thời gian biên dịch chúng được xây dựng từ std::string) và tôi muốn cài đặt chúng một cách an toàn như llvm::Value để sử dụng như một phần của một biểu thức.LLVM String Value objects: Làm thế nào tôi có thể lấy String từ một giá trị?

Trong trường hợp này, tôi không cần phải ràng buộc chuỗi tại thời gian chạy, bởi vì các giá trị chuỗi chỉ có nghĩa là để giải quyết các công cụ như biến, hàm hoặc lớp tại thời gian biên dịch (ngôn ngữ không hỗ trợ loại chuỗi).

Làm cách nào tốt nhất để giữ nội dung chuỗi của tôi là llvm::Valuevẫn có thể truy xuất nó ở các giai đoạn biên dịch sau (khi biểu thức lồng được tạo)?

Cụ thể hơn, nếu tôi đặt llvm::Value với:

llvm::Value* v = llvm::ConstantArray::get(llvmContext, myString.c_str()); 

Làm thế nào để an toàn lấy giá trị chuỗi? Có phải llvm::ConstantArray cách thích hợp để quấn dây không?

Trả lời

5

Vâng, ConstantArray là những gì bạn nên sử dụng ở đây. Để lấy giá trị sau này, chỉ cần sử dụng ConstantArray :: getAsCString(). Nếu bạn đã bật xác nhận, nó sẽ xác nhận xem có vấn đề gì không (ví dụ: bạn sẽ cố gắng lấy chuỗi từ mảng w/o zero terminator).

3

Chạy http://llvm.org/demo/ trên mã C char *x = "asdf"; cho:

@.str = private unnamed_addr constant [5 x i8] c"asdf\00" 
@x = global i8* getelementptr inbounds ([5 x i8]* @.str, i64 0, i64 0), align 8 

Về cơ bản, để có được địa chỉ của một chuỗi, bạn phải xây dựng một thế giới chứa nó. Bạn có thể chuyển đổi http://llvm.org/demo/ để thực hiện các cuộc gọi API C++ nếu bạn gặp khó khăn trong việc tìm ra cách thực hiện điều đó.

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