mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-28 00:21:52 +03:00
Update.
1999-04-30 09:02 -0400 Zack Weinberg <zack@rabi.columbia.edu> * string/bits/string2.h (memset): Avoid arithmetic overflow at compile time, which produces obnoxious warnings. If GCCv2 is in use, map __bzero to __builtin_memset to enable that optimization.
This commit is contained in:
@ -95,13 +95,15 @@ __STRING2_COPY_TYPE (8);
|
||||
#ifndef _HAVE_STRING_ARCH_memset
|
||||
# define memset(s, c, n) \
|
||||
(__extension__ (__builtin_constant_p (n) && (n) <= 16 \
|
||||
? (__builtin_constant_p (c) \
|
||||
? __memset_gc (s, (c) * 0x01010101, n) \
|
||||
: __memset_gc (s, (n) == 1 ? (c) : (c) * 0x01010101, n)) \
|
||||
? ((n) == 1 \
|
||||
? __memset_1 (s, c) \
|
||||
: __memset_gc (s, (((__uint8_t) c) * 0x1010101), n)) \
|
||||
: (__builtin_constant_p (c) && (c) == '\0' \
|
||||
? ({ void *__s = (s); __bzero (__s, n); __s; }) \
|
||||
: memset (s, c, n))))
|
||||
|
||||
#define __memset_1(s, c) ({ void *__s = (s); *((__uint8_t *) __s) = c; __s; })
|
||||
|
||||
#define __memset_gc(s, c, n) \
|
||||
({ void *__s = (s); \
|
||||
__uint32_t *__ts = (__uint32_t *) __s; \
|
||||
@ -153,6 +155,11 @@ __STRING2_COPY_TYPE (8);
|
||||
} \
|
||||
\
|
||||
__s; })
|
||||
/* GCC optimizes memset(s, 0, n) but not bzero(s, n). */
|
||||
#if defined __GNUC__ && __GNUC__ >= 2
|
||||
# define __bzero(s, n) __builtin_memset(s, '\0', n)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user