diff options
author | Ulrich Drepper <drepper@redhat.com> | 1999-07-28 04:34:36 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1999-07-28 04:34:36 +0000 |
commit | 3068508dba59a77c0dbd7039c13346ac11f4388f (patch) | |
tree | 950690122c0ff02b448a45f0950bf54b0feec351 /string | |
parent | 3703b10b6f0fc122ce05cdd5d8219d3dc3bac821 (diff) | |
download | glibc-3068508dba59a77c0dbd7039c13346ac11f4388f.zip glibc-3068508dba59a77c0dbd7039c13346ac11f4388f.tar.gz glibc-3068508dba59a77c0dbd7039c13346ac11f4388f.tar.bz2 |
Fix aliasing problems.
Diffstat (limited to 'string')
-rw-r--r-- | string/bits/string2.h | 293 |
1 files changed, 185 insertions, 108 deletions
diff --git a/string/bits/string2.h b/string/bits/string2.h index 1df1bf8..d81f02f 100644 --- a/string/bits/string2.h +++ b/string/bits/string2.h @@ -110,51 +110,68 @@ __STRING2_COPY_TYPE (8); # define __memset_gc(s, c, n) \ ({ void *__s = (s); \ - __uint32_t *__ts = (__uint32_t *) __s; \ + union { \ + unsigned int __ui; \ + unsigned short int __usi; \ + unsigned char __uc; \ + } *__u = __s; \ __uint8_t __c = (__uint8_t) (c); \ - \ + \ /* This `switch' statement will be removed at compile-time. */ \ switch (n) \ { \ case 15: \ - *__ts++ = __c * 0x01010101; \ + __u->__ui = __c * 0x01010101; \ + __u = (void *) __u + 4; \ case 11: \ - *__ts++ = __c * 0x01010101; \ + __u->__ui = __c * 0x01010101; \ + __u = (void *) __u + 4; \ case 7: \ - *__ts++ = __c * 0x01010101; \ + __u->__ui = __c * 0x01010101; \ + __u = (void *) __u + 4; \ case 3: \ - *((__uint16_t *) __ts)++ = __c * 0x0101; \ - *((__uint8_t *) __ts) = __c; \ + __u->__usi = (unsigned short int) __c * 0x0101; \ + __u = (void *) __u + 2; \ + __u->__uc = (unsigned char) __c; \ break; \ \ case 14: \ - *__ts++ = __c * 0x01010101; \ + __u->__ui = __c * 0x01010101; \ + __u = (void *) __u + 4; \ case 10: \ - *__ts++ = __c * 0x01010101; \ + __u->__ui = __c * 0x01010101; \ + __u = (void *) __u + 4; \ case 6: \ - *__ts++ = __c * 0x01010101; \ + __u->__ui = __c * 0x01010101; \ + __u = (void *) __u + 4; \ case 2: \ - *((__uint16_t *) __ts) = __c * 0x0101; \ + __u->__usi = (unsigned short int) __c * 0x0101; \ break; \ \ case 13: \ - *__ts++ = __c * 0x01010101; \ + __u->__ui = __c * 0x01010101; \ + __u = (void *) __u + 4; \ case 9: \ - *__ts++ = __c * 0x01010101; \ + __u->__ui = __c * 0x01010101; \ + __u = (void *) __u + 4; \ case 5: \ - *__ts++ = __c * 0x01010101; \ + __u->__ui = __c * 0x01010101; \ + __u = (void *) __u + 4; \ case 1: \ - *((__uint8_t *) __ts) = __c; \ + __u->__uc = (unsigned char) __c; \ break; \ \ case 16: \ - *__ts++ = __c * 0x01010101; \ + __u->__ui = __c * 0x01010101; \ + __u = (void *) __u + 4; \ case 12: \ - *__ts++ = __c * 0x01010101; \ + __u->__ui = __c * 0x01010101; \ + __u = (void *) __u + 4; \ case 8: \ - *__ts++ = __c * 0x01010101; \ + __u->__ui = __c * 0x01010101; \ + __u = (void *) __u + 4; \ case 4: \ - *__ts = __c * 0x01010101; \ + __u->__ui = __c * 0x01010101; \ case 0: \ break; \ } \ @@ -167,9 +184,9 @@ __STRING2_COPY_TYPE (8); : memset (s, c, n))) # endif -/* GCC optimizes memset(s, 0, n) but not bzero(s, n). */ -#if defined __GNUC__ \ - && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 90)) +/* GCC optimizes memset(s, 0, n) but not bzero(s, n). + The optimization is broken before EGCS 1.1. */ +# if __GNUC_PREREQ (2, 91) # define __bzero(s, n) __builtin_memset (s, '\0', n) # endif @@ -207,48 +224,60 @@ __mempcpy_small (void *__dest1, __uint32_t __src0_4, __uint32_t __src4_4, size_t __srclen) { - char *__dest = (char *) __dest1; + union { + __uint32_t __ui; + __uint16_t __usi; + unsigned char __uc; + unsigned char __c; + } *__u = __dest1; switch (__srclen) { case 1: - *__dest++ = __src0_1; + __u->__c = __src0_1; + __u = (void *) __u + 1; break; case 2: - *((__uint16_t *) __dest) = __src0_2; - __dest += 2; + __u->__usi = __src0_2; + __u = (void *) __u + 2; break; case 3: - *((__uint16_t *) __dest) = __src0_2; - __dest += 2; - *__dest++ = __src2_1; + __u->__usi = __src0_2; + __u = (void *) __u + 2; + __u->__c = __src2_1; + __u = (void *) __u + 1; break; case 4: - *((__uint32_t *) __dest) = __src0_4; - __dest += 4; + __u->__ui = __src0_4; + __u = (void *) __u + 4; break; case 5: - *((__uint32_t *) __dest) = __src0_4; - __dest += 4; - *__dest++ = __src4_1; + __u->__ui = __src0_4; + __u = (void *) __u + 4; + __u->__c = __src4_1; + __u = (void *) __u + 1; break; case 6: - *((__uint32_t *) __dest) = __src0_4; - *((__uint16_t *) (__dest + 4)) = __src4_2; - __dest += 6; + __u->__ui = __src0_4; + __u = (void *) __u + 4; + __u->__usi = __src4_2; + __u = (void *) __u + 2; break; case 7: - *((__uint32_t *) __dest) = __src0_4; - *((__uint16_t *) (__dest + 4)) = __src4_2; - __dest += 6; - *__dest++ = __src6_1; + __u->__ui = __src0_4; + __u = (void *) __u + 4; + __u->__usi = __src4_2; + __u = (void *) __u + 2; + __u->__c = __src6_1; + __u = (void *) __u + 1; break; case 8: - *((__uint32_t *) __dest) = __src0_4; - *((__uint32_t *) (__dest + 4)) = __src4_4; - __dest += 8; + __u->__ui = __src0_4; + __u = (void *) __u + 4; + __u->__ui = __src4_4; + __u = (void *) __u + 4; break; } - return (void *) __dest; + return (void *) __u; } # else # define __mempcpy_args(src) \ @@ -287,41 +316,50 @@ __STRING_INLINE void *__mempcpy_small (void *, char, __STRING2_COPY_ARR2, __STRING2_COPY_ARR7, __STRING2_COPY_ARR8, size_t); __STRING_INLINE void * -__mempcpy_small (void *__dest1, char __src1, +__mempcpy_small (void *__dest, char __src1, __STRING2_COPY_ARR2 __src2, __STRING2_COPY_ARR3 __src3, __STRING2_COPY_ARR4 __src4, __STRING2_COPY_ARR5 __src5, __STRING2_COPY_ARR6 __src6, __STRING2_COPY_ARR7 __src7, __STRING2_COPY_ARR8 __src8, size_t __srclen) { - char *__dest = (char *) __dest1; + union { + char __c; + __STRING2_COPY_ARR2 __sca2; + __STRING2_COPY_ARR3 __sca3; + __STRING2_COPY_ARR4 __sca4; + __STRING2_COPY_ARR5 __sca5; + __STRING2_COPY_ARR6 __sca6; + __STRING2_COPY_ARR7 __sca7; + __STRING2_COPY_ARR8 __sca8; + } *__u = __dest; switch (__srclen) { case 1: - *__dest = __src1; + __u->__c = __src1; break; case 2: - __extension__ *((__STRING2_COPY_ARR2 *) __dest) = __src2; + __extension__ __u->__sca2 = __src2; break; case 3: - __extension__ *((__STRING2_COPY_ARR3 *) __dest) = __src3; + __extension__ __u->__sca3 = __src3; break; case 4: - __extension__ *((__STRING2_COPY_ARR4 *) __dest) = __src4; + __extension__ __u->__sca4 = __src4; break; case 5: - __extension__ *((__STRING2_COPY_ARR5 *) __dest) = __src5; + __extension__ __u->__sca5 = __src5; break; case 6: - __extension__ *((__STRING2_COPY_ARR6 *) __dest) = __src6; + __extension__ __u->__sca6 = __src6; break; case 7: - __extension__ *((__STRING2_COPY_ARR7 *) __dest) = __src7; + __extension__ __u->__sca7 = __src7; break; case 8: - __extension__ *((__STRING2_COPY_ARR8 *) __dest) = __src8; + __extension__ __u->__sca8 = __src8; break; } - return (void *) (__dest + __srclen); + return __extension__ ((void *) __u + __srclen); } # endif # endif @@ -362,37 +400,48 @@ __strcpy_small (char *__dest, __uint32_t __src0_4, __uint32_t __src4_4, size_t __srclen) { + union { + __uint32_t __ui; + __uint16_t __usi; + unsigned char __uc; + } *__u = (void *) __dest; switch (__srclen) { case 1: - *__dest = '\0'; + __u->__uc = '\0'; break; case 2: - *((__uint16_t *) __dest) = __src0_2; + __u->__usi = __src0_2; break; case 3: - *((__uint16_t *) __dest) = __src0_2; - *(__dest + 2) = '\0'; + __u->__usi = __src0_2; + __u = (void *) __u + 2; + __u->__uc = '\0'; break; case 4: - *((__uint32_t *) __dest) = __src0_4; + __u->__ui = __src0_4; break; case 5: - *((__uint32_t *) __dest) = __src0_4; - *(__dest + 4) = '\0'; + __u->__ui = __src0_4; + __u = (void *) __u + 4; + __u->__uc = '\0'; break; case 6: - *((__uint32_t *) __dest) = __src0_4; - *((__uint16_t *) (__dest + 4)) = __src4_2; + __u->__ui = __src0_4; + __u = (void *) __u + 4; + __u->__usi = __src4_2; break; case 7: - *((__uint32_t *) __dest) = __src0_4; - *((__uint16_t *) (__dest + 4)) = __src4_2; - *(__dest + 6) = '\0'; + __u->__ui = __src0_4; + __u = (void *) __u + 4; + __u->__usi = __src4_2; + __u = (void *) __u + 2; + __u->__uc = '\0'; break; case 8: - *((__uint32_t *) __dest) = __src0_4; - *((__uint32_t *) (__dest + 4)) = __src4_4; + __u->__ui = __src0_4; + __u = (void *) __u + 4; + __u->__usi = __src4_4; break; } return __dest; @@ -439,31 +488,41 @@ __strcpy_small (char *__dest, __STRING2_COPY_ARR6 __src6, __STRING2_COPY_ARR7 __src7, __STRING2_COPY_ARR8 __src8, size_t __srclen) { + union { + char __c; + __STRING2_COPY_ARR2 __sca2; + __STRING2_COPY_ARR3 __sca3; + __STRING2_COPY_ARR4 __sca4; + __STRING2_COPY_ARR5 __sca5; + __STRING2_COPY_ARR6 __sca6; + __STRING2_COPY_ARR7 __sca7; + __STRING2_COPY_ARR8 __sca8; + } *__u = (void *) __dest; switch (__srclen) { case 1: - *__dest = '\0'; + __u->__c = '\0'; break; case 2: - __extension__ *((__STRING2_COPY_ARR2 *) __dest) = __src2; + __extension__ __u->__sca2 = __src2; break; case 3: - __extension__ *((__STRING2_COPY_ARR3 *) __dest) = __src3; + __extension__ __u->__sca3 = __src3; break; case 4: - __extension__ *((__STRING2_COPY_ARR4 *) __dest) = __src4; + __extension__ __u->__sca4 = __src4; break; case 5: - __extension__ *((__STRING2_COPY_ARR5 *) __dest) = __src5; + __extension__ __u->__sca5 = __src5; break; case 6: - __extension__ *((__STRING2_COPY_ARR6 *) __dest) = __src6; + __extension__ __u->__sca6 = __src6; break; case 7: - __extension__ *((__STRING2_COPY_ARR7 *) __dest) = __src7; + __extension__ __u->__sca7 = __src7; break; case 8: - __extension__ *((__STRING2_COPY_ARR8 *) __dest) = __src8; + __extension__ __u->__sca8 = __src8; break; } return __dest; @@ -500,47 +559,55 @@ __stpcpy_small (char *__dest, __uint32_t __src0_4, __uint32_t __src4_4, size_t __srclen) { + union { + unsigned int __ui; + unsigned short int __usi; + unsigned char __uc; + } *__u = (void *) __dest; switch (__srclen) { case 1: - *__dest = '\0'; + __u->__uc = '\0'; break; case 2: - *((__uint16_t *) __dest) = __src0_2; - ++__dest; + __u->__usi = __src0_2; + __u = (void *) __u + 1; break; case 3: - *((__uint16_t *) __dest) = __src0_2; - __dest += sizeof (__uint16_t); - *__dest = '\0'; + __u->__usi = __src0_2; + __u = (void *) __u + 2; + __u->__uc = '\0'; break; case 4: - *((__uint32_t *) __dest) = __src0_4; - __dest += 3; + __u->__ui = __src0_4; + __u = (void *) __u + 3; break; case 5: - *((__uint32_t *) __dest) = __src0_4; - __dest += 4; - *__dest = '\0'; + __u->__ui = __src0_4; + __u = (void *) __u + 4; + __u->__uc = '\0'; break; case 6: - *((__uint32_t *) __dest) = __src0_4; - *((__uint16_t *) (__dest + 4)) = __src4_2; - __dest += 5; + __u->__ui = __src0_4; + __u = (void *) __u + 4; + __u->__usi = __src4_2; + __u = (void *) __u + 1; break; case 7: - *((__uint32_t *) __dest) = __src0_4; - *((__uint16_t *) (__dest + 4)) = __src4_2; - __dest += 6; - *__dest = '\0'; + __u->__ui = __src0_4; + __u = (void *) __u + 4; + __u->__usi = __src4_2; + __u = (void *) __u + 2; + __u->__uc = '\0'; break; case 8: - *((__uint32_t *) __dest) = __src0_4; - *((__uint32_t *) (__dest + 4)) = __src4_4; - __dest += 7; + __u->__ui = __src0_4; + __u = (void *) __u + 4; + __u->__ui = __src4_4; + __u = (void *) __u + 3; break; } - return __dest; + return &__u->__uc; } # else # define __stpcpy_args(src) \ @@ -584,31 +651,41 @@ __stpcpy_small (char *__dest, __STRING2_COPY_ARR6 __src6, __STRING2_COPY_ARR7 __src7, __STRING2_COPY_ARR8 __src8, size_t __srclen) { + union { + char __c; + __STRING2_COPY_ARR2 __sca2; + __STRING2_COPY_ARR3 __sca3; + __STRING2_COPY_ARR4 __sca4; + __STRING2_COPY_ARR5 __sca5; + __STRING2_COPY_ARR6 __sca6; + __STRING2_COPY_ARR7 __sca7; + __STRING2_COPY_ARR8 __sca8; + } *__u = (void *) __dest; switch (__srclen) { case 1: - *__dest = '\0'; + __u->__c = '\0'; break; case 2: - __extension__ *((__STRING2_COPY_ARR2 *) __dest) = __src2; + __extension__ __u->__sca2 = __src2; break; case 3: - __extension__ *((__STRING2_COPY_ARR3 *) __dest) = __src3; + __extension__ __u->__sca3 = __src3; break; case 4: - __extension__ *((__STRING2_COPY_ARR4 *) __dest) = __src4; + __extension__ __u->__sca4 = __src4; break; case 5: - __extension__ *((__STRING2_COPY_ARR5 *) __dest) = __src5; + __extension__ __u->__sca5 = __src5; break; case 6: - __extension__ *((__STRING2_COPY_ARR6 *) __dest) = __src6; + __extension__ __u->__sca6 = __src6; break; case 7: - __extension__ *((__STRING2_COPY_ARR7 *) __dest) = __src7; + __extension__ __u->__sca7 = __src7; break; case 8: - __extension__ *((__STRING2_COPY_ARR8 *) __dest) = __src8; + __extension__ __u->__sca8 = __src8; break; } return __dest + __srclen - 1; |