0

在以下代码中调用 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)
4

1 回答 1

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)

并且不允许源指针和目标指针指向相同的位置,您可以在内部文档中阅读:

' llvm.memcpy.*' 内部函数将一块内存从源位置复制到目标位置,不允许重叠

所以这可以解释你的错误。但是,即使您修复它以使用两个不同的位置,它仍然可能会在以下情况下失败:

  1. 源内存或目标内存都不属于进程
  2. 在您明确指定(在参数列表中)它们是

最后,你真的不需要使用 amemcpy来复制两个字节,上面的代码可以重写为 aload i16*后跟store i16.

于 2013-02-14T13:05:06.820 回答