我正在尝试创建结构类型的LLVM值。我正在使用LLVM-C接口并找到一个函数:
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后端)时,它说:
模块0(27,39):解析错误:无效使用函数本地名称
所以,我不知道这个结构值创建是否正确。我需要的是一个值,而不是分配的内存。
有人有想法吗?
此致 项。
答案 0 :(得分: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