2011-12-04 67 views
10

當從現有的AST構建IR時,我的AST有一些字符串值(在編譯時它們是從std::string構建的),我想將它們安全地設置爲llvm::Value以用作表達式的一部分。LLVM字符串值對象:如何從值中檢索字符串?

在這種情況下,我不需要在運行時綁定字符串,因爲字符串值僅用於在編譯時將其作爲變量,函數或類來解析(該語言不支持本機字符串類型)。

請告訴我讓我的字符串內容llvm::Value最好的辦法還是可以在編譯的後期階段(當嵌套表達式建)以獲取它?

更具體地說,如果我設置llvm::Value有:

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

如何安全地獲取字符串值?是llvm::ConstantArray合適的方式來包裝字符串?

回答

5

是的,ConstantArray是你應該在這裏使用。爲了稍後檢索值,只需使用ConstantArray :: getAsCString()。如果你打開了斷言,它會斷言是否會出錯(例如,你將嘗試從無終止符的數組中抓取字符串)。

3

的C代碼char *x = "asdf";運行http://llvm.org/demo/給出:

@.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 

基本上,得到一個字符串的地址,你必須建立一個全球性的含有它。如果您無法確定如何執行此操作,則可以將http://llvm.org/demo/切換爲輸出C++ API調用。