diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2015-08-21 14:46:05 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2015-10-19 10:45:25 -0700 |
commit | 6f6e3ee567cbff328df83dcf9ee0a5459746fce0 (patch) | |
tree | a61f9d12d5b24e37ac8d4e39c9585e37e0e4f900 /sysdeps/unix/sysv/linux/lxstat64.c | |
parent | 2028f49dabb94bd56a85a7be16141bee4853aae6 (diff) | |
download | glibc-6f6e3ee567cbff328df83dcf9ee0a5459746fce0.tar.gz glibc-6f6e3ee567cbff328df83dcf9ee0a5459746fce0.tar.xz glibc-6f6e3ee567cbff328df83dcf9ee0a5459746fce0.zip |
Avoid reading errno in syscall implementations hjl/i386/master
Reading errno is expensive for x86 PIC. With INTERNAL_SYSCALL, INTERNAL_SYSCALL_ERROR_P, INTERNAL_SYSCALL_ERRNO and INLINE_SYSCALL_ERROR_RETURN_VALUE, we can avoid reading errno. There are no code changes on x86-64. On i686, libc.so sizes in bytes show: text data bss dec after 1748495 11380 11132 1771007 before 1748403 11380 11132 1770915 * sysdeps/unix/sysv/linux/eventfd.c (eventfd): Use INTERNAL_SYSCALL, INTERNAL_SYSCALL_ERROR_P and INTERNAL_SYSCALL_ERRNO to avoid reading errno. * sysdeps/unix/sysv/linux/fstatfs64.c (__fstatfs64): Likewise. * sysdeps/unix/sysv/linux/getrlimit64.c (__getrlimit64): Likewise. * sysdeps/unix/sysv/linux/setrlimit64.c (setrlimit64): Likewise. * sysdeps/unix/sysv/linux/signalfd.c (signalfd): Likewise. * sysdeps/unix/sysv/linux/statfs64.c (__statfs64): Likewise.
Diffstat (limited to 'sysdeps/unix/sysv/linux/lxstat64.c')
-rw-r--r-- | sysdeps/unix/sysv/linux/lxstat64.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/sysdeps/unix/sysv/linux/lxstat64.c b/sysdeps/unix/sysv/linux/lxstat64.c index 5d0c051aa1..63959cf93b 100644 --- a/sysdeps/unix/sysv/linux/lxstat64.c +++ b/sysdeps/unix/sysv/linux/lxstat64.c @@ -30,8 +30,11 @@ int ___lxstat64 (int vers, const char *name, struct stat64 *buf) { - int result; - result = INLINE_SYSCALL (lstat64, 2, name, buf); + INTERNAL_SYSCALL_DECL (err); + int result = INTERNAL_SYSCALL (lstat64, err, 2, name, buf); + if (__glibc_unlikely (INTERNAL_SYSCALL_ERROR_P (result, err))) + return INLINE_SYSCALL_ERROR_RETURN_VALUE (INTERNAL_SYSCALL_ERRNO (result, + err)); #if defined _HAVE_STAT64___ST_INO && __ASSUME_ST_INO_64_BIT == 0 if (__builtin_expect (!result, 1) && buf->__st_ino != (__ino_t) buf->st_ino) buf->st_ino = buf->__st_ino; |