LLVM IR如何将结构传递给函数
我正在制作自己的c语言,我正在尝试将结构传递给函数。结构 表示数组(一个成员是指向数组的指针,另一个成员是长度)。如果我像这样调用函数“test:LLVM IR如何将结构传递给函数,llvm,llvm-ir,Llvm,Llvm Ir,我正在制作自己的c语言,我正在尝试将结构传递给函数。结构 表示数组(一个成员是指向数组的指针,另一个成员是长度)。如果我像这样调用函数“test:调用void@test(%structintarray%a)我会得到错误:'%a'是用类型'%structintarray*'定义的,但预期'%structintarray=type{i32*,i32}.但是如果我像这样调用“test:调用void@test(%structintarray*%a)我会得到错误:'@test是用类型'void'定义的(%
调用void@test(%structintarray%a)
我会得到错误:'%a'是用类型'%structintarray*'定义的,但预期'%structintarray=type{i32*,i32}.
但是如果我像这样调用“test:调用void@test(%structintarray*%a)
我会得到错误:'@test是用类型'void'定义的(%structintarray)*'但应为“void(%structintarray*)*”
我不理解第二个错误
我做错了什么?
`
产生
%structintarray = type { i32*, i32 }
define void @test(%structintarray %__p__a) {
entry: %a = alloca %structintarray, align 4
store %structintarray %__p__a , %structintarray* %a, align 4
ret void
}
define i32 @main() {
entry: %t0 = call noalias i8* @calloc(i32 5 , i32 4)
%t1 = bitcast i8* %t0 to i32*
%a = alloca %structintarray, align 4
%t2 = getelementptr %structintarray, %structintarray* %a, i32 0, i32 0
store i32* %t1 , i32** %t2, align 4 ; pointer to array
%t3 = getelementptr %structintarray, %structintarray* %a, i32 0, i32 1
store i32 5 , i32* %t3, align 4 ; size of array
call void @test(%structintarray %a)
ret i32 0
}
alloca
返回一个指针,如果要将其传递给一个按值构造的函数,则需要取消引用(加载
)它。这非常有效,谢谢。
%structintarray = type { i32*, i32 }
define void @test(%structintarray %__p__a) {
entry: %a = alloca %structintarray, align 4
store %structintarray %__p__a , %structintarray* %a, align 4
ret void
}
define i32 @main() {
entry: %t0 = call noalias i8* @calloc(i32 5 , i32 4)
%t1 = bitcast i8* %t0 to i32*
%a = alloca %structintarray, align 4
%t2 = getelementptr %structintarray, %structintarray* %a, i32 0, i32 0
store i32* %t1 , i32** %t2, align 4 ; pointer to array
%t3 = getelementptr %structintarray, %structintarray* %a, i32 0, i32 1
store i32 5 , i32* %t3, align 4 ; size of array
call void @test(%structintarray %a)
ret i32 0
}