2013-04-03 2 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 (Nvidia PTX бэкэнд), он говорит:

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

Итак, я не знаю, правильно ли это значение создания структуры. Мне нужна ценность, а не выделенная память.

У кого-нибудь есть идея?

С уважением, Сян.

ответ

10

Постоянная структура - это своего рода букваль, который - лояльный к его имени - может содержать только другие константы, а не общие значения. Тогда правильный способ создания этой структуры - через 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

Спасибо! Это работает!!! –

Смежные вопросы