aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog14
-rw-r--r--string/tester.c2
-rw-r--r--sysdeps/i386/i486/bits/string.h20
3 files changed, 26 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index 8a1704a..49b5cac 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2003-01-13 Ulrich Drepper <drepper@redhat.com>
+
+ * string/tester.c (test_strcpy): Use the previously #if 0'ed code
+ to test void* parameters.
+
+ * sysdeps/i386/i486/bits/string.h (__STRING_SMALLL_GET16): Cast
+ source pointer before dereferencing.
+ (__STRING_SMALLL_GET32): Likewise.
+ (__memset_gc): Add missing parenthesis around macro arguments.
+ Patch by Denis Zaitsev<zzz@cd-club.ru>.
+
+ * sysdeps/i386/i486/bits/string.h (__strspn_cg): Tell the compiler
+ that %eax is modified. Reported by Denis Zaitsev<zzz@cd-club.ru>.
+
2003-01-14 Jakub Jelinek <jakub@redhat.com>
* sysdeps/unix/alpha/sysdep.h (INLINE_SYSCALL): Undefined before
diff --git a/string/tester.c b/string/tester.c
index 0a69d26..dab5705 100644
--- a/string/tester.c
+++ b/string/tester.c
@@ -174,13 +174,11 @@ test_strcpy (void)
SIMPLE_COPY(strcpy, 15, "555555555555555", 56);
SIMPLE_COPY(strcpy, 16, "6666666666666666", 57);
-#if 0
/* Simple test using implicitly coerced `void *' arguments. */
const void *src = "frobozz";
void *dst = one;
check (strcpy (dst, src) == dst, 1);
equal (dst, "frobozz", 2);
-#endif
}
static void
diff --git a/sysdeps/i386/i486/bits/string.h b/sysdeps/i386/i486/bits/string.h
index 604d990..54ff2e0 100644
--- a/sysdeps/i386/i486/bits/string.h
+++ b/sysdeps/i386/i486/bits/string.h
@@ -41,10 +41,13 @@
/* The macros are used in some of the optimized implementations below. */
#define __STRING_SMALL_GET16(src, idx) \
- (((src)[idx + 1] << 8) | (src)[idx])
+ ((((__const unsigned char *) (src))[idx + 1] << 8) \
+ | ((__const unsigned char *) (src))[idx])
#define __STRING_SMALL_GET32(src, idx) \
- ((((src)[idx + 3] << 8 | (src)[idx + 2]) << 8 \
- | (src)[idx + 1]) << 8 | (src)[idx])
+ (((((__const unsigned char *) (src))[idx + 3] << 8 \
+ | ((__const unsigned char *) (src))[idx + 2]) << 8 \
+ | ((__const unsigned char *) (src))[idx + 1]) << 8 \
+ | ((__const unsigned char *) (src))[idx])
/* Copy N bytes of SRC to DEST. */
@@ -230,7 +233,7 @@ memcmp (__const void *__s1, __const void *__s2, size_t __n)
assignments using immediate operands. But this uses to much \
memory (7, instead of 4 bytes). So we force the value in a \
registers. */ \
- if (n == 3 || n >= 5) \
+ if ((n) == 3 || (n) >= 5) \
__asm__ __volatile__ ("" : "=r" (__c) : "0" (__c)); \
\
/* This `switch' statement will be removed at compile-time. */ \
@@ -1650,14 +1653,15 @@ __strspn_cg (__const char *__s, __const char __accept[], size_t __accept_len)
"lodsb\n\t"
"testb %%al,%%al\n\t"
"je 2f\n\t"
- "movl %1,%%edi\n\t"
+ "movl %5,%%edi\n\t"
"movl %6,%%ecx\n\t"
"repne; scasb\n\t"
"je 1b\n"
"2:"
- : "=S" (__res), "=&d" (__d0), "=&c" (__d1), "=&D" (__d2)
- : "0" (__s), "1" (__accept), "g" (__accept_len),
- /* Since we do not know how large the memory we access it, use a really large amount. */
+ : "=S" (__res), "=&a" (__d0), "=&c" (__d1), "=&D" (__d2)
+ : "0" (__s), "g" (__accept), "g" (__accept_len),
+ /* Since we do not know how large the memory we access it, use a
+ really large amount. */
"m" ( *(struct { char __x[0xfffffff]; } *)__s),
"m" ( *(struct { __extension__ char __x[__accept_len]; } *)__accept)
: "cc");