在以下代码中调用memcpy(最后一行)时出现seg错误错误。谁能想到为什么?
%gds0 = getelementptr i16* %ldcs0, i32 0
%gds0.i8 = bitcast i16* %gds0 to i8*
%gdd0 = getelementptr i16* %ldcs0, i32 0
%gdd0.i8 = bitcast i16* %gdd0 to i8*
call void @llvm.memcpy.p0i8.p0i8.i32(i8* %gdd0.i8, i8* %gds0.i8 ,i32 2, i32 4, i1 false)
答案 0 :(得分:0)
首先,getelementptr i16* %ldcs0, i32 0
有什么意义?这些说明没有做任何事情。并且您使用相同的基址和相同的索引两次,因此您的代码等同于
%ldcs.i8 = bitcast i16* %ldcs to i8*
call void @llvm.memcpy.p0i8.p0i8.i32(i8* %ldcs.i8, i8* %ldcs.i8 ,i32 2, i32 4, i1 false)
不允许将源指针和目标指针指向同一位置,因为您可以阅读on the intrinsic's documentation:
“
llvm.memcpy.*
”内在函数会将一块内存从源位置复制到目标位置,不允许重叠。
所以这可以解释你的错误。但是,即使您将其修复为使用两个不同的位置,如果出现以下情况,它仍可能会失败:
最后,您实际上不需要使用memcpy
来复制两个字节,上面的代码可以由load i16*
后跟store i16
重写。