* sysdeps/generic/bp-checks.h: Use unbounded __memchr

rather than non-existent __ubp_memchr. 
(CHECK_STRINGopt, CHECK_FCNTL, BOUNDED_N, BOUNDED_1): New macros. 
(_CHECK_STRING, _CHECK_N): New macros. 
(CHECK_STRING, CHECK_N, CHECK_Nopt): Rewrite in terms of _CHECK_*. 
(CHECK_IOCTL): Move inside `#if !__ASSEMBLER__'. 
* sysdeps/alpha/memchr.S: Change strong name to "__memchr". 
Add weak alias "memchr". 
* sysdeps/generic/memchr.c: Likewise. 
* sysdeps/i386/memchr.S: Likewise. 
* sysdeps/ia64/memchr.S: Likewise. 
* sysdeps/m68k/memchr.S: Likewise. 
* sysdeps/sparc/sparc32/memchr.S: Likewise. 
* sysdeps/sparc/sparc64/memchr.S: Likewise. 
* sysdeps/vax/memchr.s: Likewise.
	* sysdeps/generic/bp-checks.h: Use unbounded __memchr
	rather than non-existent __ubp_memchr.
	(CHECK_STRINGopt, CHECK_FCNTL, BOUNDED_N, BOUNDED_1): New macros.
	(_CHECK_STRING, _CHECK_N): New macros.
	(CHECK_STRING, CHECK_N, CHECK_Nopt): Rewrite in terms of _CHECK_*.
	(CHECK_IOCTL): Move inside `#if !__ASSEMBLER__'.
	* sysdeps/alpha/memchr.S: Change strong name to "__memchr".
	Add weak alias "memchr".
	* sysdeps/generic/memchr.c: Likewise.
	* sysdeps/i386/memchr.S: Likewise.
	* sysdeps/ia64/memchr.S: Likewise.
	* sysdeps/m68k/memchr.S: Likewise.
	* sysdeps/sparc/sparc32/memchr.S: Likewise.
	* sysdeps/sparc/sparc64/memchr.S: Likewise.
	* sysdeps/vax/memchr.s: Likewise.
This commit is contained in:
Greg McGary 2000-07-17 22:36:16 +00:00
parent 916c1395e1
commit abf7063390
10 changed files with 127 additions and 78 deletions

View File

@ -35,6 +35,22 @@
* string/Makefile (o-objects.ob): Add variable to pull
unbounded versions of memcpy, memset and memchr into libc_b.
* sysdeps/generic/bp-checks.h: Use unbounded __memchr
rather than non-existent __ubp_memchr.
(CHECK_STRINGopt, CHECK_FCNTL, BOUNDED_N, BOUNDED_1): New macros.
(_CHECK_STRING, _CHECK_N): New macros.
(CHECK_STRING, CHECK_N, CHECK_Nopt): Rewrite in terms of _CHECK_*.
(CHECK_IOCTL): Move inside `#if !__ASSEMBLER__'.
* sysdeps/alpha/memchr.S: Change strong name to "__memchr".
Add weak alias "memchr".
* sysdeps/generic/memchr.c: Likewise.
* sysdeps/i386/memchr.S: Likewise.
* sysdeps/ia64/memchr.S: Likewise.
* sysdeps/m68k/memchr.S: Likewise.
* sysdeps/sparc/sparc32/memchr.S: Likewise.
* sysdeps/sparc/sparc64/memchr.S: Likewise.
* sysdeps/vax/memchr.s: Likewise.
2000-07-17 Bruno Haible <haible@clisp.cons.org>
* iconv/gconv_open.c (__gconv_open): Initialize the __data

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1996 Free Software Foundation, Inc.
/* Copyright (C) 1996, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by David Mosberger (davidm@cs.arizona.edu).
@ -37,7 +37,7 @@ For correctness consider that:
.set noreorder
.set noat
ENTRY(memchr)
ENTRY(__memchr)
#ifdef PROF
ldgp gp, 0(pv)
lda AT, _mcount
@ -167,4 +167,6 @@ $not_found:
mov zero, v0 #-e0 :
ret # .. e1 :
END(memchr)
END(__memchr)
weak_alias (__stpcpy, stpcpy)

View File

@ -21,83 +21,101 @@
Boston, MA 02111-1307, USA. */
#ifndef _bp_checks_h_
# define _bp_checks_h_ 1
#define _bp_checks_h_ 1
# if !__ASSEMBLER__
#if __BOUNDED_POINTERS__
# if __BOUNDED_POINTERS__
/* GKM FIXME: when gcc is ready, add real bounds checks */
# define BOUNDS_VIOLATED (__builtin_trap (), 0)
extern int __ubp_memchr (const char *__unbounded, int, unsigned);
# define BOUNDS_VIOLATED (__builtin_trap (), 0)
extern int __memchr (const char *__unbounded, int, unsigned);
/* Verify that pointer's value >= low. Return pointer value. */
# define CHECK_BOUNDS_LOW(ARG) \
# define CHECK_BOUNDS_LOW(ARG) \
(((__ptrvalue (ARG) < __ptrlow (ARG)) && BOUNDS_VIOLATED), \
__ptrvalue (ARG))
/* Verify that pointer's value < high. Return pointer value. */
# define CHECK_BOUNDS_HIGH(ARG) \
# define CHECK_BOUNDS_HIGH(ARG) \
(((__ptrvalue (ARG) > __ptrhigh (ARG)) && BOUNDS_VIOLATED), \
__ptrvalue (ARG))
/* Check bounds of a pointer seated to a single object. */
# define CHECK_1(ARG) CHECK_N ((ARG), 1)
/* Same as CHECK_1, but tolerate ARG == NULL. */
# define CHECK_1opt(ARG) CHECK_Nopt ((ARG), 1)
/* Check bounds of a pointer seated to an array of N objects. */
# define CHECK_N(ARG, N) \
(((__ptrvalue (ARG) < __ptrlow (ARG) \
|| __ptrvalue (ARG) + (N) > __ptrhigh (ARG)) \
&& BOUNDS_VIOLATED), __ptrvalue (ARG))
/* Same as CHECK_N, but tolerate ARG == NULL. */
# define CHECK_Nopt(ARG, N) \
(((__ptrvalue (ARG) \
&& (__ptrvalue (ARG) < __ptrlow (ARG) \
|| __ptrvalue (ARG) + (N) > __ptrhigh (ARG))) \
&& BOUNDS_VIOLATED), __ptrvalue (ARG))
/* Check for NUL-terminator within string's bounds. */
# define CHECK_STRING(ARG) \
(((__ptrvalue (ARG) < __ptrlow (ARG) \
|| !__ubp_memchr (__ptrvalue (ARG), '\0', \
(__ptrhigh (ARG) - __ptrvalue (ARG)))) \
&& BOUNDS_VIOLATED), \
# define _CHECK_N(ARG, N, COND) \
(((COND) \
&& (__ptrvalue (ARG) < __ptrlow (ARG) \
|| __ptrvalue (ARG) + (N) > __ptrhigh (ARG)) \
&& BOUNDS_VIOLATED), \
__ptrvalue (ARG))
# define CHECK_SIGSET(SET) CHECK_N ((SET), _NSIG / (8 * sizeof *(SET)))
# define CHECK_SIGSETopt(SET) CHECK_Nopt ((SET), _NSIG / (8 * sizeof *(SET)))
# define _CHECK_STRING(ARG, COND) \
(((COND) \
&& (__ptrvalue (ARG) < __ptrlow (ARG) \
|| !__memchr (__ptrvalue (ARG), '\0', \
(__ptrhigh (ARG) - __ptrvalue (ARG)))) \
&& BOUNDS_VIOLATED), \
__ptrvalue (ARG))
# else /* !__BOUNDED_POINTERS__ */
/* Check bounds of a pointer seated to an array of N objects. */
# define CHECK_N(ARG, N) _CHECK_N ((ARG), (N), 1)
/* Same as CHECK_N, but tolerate ARG == NULL. */
# define CHECK_Nopt(ARG, N) _CHECK_N ((ARG), (N), __ptrvalue (ARG))
/* Check bounds of a pointer seated to a single object. */
# define CHECK_1(ARG) CHECK_N ((ARG), 1)
/* Same as CHECK_1, but tolerate ARG == NULL. */
# define CHECK_1opt(ARG) CHECK_Nopt ((ARG), 1)
/* Check for NUL-terminator within string's bounds. */
# define CHECK_STRING(ARG) _CHECK_STRING ((ARG), 1)
/* Same as CHECK_STRING, but tolerate ARG == NULL. */
# define CHECK_STRINGopt(ARG) _CHECK_STRING ((ARG), __ptrvalue (ARG))
/* Check bounds of signal syscall args with type sigset_t. */
# define CHECK_SIGSET(SET) CHECK_N ((SET), _NSIG / (8 * sizeof *(SET)))
/* Same as CHECK_SIGSET, but tolerate SET == NULL. */
# define CHECK_SIGSETopt(SET) CHECK_Nopt ((SET), _NSIG / (8 * sizeof *(SET)))
# if defined (_IOC_SIZESHIFT) && defined (_IOC_SIZEBITS)
/* Extract the size of the ioctl data and check its bounds. */
# define CHECK_IOCTL(ARG, CMD) \
CHECK_N ((const char *) (ARG), \
(((CMD) >> _IOC_SIZESHIFT) & ((1 << _IOC_SIZEBITS) - 1)))
# else
/* We don't know the size of the ioctl data, so the best we can do
is check that the first byte is within bounds. */
# define CHECK_IOCTL(ARG, CMD) CHECK_1 ((const char *) ARG)
# endif
/* Check bounds of `struct flock *' for the locking fcntl commands. */
# define CHECK_FCNTL(ARG, CMD) \
(((CMD) == F_GETLK || (CMD) == F_SETLK || (CMD) == F_SETLKW) \
? CHECK_1 ((struct flock *) ARG) : (unsigned long) (ARG))
/* Return a bounded pointer with value PTR that satisfies CHECK_N (PTR, N). */
# define BOUNDED_N(PTR, N) \
({ __typeof (*(PTR)) *__bounded _p_; \
__ptrvalue _p_ = __ptrlow _p_ = __ptrvalue (PTR); \
__ptrhigh _p_ = __ptrvalue _p_ + (N); \
_p_; })
#else /* !__BOUNDED_POINTERS__ */
/* Do nothing if not compiling with -fbounded-pointers. */
# define BOUNDS_VIOLATED
# define CHECK_BOUNDS_LOW(ARG) (ARG)
# define CHECK_BOUNDS_HIGH(ARG) (ARG)
# define CHECK_1(ARG) (ARG)
# define CHECK_1opt(ARG) (ARG)
# define CHECK_N(ARG, N) (ARG)
# define CHECK_Nopt(ARG, N) (ARG)
# define CHECK_STRING(ARG) (ARG)
# define CHECK_SIGSET(SET) (SET)
# define CHECK_SIGSETopt(SET) (SET)
# define BOUNDS_VIOLATED
# define CHECK_BOUNDS_LOW(ARG) (ARG)
# define CHECK_BOUNDS_HIGH(ARG) (ARG)
# define CHECK_1(ARG) (ARG)
# define CHECK_1opt(ARG) (ARG)
# define CHECK_N(ARG, N) (ARG)
# define CHECK_Nopt(ARG, N) (ARG)
# define CHECK_STRING(ARG) (ARG)
# define CHECK_SIGSET(SET) (SET)
# define CHECK_SIGSETopt(SET) (SET)
# define CHECK_IOCTL(ARG, CMD) (ARG)
# define CHECK_FCNTL(ARG, CMD) (ARG)
# define BOUNDED_N(PTR, N) (PTR)
# endif /* !__BOUNDED_POINTERS__ */
#endif /* !__BOUNDED_POINTERS__ */
# if defined (_IOC_SIZESHIFT) && defined (_IOC_SIZEBITS)
/* Extract the size of the ioctl parameter argument and check its bounds. */
# define CHECK_IOCTL(ARG, CMD) \
CHECK_N ((ARG), (((CMD) >> _IOC_SIZESHIFT) & ((1 << _IOC_SIZEBITS) - 1)))
# else
# define CHECK_IOCTL(ARG, CMD) __ptrvalue (ARG)
# endif
# endif /* !__ASSEMBLER__ */
#define BOUNDED_1(PTR) BOUNDED_N (PTR, 1)
#endif /* _bp_checks_h_ */

View File

@ -50,13 +50,14 @@
#endif
#include <sys/types.h>
#include <bp-sym.h>
#undef memchr
/* Search no more than N bytes of S for C. */
__ptr_t
memchr (s, c_in, n)
__memchr (s, c_in, n)
const __ptr_t s;
int c_in;
size_t n;
@ -200,3 +201,4 @@ memchr (s, c_in, n)
return 0;
}
weak_alias (__memrchr, BP_SYM (memrchr))

View File

@ -42,7 +42,7 @@
#define LEN CHR+4
.text
ENTRY (BP_SYM (memchr))
ENTRY (BP_SYM (__memchr))
ENTER
/* Save callee-safe registers used in this function. */
@ -325,4 +325,6 @@ L(pop): popl %edi /* pop saved registers */
LEAVE
RET_PTR
END (BP_SYM (memchr))
END (BP_SYM (__memchr))
weak_alias (BP_SYM (__memchr), BP_SYM (memchr))

View File

@ -56,7 +56,7 @@
#define str in0
ENTRY(memchr)
ENTRY(__memchr)
alloc saved_pfs = ar.pfs, 3, 0, 29, 32
#include "softpipe.h"
.rotr value[MEMLAT+1], addr[MEMLAT+3], aux[2], poschr[2]
@ -121,4 +121,6 @@ ENTRY(memchr)
mov ar.lc = saved_lc
br.ret.sptk.many b0
END(memchr)
END(__memchr)
weak_alias (__memchr, memchr)

View File

@ -1,7 +1,7 @@
/* memchr (str, ch, n) -- Return pointer to first occurrence of CH in the
first N bytes of STR.
For Motorola 68000.
Copyright (C) 1999 Free Software Foundation, Inc.
Copyright (C) 1999, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Andreas Schwab <schwab@gnu.org>.
@ -24,7 +24,7 @@
#include "asm-syntax.h"
TEXT
ENTRY(memchr)
ENTRY(__memchr)
/* Save the callee-saved registers we use. */
moveml R(d2)-R(d4),MEM_PREDEC(sp)
@ -223,6 +223,6 @@ L(L9:)
movel R(a0),R(d0)
moveml MEM_POSTINC(sp),R(d2)-R(d4)
rts
END(strchr)
END(__memchr)
weak_alias (strchr, index)
weak_alias (__memchr, memchr)

View File

@ -1,7 +1,7 @@
/* memchr (str, ch, n) -- Return pointer to first occurrence of CH in STR less
than N.
For SPARC v7.
Copyright (C) 1996,1999 Free Software Foundation, Inc.
Copyright (C) 1996,1999, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Jakub Jelinek <jj@ultra.linux.cz> and
David S. Miller <davem@caip.rutgers.edu>.
@ -67,7 +67,7 @@
1: retl
sub %o0, 1, %o0
ENTRY(memchr)
ENTRY(__memchr)
andcc %o1, 0xff, %o1
sll %o1, 8, %g7
andcc %o0, 3, %g0
@ -140,4 +140,6 @@ ENTRY(memchr)
sub %o0, 3, %o0
4: retl
sub %o0, 4, %o0
END(memchr)
END(__memchr)
weak_alias (__memchr, memchr)

View File

@ -1,7 +1,7 @@
/* memchr (str, ch, n) -- Return pointer to first occurrence of CH in STR less
than N.
For SPARC v9.
Copyright (C) 1998,1999 Free Software Foundation, Inc.
Copyright (C) 1998,1999, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Jan Vondrak <jvon4518@ss1000.ms.mff.cuni.cz> and
Jakub Jelinek <jj@ultra.linux.cz>.
@ -57,7 +57,7 @@
.text
.align 32
ENTRY(memchr)
ENTRY(__memchr)
and %o1, 0xff, %o1 /* IEU0 Group */
#ifdef USE_BPR
brz,pn %o2, 12f /* CTI+IEU1 */
@ -256,4 +256,6 @@ ENTRY(memchr)
23: retl /* CTI+IEU1 Group */
add %o0, -1, %o0 /* IEU0 */
END(memchr)
END(__memchr)
weak_alias (__memchr, memchr)

View File

@ -45,7 +45,7 @@
#include "DEFS.h"
ENTRY(memchr, 0)
ENTRY(__memchr, 0)
movq 4(ap),r1 # r1 = cp; r2 = c
movl 12(ap),r0 # r0 = n
movzwl $65535,r4 # handy constant
@ -67,3 +67,6 @@ ENTRY(memchr, 0)
decw r0 # from 0 to 65535
subl2 r0,r4 # adjust n
brb 0b # and loop
weak_alias (__memchr, memchr)