2013-04-03 28 views
6

Próbuję utworzyć wartość LLVM typu struktury. Używam interfejsu LLVM-C i znaleźć funkcję:Jak utworzyć wartość struktury LLVM?

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

Działa to dobrze, jeżeli wszyscy członkowie są wartością stałą stworzony przez LLVMConstXXX() wygeneruje kod jak:

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

ale problem jest wtedy, gdy użytkownik nie jest stała, będzie generować takie rzeczy jak:

%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 

i kiedy wysłać ten kawałek kodu LLVM do NVVM (Nvidia PTX backend), to mówi:

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

Więc nie wiem, czy to tworzenie wartości struct jest poprawne. Potrzebuję wartości, a nie przydzielonej pamięci.

Ktoś ma pomysł?

Pozdrawiam, Xiang.

Odpowiedz

10

Stała struktura jest rodzajem literału, który - lojalny wobec jego nazwy - może zawierać tylko inne stałe, a nie ogólne wartości. Prawidłowy sposób generowania tej struktury to: insertvalue. W powyższym przykładzie powinna wyglądać następująco:

%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

Dzięki! To działa!!! –