如何创建 LLVM 结构值?

Posted

技术标签:

【中文标题】如何创建 LLVM 结构值?【英文标题】:How to create LLVM structure value? 【发布时间】:2013-04-03 11:07:01 【问题描述】:

我正在尝试创建结构类型的 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):解析错误:函数本地名称的使用无效

所以,我不知道这个结构值创建是否正确。我需要的是一个值,而不是分配的内存。

有人知道吗?

问候, 向。

【问题讨论】:

【参考方案1】:

常量结构是一种字面量 - 忠于其名称 - 只能包含其他常量,而不是一般值。那么,生成该结构的正确方法是通过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

【讨论】:

以上是关于如何创建 LLVM 结构值?的主要内容,如果未能解决你的问题,请参考以下文章

LLVM NVPTX 后端结构参数零大小

LLVM IR 对结构内存对齐的有线行为?

LLVM IR类型系统结构分析

如何创建新结构并将其原始值用作新结构的成员

LLVM 的DSA与APA优化

如何获取 LLVM 全局变量常量值?