llvm ir中的分段错误

时间:2013-02-14 12:16:41

标签: segmentation-fault llvm

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

1 个答案:

答案 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.*”内在函数会将一块内存从源位置复制到目标位置,不允许重叠

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

  1. 源或目标内存不属于进程
  2. 在您明确指定(在参数列表中)
  3. 之后,源内存或目标内存未对齐到4个字节

    最后,您实际上不需要使用memcpy来复制两个字节,上面的代码可以由load i16*后跟store i16重写。