summaryrefslogtreecommitdiff
path: root/string
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1999-07-28 04:34:36 +0000
committerUlrich Drepper <drepper@redhat.com>1999-07-28 04:34:36 +0000
commit3068508dba59a77c0dbd7039c13346ac11f4388f (patch)
tree950690122c0ff02b448a45f0950bf54b0feec351 /string
parent3703b10b6f0fc122ce05cdd5d8219d3dc3bac821 (diff)
Fix aliasing problems.
Diffstat (limited to 'string')
-rw-r--r--string/bits/string2.h293
1 files changed, 185 insertions, 108 deletions
diff --git a/string/bits/string2.h b/string/bits/string2.h
index 1df1bf841d..d81f02fb5d 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;