Added wine_memcpy_unaligned function to avoid gcc memcpy
optimizations.
diff --git a/include/wine/port.h b/include/wine/port.h
index 8baa5bf..a23ea53 100644
--- a/include/wine/port.h
+++ b/include/wine/port.h
@@ -190,7 +190,7 @@
#endif /* HAVE_MKSTEMP */
#ifndef HAVE_MEMMOVE
-void *memmove(void *dest, const void *src, unsigned int len);
+void *memmove(void *dest, const void *src, size_t len);
#endif /* !defined(HAVE_MEMMOVE) */
#ifndef HAVE_PREAD
@@ -229,6 +229,12 @@
int usleep (unsigned int useconds);
#endif /* !defined(HAVE_USLEEP) */
+#ifdef __i386__
+#define wine_memcpy_unaligned memcpy
+#else
+extern void *wine_memcpy_unaligned( void *dst, const void *src, size_t size );
+#endif /* __i386__ */
+
/* Interlocked functions */
#if defined(__i386__) && defined(__GNUC__)
diff --git a/library/port.c b/library/port.c
index 0f21e83..25fd4b7 100644
--- a/library/port.c
+++ b/library/port.c
@@ -94,7 +94,7 @@
* memmove
*/
#ifndef HAVE_MEMMOVE
-void *memmove( void *dest, const void *src, unsigned int len )
+void *memmove( void *dest, const void *src, size_t len )
{
register char *dst = dest;
@@ -666,6 +666,19 @@
#endif /* HAVE_ECVT */
+#ifndef wine_memcpy_unaligned
+/***********************************************************************
+ * wine_memcpy_unaligned
+ *
+ * This is necessary to defeat optimizations of memcpy by gcc.
+ */
+void *wine_memcpy_unaligned( void *dst, const void *src, size_t size )
+{
+ return memcpy( dst, src, size );
+}
+#endif
+
+
/***********************************************************************
* interlocked functions
*/
diff --git a/loader/ne/resource.c b/loader/ne/resource.c
index 1a48c77..dd236bd 100644
--- a/loader/ne/resource.c
+++ b/loader/ne/resource.c
@@ -277,7 +277,7 @@
while(pTypeInfo->type_id)
{
- memcpy( &pTypeInfo->resloader, &DefResourceHandlerProc, sizeof(FARPROC16) );
+ wine_memcpy_unaligned( &pTypeInfo->resloader, &DefResourceHandlerProc, sizeof(FARPROC16) );
pTypeInfo = NEXT_TYPEINFO(pTypeInfo);
}
return TRUE;
@@ -303,8 +303,8 @@
{
if (!(pTypeInfo = NE_FindTypeSection( pResTab, pTypeInfo, typeId )))
break;
- memcpy( &prevHandler, &pTypeInfo->resloader, sizeof(FARPROC16) );
- memcpy( &pTypeInfo->resloader, &resourceHandler, sizeof(FARPROC16) );
+ wine_memcpy_unaligned( &prevHandler, &pTypeInfo->resloader, sizeof(FARPROC16) );
+ wine_memcpy_unaligned( &pTypeInfo->resloader, &resourceHandler, sizeof(FARPROC16) );
pTypeInfo = NEXT_TYPEINFO(pTypeInfo);
}
return prevHandler;
@@ -507,7 +507,7 @@
else
{
FARPROC16 resloader;
- memcpy( &resloader, &pTypeInfo->resloader, sizeof(FARPROC16) );
+ wine_memcpy_unaligned( &resloader, &pTypeInfo->resloader, sizeof(FARPROC16) );
if ( resloader && resloader != DefResourceHandlerProc )
pNameInfo->handle = NE_CallTo16_word_www(
resloader, pNameInfo->handle, pModule->self, hRsrc );