From ce6e047fbb353e1d2faf15ab104a19db609b622b Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Tue, 6 Jul 2004 04:26:42 +0000 Subject: Update. 2004-07-05 Ulrich Drepper * elf/dl-init.c: Don't define and use _dl_starting_up if HAVE_INLINED_SYSCALLS is defined and the variable is not used. * elf/dl-support.c: Likewise. * elf/rtld.c: Likewise. * elf/dl-misc.c (_dl_debug_vdprintf): Use writev syscall directly if HAVE_INLINED_SYSCALLS is defined. * sysdeps/powerpc/powerpc64/dl-machine.h: Don't rest _dl_starting_up here. * sysdeps/powerpc/powerpc32/dl-start.S: Likewise. * sysdeps/unix/sysv/linux/configure.in: Define HAVE_INLINED_SYSCALLS. * config.h.in: Add entry for HAVE_INLINED_SYSCALLS. * sysdeps/posix/profil.c: If compiled for ld.so, omit code which is needed to stop profiling. * elf/dl-open.c (dl_open_worker): If a newly opened object is to be profile make sure it cannot be unloaded. * sysdeps/unix/sysv/linux/dl-origin.c: Inline readlink syscall. * sysdeps/unix/sysv/linux/fcntl.c: If compiled without cancellation support, make sure the helper function is inlined. * sysdeps/unix/sysv/linux/pread.c: Likewise. * sysdeps/unix/sysv/linux/pwrite.c: Likewise. * sysdeps/unix/sysv/linux/i386/fcntl.c: Likewise. * sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c: Likewise. --- sysdeps/unix/sysv/linux/configure | 8 ++++++-- sysdeps/unix/sysv/linux/configure.in | 3 +++ sysdeps/unix/sysv/linux/dl-origin.c | 7 +++++-- sysdeps/unix/sysv/linux/fcntl.c | 5 ++++- sysdeps/unix/sysv/linux/i386/fcntl.c | 18 +++++++++--------- sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c | 3 +++ sysdeps/unix/sysv/linux/pread.c | 5 ++++- sysdeps/unix/sysv/linux/pwrite.c | 5 ++++- 8 files changed, 38 insertions(+), 16 deletions(-) (limited to 'sysdeps/unix/sysv') diff --git a/sysdeps/unix/sysv/linux/configure b/sysdeps/unix/sysv/linux/configure index 89484200ce..d059143396 100644 --- a/sysdeps/unix/sysv/linux/configure +++ b/sysdeps/unix/sysv/linux/configure @@ -43,7 +43,6 @@ if test "${libc_cv_linux2010+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -172,7 +171,6 @@ echo $ECHO_N "checking for kernel header at least $minimum_kernel... $ECHO_C" >& decnum=`echo "$minimum_kernel.0.0.0" | sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/(\1 * 65536 + \2 * 256 + \3)/'`; abinum=`echo "$minimum_kernel.0.0.0" | sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\1,\2,\3/'`; cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -379,3 +377,9 @@ ${ac_prefix}/include directory out of the way." >&2;} echo "${ECHO_T}ok" >&6 fi fi + +# We have inlined syscalls. +cat >>confdefs.h <<\_ACEOF +#define HAVE_INLINED_SYSCALLS 1 +_ACEOF + diff --git a/sysdeps/unix/sysv/linux/configure.in b/sysdeps/unix/sysv/linux/configure.in index f0a7fb1231..e3fccb4c9b 100644 --- a/sysdeps/unix/sysv/linux/configure.in +++ b/sysdeps/unix/sysv/linux/configure.in @@ -305,3 +305,6 @@ ${ac_prefix}/include directory out of the way.]) AC_MSG_RESULT(ok) fi fi + +# We have inlined syscalls. +AC_DEFINE(HAVE_INLINED_SYSCALLS) diff --git a/sysdeps/unix/sysv/linux/dl-origin.c b/sysdeps/unix/sysv/linux/dl-origin.c index f7512340a1..a7fa53ea1d 100644 --- a/sysdeps/unix/sysv/linux/dl-origin.c +++ b/sysdeps/unix/sysv/linux/dl-origin.c @@ -24,6 +24,7 @@ #include #include #include +#include #include @@ -37,9 +38,11 @@ _dl_get_origin (void) char linkval[PATH_MAX]; char *result; int len; + INTERNAL_SYSCALL_DECL (err); - if ((len = __readlink ("/proc/self/exe", linkval, sizeof (linkval))) > 0 - && linkval[0] != '[') + len = INTERNAL_SYSCALL (readlink, err, 3, "/proc/self/exe", linkval, + sizeof (linkval)); + if (! INTERNAL_SYSCALL_ERROR_P (len, err) && len > 0 && linkval[0] != '[') { /* We can use this value. */ assert (linkval[0] == '/'); diff --git a/sysdeps/unix/sysv/linux/fcntl.c b/sysdeps/unix/sysv/linux/fcntl.c index a6793bc526..ab8d9cfb9c 100644 --- a/sysdeps/unix/sysv/linux/fcntl.c +++ b/sysdeps/unix/sysv/linux/fcntl.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2000, 2002, 2003 Free Software Foundation, Inc. +/* Copyright (C) 2000, 2002, 2003, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -26,6 +26,9 @@ int +#ifdef NO_CANCELLATION +static inline __attribute ((always_inline)) +#endif __fcntl_nocancel (int fd, int cmd, ...) { va_list ap; diff --git a/sysdeps/unix/sysv/linux/i386/fcntl.c b/sysdeps/unix/sysv/linux/i386/fcntl.c index f47d98e6bf..2b3db38e53 100644 --- a/sysdeps/unix/sysv/linux/i386/fcntl.c +++ b/sysdeps/unix/sysv/linux/i386/fcntl.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2000, 2002, 2003 Free Software Foundation, Inc. +/* Copyright (C) 2000, 2002, 2003, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -32,6 +32,9 @@ int __have_no_fcntl64; int +#ifdef NO_CANCELLATION +static inline __attribute ((always_inline)) +#endif __fcntl_nocancel (int fd, int cmd, ...) { va_list ap; @@ -65,16 +68,15 @@ __fcntl_nocancel (int fd, int cmd, ...) /* Check if we can represent the values with the smaller type. */ if ((off64_t) fl.l_start != fl64->l_start) { + eoverflow: __set_errno (EOVERFLOW); return -1; } fl.l_len = (off_t) fl64->l_len; /* Check if we can represent the values with the smaller type. */ if ((off64_t) fl.l_len != fl64->l_len) - { - __set_errno (EOVERFLOW); - return -1; - } + goto eoverflow: + fl.l_type = fl64->l_type; fl.l_whence = fl64->l_whence; fl.l_pid = fl64->l_pid; @@ -101,10 +103,8 @@ __fcntl_nocancel (int fd, int cmd, ...) fl.l_start = (off_t) fl64->l_start; /* Check if we can represent the values with the smaller type. */ if ((off64_t) fl.l_start != fl64->l_start) - { - __set_errno (EOVERFLOW); - return -1; - } + goto eoverflow: + fl.l_len = (off_t)fl64->l_len; /* Check if we can represent the values with the smaller type. */ if ((off64_t) fl.l_len != fl64->l_len) diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c b/sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c index f629a35fb4..4b60a163ce 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c @@ -26,6 +26,9 @@ int +#ifdef NO_CANCELLATION +static inline __attribute ((always_inline)) +#endif __fcntl_nocancel (int fd, int cmd, ...) { va_list ap; diff --git a/sysdeps/unix/sysv/linux/pread.c b/sysdeps/unix/sysv/linux/pread.c index 9e17f1f916..90057f3f40 100644 --- a/sysdeps/unix/sysv/linux/pread.c +++ b/sysdeps/unix/sysv/linux/pread.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1997,1998,1999,2000,2002,2003 Free Software Foundation, Inc. +/* Copyright (C) 1997-2000,2002,2003,2004 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1997. @@ -44,6 +44,9 @@ static ssize_t __emulate_pread (int fd, void *buf, size_t count, static ssize_t +#ifdef NO_CANCELLATION +inline __attribute ((always_inline)) +#endif do_pread (int fd, void *buf, size_t count, off_t offset) { ssize_t result; diff --git a/sysdeps/unix/sysv/linux/pwrite.c b/sysdeps/unix/sysv/linux/pwrite.c index 35b6231708..f4eb2f5544 100644 --- a/sysdeps/unix/sysv/linux/pwrite.c +++ b/sysdeps/unix/sysv/linux/pwrite.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1997,1998,1999,2000,2002,2003 Free Software Foundation, Inc. +/* Copyright (C) 1997-2000,2002,2003,2004 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1997. @@ -44,6 +44,9 @@ static ssize_t __emulate_pwrite (int fd, const void *buf, size_t count, static ssize_t +#ifdef NO_CANCELLATION +inline __attribute ((always_inline)) +#endif do_pwrite (int fd, const void *buf, size_t count, off_t offset) { ssize_t result; -- cgit 1.4.1