0

次のコードでmemcpyが呼び出されると(最後の行)、セグメンテーション違反エラーが発生します。誰もが理由を推測できますか?

%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何ですか?それらの指示は何もしません。また、同じベース アドレスと同じインデックスを 2 回使用するため、コードは次のようになります。

%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.*' 組み込み関数は、コピー元の場所からコピー先の場所にメモリ ブロックをコピーしますが、重複は許可されていません

したがって、これでエラーを説明できます。ただし、2 つの異なる場所を使用するように修正しても、次の場合は失敗する可能性があります。

  1. ソースまたは宛先メモリのいずれかがプロセスによって所有されていません
  2. 明示的に (引数リストで) 指定した後、ソースまたは宛先メモリのいずれかが 4 バイトにアラインされていません。

最後に、2 バイトだけをコピーするために a を実際に使用する必要はありません。memcpy上記のコードは、a のload i16*後にstore i16.

于 2013-02-14T13:05:06.820 に答える