diff options
Diffstat (limited to 'arch/alpha/include/asm/string.h')
| -rw-r--r-- | arch/alpha/include/asm/string.h | 24 | 
1 files changed, 18 insertions, 6 deletions
diff --git a/arch/alpha/include/asm/string.h b/arch/alpha/include/asm/string.h index b02b8a28294..c2911f59170 100644 --- a/arch/alpha/include/asm/string.h +++ b/arch/alpha/include/asm/string.h @@ -22,15 +22,27 @@ extern void * __memcpy(void *, const void *, size_t);  #define __HAVE_ARCH_MEMSET  extern void * __constant_c_memset(void *, unsigned long, size_t); +extern void * ___memset(void *, int, size_t);  extern void * __memset(void *, int, size_t);  extern void * memset(void *, int, size_t); -#define memset(s, c, n)							    \ -(__builtin_constant_p(c)						    \ - ? (__builtin_constant_p(n) && (c) == 0					    \ -    ? __builtin_memset((s),0,(n)) 					    \ -    : __constant_c_memset((s),0x0101010101010101UL*(unsigned char)(c),(n))) \ - : __memset((s),(c),(n))) +/* For gcc 3.x, we cannot have the inline function named "memset" because +   the __builtin_memset will attempt to resolve to the inline as well, +   leading to a "sorry" about unimplemented recursive inlining.  */ +extern inline void *__memset(void *s, int c, size_t n) +{ +	if (__builtin_constant_p(c)) { +		if (__builtin_constant_p(n)) { +			return __builtin_memset(s, c, n); +		} else { +			unsigned long c8 = (c & 0xff) * 0x0101010101010101UL; +			return __constant_c_memset(s, c8, n); +		} +	} +	return ___memset(s, c, n); +} + +#define memset __memset  #define __HAVE_ARCH_STRCPY  extern char * strcpy(char *,const char *);  | 
