2013-02-14 71 views
0

在下面的代码中调用memcpy(最后一行)时出现seg错误错误。任何人都能猜到为什么在llvm中的段错误ir

%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

首先,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. 源或目标内存不排列为4个字节,你明确指定(参数列表),他们是

最后经过,你并不真的需要使用memcpy拷贝只有两个字节,上面的代码可以被改写load i16*,然后是store i16