This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.
Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Hi!
realloc was using memcpy even for copies where source and destination might
overlap. Found with new alphaev6 memcpy during make check. Maybe we should sometimes
try using
void *memcpy (void *dst, const void *src, size_t len)
{
memset(dst, 0xaf, len);
return memmove(dst, src, len);
}
and see what crashes...
2000-12-27 Jakub Jelinek <jakub@redhat.com>
* malloc/malloc.c (memmove): Add prototypes.
(MALLOC_MEMMOVE): Define.
(chunk_realloc): Use it instead of MALLOC_COPY if source and
destination might overlap.
--- libc/malloc/malloc.c.jj Fri Sep 29 12:56:58 2000
+++ libc/malloc/malloc.c Wed Dec 27 17:58:28 2000
@@ -415,9 +415,11 @@ extern "C" {
#if __STD_C
void* memset(void*, int, size_t);
void* memcpy(void*, const void*, size_t);
+void* memmove(void*, const void*, size_t);
#else
Void_t* memset();
Void_t* memcpy();
+Void_t* memmove();
#endif
#endif
@@ -462,6 +464,24 @@ do {
} else memcpy(dest, src, mcsz); \
} while(0)
+#define MALLOC_MEMMOVE(dest,src,nbytes) \
+do { \
+ INTERNAL_SIZE_T mcsz = (nbytes); \
+ if(mcsz <= 9*sizeof(mcsz)) { \
+ INTERNAL_SIZE_T* mcsrc = (INTERNAL_SIZE_T*) (src); \
+ INTERNAL_SIZE_T* mcdst = (INTERNAL_SIZE_T*) (dest); \
+ if(mcsz >= 5*sizeof(mcsz)) { *mcdst++ = *mcsrc++; \
+ *mcdst++ = *mcsrc++; \
+ if(mcsz >= 7*sizeof(mcsz)) { *mcdst++ = *mcsrc++; \
+ *mcdst++ = *mcsrc++; \
+ if(mcsz >= 9*sizeof(mcsz)) { *mcdst++ = *mcsrc++; \
+ *mcdst++ = *mcsrc++; }}} \
+ *mcdst++ = *mcsrc++; \
+ *mcdst++ = *mcsrc++; \
+ *mcdst = *mcsrc ; \
+ } else memmove(dest, src, mcsz); \
+} while(0)
+
#else /* !USE_MEMCPY */
/* Use Duff's device for good zeroing/copying performance. */
@@ -501,6 +521,8 @@ do {
} \
} while(0)
+#define MALLOC_MEMMOVE(dest,src,nbytes)
+
#endif
@@ -3365,7 +3387,7 @@ arena* ar_ptr; mchunkptr oldp; INTERNAL_
unlink(prev, bck, fwd);
newp = prev;
newsize += prevsize + nextsize;
- MALLOC_COPY(BOUNDED_N(chunk2mem(newp), oldsize), oldmem, oldsize);
+ MALLOC_MEMMOVE(BOUNDED_N(chunk2mem(newp), oldsize), oldmem, oldsize);
top(ar_ptr) = chunk_at_offset(newp, nb);
set_head(top(ar_ptr), (newsize - nb) | PREV_INUSE);
set_head_size(newp, nb);
@@ -3380,7 +3402,7 @@ arena* ar_ptr; mchunkptr oldp; INTERNAL_
unlink(prev, bck, fwd);
newp = prev;
newsize += nextsize + prevsize;
- MALLOC_COPY(BOUNDED_N(chunk2mem(newp), oldsize), oldmem, oldsize);
+ MALLOC_MEMMOVE(BOUNDED_N(chunk2mem(newp), oldsize), oldmem, oldsize);
goto split;
}
}
@@ -3391,7 +3413,7 @@ arena* ar_ptr; mchunkptr oldp; INTERNAL_
unlink(prev, bck, fwd);
newp = prev;
newsize += prevsize;
- MALLOC_COPY(BOUNDED_N(chunk2mem(newp), oldsize), oldmem, oldsize);
+ MALLOC_MEMMOVE(BOUNDED_N(chunk2mem(newp), oldsize), oldmem, oldsize);
goto split;
}
}
Jakub
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |