From patchwork Tue Feb 23 15:17:06 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 586910 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 05541140B0E for ; Wed, 24 Feb 2016 02:17:55 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.b=Kr0PXU2R; dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id:in-reply-to :references; q=dns; s=default; b=tmTd2/usDBgQXzko6+mv6WHRKwmbQ9O 8A8/yLJXlYoFwYHM2mTtwKjiVnd+u3mXlQPKQgSn3zQDVpNg/MQCLucqXI092qSI T/fiIPFvbOZeWZSjN3ENNz33yRFCEZWLJF/cuYIjpq2QbWT/bBgHfr3mRGv5yffZ 4k5b0SHfe4xc= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id:in-reply-to :references; s=default; bh=JCGI+zx3GW7en8vWidj0P0JqwXo=; b=Kr0PX U2RZvSMbH31RhMU1u52UUm6lNuAt2uYyBUGv13VCnCkmGxZid6tZnmbSirlfZRL7 5CZVgXCM2rg5QM+ELdaNY4wdWOJ8eOkQi2YW8+TTxR3FUk4TK8vReQU9aTQOO4XY 1pn+iLzAo4SWzciNR111YuLQij8zSQD3V8ascA= Received: (qmail 45455 invoked by alias); 23 Feb 2016 15:17:34 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 45204 invoked by uid 89); 23 Feb 2016 15:17:33 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.1 required=5.0 tests=BAYES_00, KAM_ASCII_DIVIDERS, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=no version=3.3.2 spammy=Contributed, ulrich, Ulrich, strong_alias X-HELO: mail-yw0-f169.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ynctwLQFyCVTSNpxRr8bbezYTAOeHRaZhZuVVhUCJl8=; b=PVPdbHQmZymd5hshDCIPTC59axuekyAmTXrWlEF0p0dHOiSkikqzylluBCl9d6OtHb px1slR4B5s/waUd6qacyoCbs4pZQqVCItYc+0pH9Lvr5BO/qXHlMZ11Dq4VHm9Oc5y6V MKONhASe0M7nWIdgqY7dK/9+/XXQ7S5czMgDgdAteQT90ELw5G/UpM0/hchKH7EamlFm yp9ViLTrstgaw/d8J9do+oWY1QvYntwm9D99FQNk90zFze4R7HPdn7CJ4Frf5sK/2k/i dtw8bC1OzNEAbotBfv9Kxio2RnbCLz+tL9EXREuaLrrsMx3mV5jzQo5fe6tjhkeCvt5G Wmug== X-Gm-Message-State: AG10YOSMLacxOlwbnkgEMe5dXTpNxVJaRQNzclH7+8CHzCZA0IdU7/QGzqEGXlVM8ZeYQzts X-Received: by 10.13.202.151 with SMTP id m145mr16738868ywd.268.1456240637914; Tue, 23 Feb 2016 07:17:17 -0800 (PST) From: Adhemerval Zanella To: libc-alpha@sourceware.org Cc: Adhemerval Zanella Subject: [PATCH 3/4] Consolidate pread/pread64 implementations Date: Tue, 23 Feb 2016 12:17:06 -0300 Message-Id: <1456240627-18774-4-git-send-email-adhemerval.zanella@linaro.org> In-Reply-To: <1456240627-18774-1-git-send-email-adhemerval.zanella@linaro.org> References: <1456240627-18774-1-git-send-email-adhemerval.zanella@linaro.org> From: Adhemerval Zanella This patch consolidates all the pread/pread64 implementation for Linux in only one (sysdeps/unix/sysv/linux/pread.c). It also removes the syscall from the auto-generation using assembly macros. For pread{64} offset argument placement the new SYSCALL_LL{64} macro is used. For pread ports that do not define __NR_pread will use __NR_pread64 and for pread64 ports that dot define __NR_pread64 will use __NR_pread for the syscall. Checked on x86_64, x32, i386, aarch64, and ppc64le. * sysdeps/unix/sysv/linux/arm/pread.c: Remove file. * sysdeps/unix/sysv/linux/arm/pread64.c: Likewise. * sysdeps/unix/sysv/linux/generic/wordsize-32/pread.c: Likewise. * sysdeps/unix/sysv/linux/generic/wordsize-32/pread64.c: Likewise. * sysdeps/unix/sysv/linux/powerpc/powerpc32/pread.c: Likewise, * sysdeps/unix/sysv/linux/powerpc/powerpc32/pread64.c: Likewise. * sysdeps/unix/sysv/linux/wordsize-64/pread64.c: Likewise. * sysdeps/unix/sysv/linux/wordsize-64/syscalls.list (pread): Remove syscall generation. * sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h [__NR_pread64] (__NR_pread): Remove define. * sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h: [__NR_pread64] (__NR_pread): Likewise. * sysdeps/unix/sysv/linux/pread.c [__NR_pread64] (__NR_pread): Remove define. (__libc_pread): Use SYSCALL_LL macro on offset argument. * sysdeps/unix/sysv/linux/pread64.c [__NR_pread64] (__NR_pread): Remove define. (__libc_pread64): Use SYSCALL_LL64 macro on offset argument. * sysdeps/unix/sysv/linux/sh/pread.c: Rewrite using default Linux implementation as base. * sysdeps/unix/sysv/linux/sh/pread64.c: Likewise. * sysdeps/unix/sysv/linux/mips/pread.c: Likewise. * sysdeps/unix/sysv/linux/mips/pread64.c: Likewise. --- sysdeps/unix/sysv/linux/arm/pread.c | 36 -------------------- sysdeps/unix/sysv/linux/arm/pread64.c | 37 --------------------- .../unix/sysv/linux/generic/wordsize-32/pread.c | 37 --------------------- .../unix/sysv/linux/generic/wordsize-32/pread64.c | 34 ------------------- sysdeps/unix/sysv/linux/mips/pread.c | 38 ++++------------------ sysdeps/unix/sysv/linux/mips/pread64.c | 34 ++++--------------- sysdeps/unix/sysv/linux/powerpc/powerpc32/pread.c | 34 ------------------- .../unix/sysv/linux/powerpc/powerpc32/pread64.c | 35 -------------------- sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h | 7 ---- sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h | 7 ---- sysdeps/unix/sysv/linux/pread.c | 25 ++++---------- sysdeps/unix/sysv/linux/pread64.c | 23 ++++++------- sysdeps/unix/sysv/linux/sh/pread.c | 30 +++-------------- sysdeps/unix/sysv/linux/sh/pread64.c | 30 +++-------------- sysdeps/unix/sysv/linux/wordsize-64/pread64.c | 1 - sysdeps/unix/sysv/linux/wordsize-64/syscalls.list | 1 - 17 files changed, 64 insertions(+), 370 deletions(-) delete mode 100644 sysdeps/unix/sysv/linux/arm/pread.c delete mode 100644 sysdeps/unix/sysv/linux/arm/pread64.c delete mode 100644 sysdeps/unix/sysv/linux/generic/wordsize-32/pread.c delete mode 100644 sysdeps/unix/sysv/linux/generic/wordsize-32/pread64.c delete mode 100644 sysdeps/unix/sysv/linux/powerpc/powerpc32/pread.c delete mode 100644 sysdeps/unix/sysv/linux/powerpc/powerpc32/pread64.c delete mode 100644 sysdeps/unix/sysv/linux/wordsize-64/pread64.c diff --git a/sysdeps/unix/sysv/linux/arm/pread.c b/sysdeps/unix/sysv/linux/arm/pread.c deleted file mode 100644 index 8c9b878..0000000 --- a/sysdeps/unix/sysv/linux/arm/pread.c +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (C) 1997-2016 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper , 1997. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library. If not, see - . */ - -#include -#include -#include - -#include -#include - -ssize_t -__libc_pread (int fd, void *buf, size_t count, off_t offset) -{ - /* In the ARM EABI, 64-bit values are aligned to even/odd register - pairs for syscalls. */ - return SYSCALL_CANCEL (pread64, fd, buf, count, 0, - __LONG_LONG_PAIR (offset >> 31, offset)); -} - -strong_alias (__libc_pread, __pread) -weak_alias (__libc_pread, pread) diff --git a/sysdeps/unix/sysv/linux/arm/pread64.c b/sysdeps/unix/sysv/linux/arm/pread64.c deleted file mode 100644 index 3364b6a..0000000 --- a/sysdeps/unix/sysv/linux/arm/pread64.c +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (C) 1997-2016 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper , 1997. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library. If not, see - . */ - -#include -#include -#include - -#include -#include - -ssize_t -__libc_pread64 (int fd, void *buf, size_t count, off64_t offset) -{ - /* In the ARM EABI, 64-bit values are aligned to even/odd register - pairs for syscalls. */ - return SYSCALL_CANCEL (pread64, fd, buf, count, 0, - __LONG_LONG_PAIR ((off_t) (offset >> 32), - (off_t) (offset & 0xffffffff))); -} - -weak_alias (__libc_pread64, __pread64) -weak_alias (__libc_pread64, pread64) diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/pread.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/pread.c deleted file mode 100644 index 0dff648..0000000 --- a/sysdeps/unix/sysv/linux/generic/wordsize-32/pread.c +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (C) 2011-2016 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf , 2011. - Based on work contributed by Ulrich Drepper , 1997. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library. If not, see - . */ - -#include -#include -#include -#include - -#include -#include - -ssize_t -__libc_pread (int fd, void *buf, size_t count, off_t offset) -{ - assert (sizeof (offset) == 4); - return SYSCALL_CANCEL (pread64, fd, - buf, count, __ALIGNMENT_ARG - __LONG_LONG_PAIR (offset >> 31, offset)); -} -strong_alias (__libc_pread, __pread) -weak_alias (__libc_pread, pread) diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/pread64.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/pread64.c deleted file mode 100644 index 8931900..0000000 --- a/sysdeps/unix/sysv/linux/generic/wordsize-32/pread64.c +++ /dev/null @@ -1,34 +0,0 @@ -/* Copyright (C) 2011-2016 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf , 2011. - Based on work contributed by Ulrich Drepper , 1997. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library. If not, see - . */ - -#include -#include -#include - -#include -#include - -ssize_t -__libc_pread64 (int fd, void *buf, size_t count, off64_t offset) -{ - return SYSCALL_CANCEL (pread64, fd, buf, count, __ALIGNMENT_ARG - __LONG_LONG_PAIR ((off_t) (offset >> 32), - (off_t) (offset & 0xffffffff))); -} -weak_alias (__libc_pread64, __pread64) weak_alias (__libc_pread64, pread64) diff --git a/sysdeps/unix/sysv/linux/mips/pread.c b/sysdeps/unix/sysv/linux/mips/pread.c index 02755cb..3092f0b 100644 --- a/sysdeps/unix/sysv/linux/mips/pread.c +++ b/sysdeps/unix/sysv/linux/mips/pread.c @@ -16,39 +16,13 @@ License along with the GNU C Library. If not, see . */ -#include -#include -#ifndef NO_SGIDEFS_H -#include -#endif -#include -#include - #include -#include - -#ifdef __NR_pread64 /* Newer kernels renamed but it's the same. */ -# ifdef __NR_pread -# error "__NR_pread and __NR_pread64 both defined???" -# endif -# define __NR_pread __NR_pread64 -#endif - - -ssize_t -__libc_pread (int fd, void *buf, size_t count, off_t offset) -{ -#if _MIPS_SIM != _ABI64 - assert (sizeof (offset) == 4); -#endif -#if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64 - return SYSCALL_CANCEL (pread, fd, buf, count, offset); -#else - return SYSCALL_CANCEL (pread, fd, buf, count, 0, - __LONG_LONG_PAIR (offset >> 31, offset)); +/* The n32 have sizeof(off_t) != sizeof(off64_t) so we can't strong/weak + alias the pread to pread64. We undefine the __ASSUME_WORDSIZE64_ILP32 + so two implementation are built. */ +#if _MIPS_SIM == _ABIN32 +# undef __ASSUME_WORDSIZE64_ILP32 #endif -} -strong_alias (__libc_pread, __pread) -weak_alias (__libc_pread, pread) +#include diff --git a/sysdeps/unix/sysv/linux/mips/pread64.c b/sysdeps/unix/sysv/linux/mips/pread64.c index ed0e91c..cd3b5fd 100644 --- a/sysdeps/unix/sysv/linux/mips/pread64.c +++ b/sysdeps/unix/sysv/linux/mips/pread64.c @@ -16,35 +16,13 @@ License along with the GNU C Library. If not, see . */ -#include -#ifndef NO_SGIDEFS_H -#include -#endif -#include -#include - #include -#include - -#ifdef __NR_pread64 /* Newer kernels renamed but it's the same. */ -# ifdef __NR_pread -# error "__NR_pread and __NR_pread64 both defined???" -# endif -# define __NR_pread __NR_pread64 -#endif - -ssize_t -__libc_pread64 (int fd, void *buf, size_t count, off64_t offset) -{ -#if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64 - return SYSCALL_CANCEL (pread, fd, buf, count, offset); -#else - return SYSCALL_CANCEL (pread, fd, buf, count, 0, - __LONG_LONG_PAIR ((off_t) (offset >> 32), - (off_t) (offset & 0xffffffff))); +/* The n32 have sizeof(off_t) != sizeof(off64_t) so we can't strong/weak + alias the pread to pread64. We undefine the __ASSUME_WORDSIZE64_ILP32 + so two implementation are built. */ +#if _MIPS_SIM == _ABIN32 +# undef __ASSUME_WORDSIZE64_ILP32 #endif -} -weak_alias (__libc_pread64, __pread64) -weak_alias (__libc_pread64, pread64) +#include diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/pread.c b/sysdeps/unix/sysv/linux/powerpc/powerpc32/pread.c deleted file mode 100644 index 2d67013..0000000 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/pread.c +++ /dev/null @@ -1,34 +0,0 @@ -/* Copyright (C) 1997-2016 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper , 1997. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#include -#include -#include - -#include -#include - -ssize_t -__libc_pread (int fd, void *buf, size_t count, off_t offset) -{ - /* On PPC32 64bit values are aligned in odd/even register pairs. */ - return SYSCALL_CANCEL (pread, fd, buf, count, 0, offset >> 31, offset); -} - -strong_alias (__libc_pread, __pread) -weak_alias (__libc_pread, pread) diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/pread64.c b/sysdeps/unix/sysv/linux/powerpc/powerpc32/pread64.c deleted file mode 100644 index 712ab72..0000000 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/pread64.c +++ /dev/null @@ -1,35 +0,0 @@ -/* Copyright (C) 1997-2016 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper , 1997. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#include -#include - -#include -#include - - -ssize_t -__libc_pread64 (int fd, void *buf, size_t count, off64_t offset) -{ - /* On PPC32 64bit values are aligned in odd/even register pairs. */ - return SYSCALL_CANCEL (pread, fd, buf, count, 0, (long) (offset >> 32), - (long) offset); -} - -weak_alias (__libc_pread64, __pread64) -weak_alias (__libc_pread64, pread64) diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h b/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h index 390ce24..c12fd7f 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h @@ -27,13 +27,6 @@ Handle them here so they can be catched by both C and assembler stubs in glibc. */ -#ifdef __NR_pread64 -# ifdef __NR_pread -# error "__NR_pread and __NR_pread64 both defined???" -# endif -# define __NR_pread __NR_pread64 -#endif - #ifdef __NR_pwrite64 # ifdef __NR_pwrite # error "__NR_pwrite and __NR_pwrite64 both defined???" diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h b/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h index 761f3ea..c39a0f2 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h @@ -34,13 +34,6 @@ Handle them here so they can be catched by both C and assembler stubs in glibc. */ -#ifdef __NR_pread64 -# ifdef __NR_pread -# error "__NR_pread and __NR_pread64 both defined???" -# endif -# define __NR_pread __NR_pread64 -#endif - #ifdef __NR_pwrite64 # ifdef __NR_pwrite # error "__NR_pwrite and __NR_pwrite64 both defined???" diff --git a/sysdeps/unix/sysv/linux/pread.c b/sysdeps/unix/sysv/linux/pread.c index 4aa3c67..a088423 100644 --- a/sysdeps/unix/sysv/linux/pread.c +++ b/sysdeps/unix/sysv/linux/pread.c @@ -16,33 +16,22 @@ License along with the GNU C Library; if not, see . */ -#include -#include -#include #include - #include -#include -#ifdef __NR_pread64 /* Newer kernels renamed but it's the same. */ -# ifdef __NR_pread -# error "__NR_pread and __NR_pread64 both defined???" -# endif -# define __NR_pread __NR_pread64 -#endif +#if __WORDSIZE != 64 && !defined(__ASSUME_WORDSIZE64_ILP32) +# ifndef __NR_pread +# define __NR_pread __NR_pread64 +# endif ssize_t __libc_pread (int fd, void *buf, size_t count, off_t offset) { - ssize_t result; - - assert (sizeof (offset) == 4); - result = SYSCALL_CANCEL (pread, fd, buf, count, - __LONG_LONG_PAIR (offset >> 31, offset)); - - return result; + return SYSCALL_CANCEL (pread, fd, buf, count, + __ALIGNMENT_ARG SYSCALL_LL (offset)); } strong_alias (__libc_pread, __pread) weak_alias (__libc_pread, pread) +#endif diff --git a/sysdeps/unix/sysv/linux/pread64.c b/sysdeps/unix/sysv/linux/pread64.c index 7b5019a..56a1de0 100644 --- a/sysdeps/unix/sysv/linux/pread64.c +++ b/sysdeps/unix/sysv/linux/pread64.c @@ -16,28 +16,25 @@ License along with the GNU C Library; if not, see . */ -#include -#include #include - #include -#include -#ifdef __NR_pread64 /* Newer kernels renamed but it's the same. */ -# ifdef __NR_pread -# error "__NR_pread and __NR_pread64 both defined???" -# endif -# define __NR_pread __NR_pread64 +#ifndef __NR_pread64 +# define __NR_pread64 __NR_pread #endif - ssize_t __libc_pread64 (int fd, void *buf, size_t count, off64_t offset) { - return SYSCALL_CANCEL (pread, fd, buf, count, - __LONG_LONG_PAIR ((off_t) (offset >> 32), - (off_t) (offset & 0xffffffff))); + return SYSCALL_CANCEL (pread64, fd, buf, count, + __ALIGNMENT_ARG SYSCALL_LL64 (offset)); } weak_alias (__libc_pread64, __pread64) weak_alias (__libc_pread64, pread64) + +#if __WORDSIZE == 64 || defined __ASSUME_WORDSIZE64_ILP32 +strong_alias (__libc_pread64, __libc_pread) +weak_alias (__libc_pread64, __pread) +weak_alias (__libc_pread64, pread) +#endif diff --git a/sysdeps/unix/sysv/linux/sh/pread.c b/sysdeps/unix/sysv/linux/sh/pread.c index 8afada5..d3f99f3 100644 --- a/sysdeps/unix/sysv/linux/sh/pread.c +++ b/sysdeps/unix/sysv/linux/sh/pread.c @@ -16,28 +16,8 @@ License along with the GNU C Library; if not, see . */ -#include -#include -#include -#include - -#include -#include - -#ifdef __NR_pread64 /* Newer kernels renamed but it's the same. */ -# ifdef __NR_pread -# error "__NR_pread and __NR_pread64 both defined???" -# endif -# define __NR_pread __NR_pread64 -#endif - - -ssize_t -__libc_pread (int fd, void *buf, size_t count, off_t offset) -{ - return SYSCALL_CANCEL (pread, fd, buf, count, 0, - __LONG_LONG_PAIR (offset >> 31, offset)); -} - -strong_alias (__libc_pread, __pread) -weak_alias (__libc_pread, pread) +/* SH4 ABI does not really require argument alignment for 64-bits, but + the kernel interface for pread adds a dummy long argument before the + offset. */ +#define __ALIGNMENT_ARG +#include diff --git a/sysdeps/unix/sysv/linux/sh/pread64.c b/sysdeps/unix/sysv/linux/sh/pread64.c index cfc751d..b2e8a25 100644 --- a/sysdeps/unix/sysv/linux/sh/pread64.c +++ b/sysdeps/unix/sysv/linux/sh/pread64.c @@ -16,28 +16,8 @@ License along with the GNU C Library; if not, see . */ -#include -#include -#include - -#include -#include - -#ifdef __NR_pread64 /* Newer kernels renamed but it's the same. */ -# ifdef __NR_pread -# error "__NR_pread and __NR_pread64 both defined???" -# endif -# define __NR_pread __NR_pread64 -#endif - - -ssize_t -__libc_pread64 (int fd, void *buf, size_t count, off64_t offset) -{ - return SYSCALL_CANCEL (pread, fd, buf, count, 0, - __LONG_LONG_PAIR ((off_t) (offset >> 32), - (off_t) (offset & 0xffffffff))); -} - -weak_alias (__libc_pread64, __pread64) -weak_alias (__libc_pread64, pread64) +/* SH4 ABI does not really require argument alignment for 64-bits, but + the kernel interface for pread adds a dummy long argument before the + offset. */ +#define __ALIGNMENT_ARG +#include diff --git a/sysdeps/unix/sysv/linux/wordsize-64/pread64.c b/sysdeps/unix/sysv/linux/wordsize-64/pread64.c deleted file mode 100644 index b7f298d..0000000 --- a/sysdeps/unix/sysv/linux/wordsize-64/pread64.c +++ /dev/null @@ -1 +0,0 @@ -/* Empty since the pread syscall is equivalent. */ diff --git a/sysdeps/unix/sysv/linux/wordsize-64/syscalls.list b/sysdeps/unix/sysv/linux/wordsize-64/syscalls.list index 19cc6d9..7d5f6a5 100644 --- a/sysdeps/unix/sysv/linux/wordsize-64/syscalls.list +++ b/sysdeps/unix/sysv/linux/wordsize-64/syscalls.list @@ -3,7 +3,6 @@ # Whee! 64-bit systems naturally implement llseek. llseek EXTRA lseek i:iii __libc_lseek __lseek lseek __libc_lseek64 __llseek llseek __lseek64 lseek64 lseek llseek - -pread - pread Ci:ibni __libc_pread __libc_pread64 __pread pread __pread64 pread64 pwrite - pwrite Ci:ibni __libc_pwrite __libc_pwrite64 __pwrite pwrite __pwrite64 pwrite64 fstatfs - fstatfs i:ip __fstatfs fstatfs fstatfs64 __fstatfs64 statfs - statfs i:sp __statfs statfs statfs64