2013-04-03 29 views
6

我正在嘗試創建一個結構類型的LLVM值。我使用LLVM-C接口,並找到一個函數:如何創建LLVM結構值?

LLVMValueRef LLVMConstStruct (LLVMValueRef *ConstantVals, unsigned Count, LLVMBool Packed) 

如果所有的成員都是由LLVMConstXXX(創建恆定值也能正常工作),它會產生類似的代碼:

store { i32, i32, i32 } { i32 1, i32 2, i32 3 }, { i32, i32, i32 }* %17, align 4 

但問題是,如果會員不是恆定的,它會生成諸如:

%0 = call i32 @llvm.nvvm.read.ptx.sreg.tid.x() 
store { i32, i32, i32 } { i32 1, i32 %0, i32 3 }, { i32, i32, i32 }* %17, align 4 

當我這塊LLVM代碼發送到NVVM(英偉達PTX後端),它說:

module 0 (27, 39): parse error: invalid use of function-local name

所以,我不知道這個結構值創建是否正確。我需要的是一個值,而不是分配的內存。

有人有想法嗎?

Regards, Xiang。

回答

10

一個常量struct是一種忠於其名稱的文字 - 可能只包含其他常量,而不包含常規值。然後,生成該結構的正確方法是通過insertvalue。在你上面的例子中,它應該看起來像這樣:

%0 = call i32 @llvm.nvvm.read.ptx.sreg.tid.x() 
%1 = insertvalue {i32, i32, i32} {i32 1, i32 undef, i32 3}, i32 %0, 1 
store { i32, i32, i32 } %1, { i32, i32, i32 }* %17, align 4 
+0

Thanks !!這樣可行!!! –