From patchwork Fri Jan 8 13:25:44 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella X-Patchwork-Id: 59345 Delivered-To: patch@linaro.org Received: by 10.112.130.2 with SMTP id oa2csp553679lbb; Fri, 8 Jan 2016 05:26:06 -0800 (PST) X-Received: by 10.98.69.209 with SMTP id n78mr4193049pfi.81.1452259566198; Fri, 08 Jan 2016 05:26:06 -0800 (PST) Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id dy5si74772965pab.142.2016.01.08.05.26.05 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 08 Jan 2016 05:26:06 -0800 (PST) Received-SPF: pass (google.com: domain of libc-alpha-return-66099-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; spf=pass (google.com: domain of libc-alpha-return-66099-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-66099-patch=linaro.org@sourceware.org; dkim=pass header.i=@sourceware.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:subject:to:references:from:message-id:date :mime-version:in-reply-to:content-type :content-transfer-encoding; q=dns; s=default; b=sIBesqQ41ELHUYei 2HDuYzA6VuuOV/Z4vyZSBf28XJfG7PKBYBScVB4CuixjzUHjYUxLg3QHhq36Xy1D MoxR079oPxpDD2hFX3JrnOFU+/HU3cqmVUHIHvEpeNd4GQy9GnKTH1+CF+GwWNej Qa23mQckB3S3Z2W0zPu9OA6qzws= 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:subject:to:references:from:message-id:date :mime-version:in-reply-to:content-type :content-transfer-encoding; s=default; bh=V3AvrAZvm8DC+t7MqOx6xH sFIj4=; b=LlImbmrfTQiulfSMOcF0dAkdeyjN6HbM4CLB3cDA0aTkDvJusWWOk+ Mqh5Dq+wHHzt0btnbmRUDMKlRy0JF8cmV4Go/wz3dw/kG1DfsDS1l4L25PjLj83F jM4/0UEK8Ucp7rVXMpb+ufge65dLDReSEssUGOYDrVw9UgwBMUvLQ= Received: (qmail 60386 invoked by alias); 8 Jan 2016 13:25:55 -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 60372 invoked by uid 89); 8 Jan 2016 13:25:53 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.4 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 spammy=1613, 1635 X-HELO: mail-yk0-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:subject:to:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-type :content-transfer-encoding; bh=bWUfFZmc8qCSdmU5HFpM1Ix8M4hyq8HiD7cQd/1IGyI=; b=K43VV79aTT2QYhKtvYVxWutJFTtClz+DQ+XcAZbAdYe5pkE4Rj/DCIgfBG5Wpdml2A k9uRl/0vig0ouV1UfPelxiNi2q2kv0ihsbLdti+j80xFVQHP5llJtzUdOt0Vtc0AhMNC PzDPy5kLcyie539uX9pvOQtNfdKyYa7OyK7KUKUijoPJlhPPsFxBfvoLYCXZCmEuRi7l 4XJQGuzDSVoKNkM+shManmFkkys6vQU4ABZeLtfXAxpvBs+5QohvtPV8yyxBD5Eb+Nah nK6e0zsIIW3+tKkehKVK0nFWeV9oMT/rtyfFYBo9jabyxa/YgdoNDWnNQQIJHR4vmmMH 9JQQ== X-Gm-Message-State: ALoCoQkHcMN4Kp58H7NieDPW1PsJaDKf6DmaA5GXonzNKVtTBlVCb8GXYQkPkhMUH4BMuFwLBLJQUqMTiV/9+t74t43fAylxtA== X-Received: by 10.13.212.9 with SMTP id w9mr83151034ywd.313.1452259548015; Fri, 08 Jan 2016 05:25:48 -0800 (PST) Subject: Re: [PATCH 3/4] Consolidate pread/pread64 implementations To: libc-alpha@sourceware.org, Adhemerval Zanella References: <1452187108-6504-1-git-send-email-adhemerval.zanella@linaro.org> <1452187108-6504-4-git-send-email-adhemerval.zanella@linaro.org> <20160107195245.GB25548@vapier.lan> <568ECAEE.9020602@linaro.org> <20160107205418.GE25548@vapier.lan> <568ED2AD.3000109@linaro.org> From: Adhemerval Zanella Message-ID: <568FB8D8.8090802@linaro.org> Date: Fri, 8 Jan 2016 11:25:44 -0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.4.0 MIME-Version: 1.0 In-Reply-To: <568ED2AD.3000109@linaro.org> On 07-01-2016 19:03, Adhemerval Zanella wrote: > > > On 07-01-2016 18:54, Mike Frysinger wrote: >> On 07 Jan 2016 18:30, Adhemerval Zanella wrote: >>> On 07-01-2016 17:52, Mike Frysinger wrote: >>>> On 07 Jan 2016 15:18, Adhemerval Zanella wrote: >>>>> 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. >>>> >>>> just to make sure i'm reading this correctly, in the past 64-bit ports >>>> would have a pread symbol and pread64 would be an alias to it. but with >>>> this patch, 64-bit ports now have two symbols w/identical code ? >>> >>> Indeed it is something I was thinking and I was not sure how to >>> fix it while not breaking the existing ABI. Maybe only building >>> the p{read,write}.c if not WORDSIZE64 is define and creating an >>> alias on p{read,write}64.c. What do you think? >> >> why do you need to delete the pread64.c & syscall.lists entries ? >> if you kept those, wouldn't things remain the same ? >> >> otherwise you'd have to keep the pread64.c and add a new pread.c >> that just includes the 32-bit pread.c but also adds the aliases. >> -mike >> > > The idea is exactly to remove the auto-generation from syscalls.list > to simplify the cancellation syscall generation (to in the future > just get rid of the assembly hackery in sysdep-cancel.h). > Ok I got a better solution to avoid code build duplication. The only issue is for mips64 n32, sizeof(off_t) is different than sizeof(off64_t) which leaded to continue provide a mips pread implementation (although as for sh is uses de default one). Same strat applies to pwrite{64}. What do you think? * 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. 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..cc94f22 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 +#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..7e20e63 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) +strong_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