2013-04-03 25 views
6

Bir yapı türünün LLVM değerini oluşturmaya çalışıyorum. Ben LLVM-C arayüzünü kullanarak ve bir fonksiyonu bulmak ediyorum:LLVM yapı değeri nasıl oluşturulur?

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

tüm üyeler LLVMConstXXX (yarattığı sabit değer ise bu, o gibi kod oluşturur) çalışıyor:

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

Ama Ben NVVM (Nvidia PTX arka uç) için LLVM kod parçası gönderdiğinizde, diyor

%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 

Ve:

sorun üyesi sabit değilse, bu gibi şeyler üretecektir olduğunu

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

Bu yapısal değer oluşturmanın doğru olup olmadığını bilmiyorum. İhtiyacım olan bir değer, ayrılmış bir bellek değil.

Herkesin fikri vardır?

Saygılarımızla, Xiang.

cevap

10

Sabit bir yapı, adına sadık kalmanın genel değerleri değil, yalnızca başka sabitleri de içerebileceği bir tür değişmezdir. Bu yapıyı oluşturmanın doğru yolu, insertvalue aracılığıyladır. Yukarıdaki örnekte, şu şekilde görünmelidir:

%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

Teşekkürler! Bu işe yarıyor!!! –