2013-02-14 4 views
0

Я получаю ошибку сбоя seg при вызове memcpy (последняя строка) в следующем коде. Может кто-нибудь догадаться, почему?ошибка сегментации в 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.

Смежные вопросы