Use XSTAT_IS_XSTAT64 in generic xstat functions

Message ID 1478811993.4630.87.camel@caviumnetworks.com
State New, archived
Headers

Commit Message

Steve Ellcey Nov. 10, 2016, 9:06 p.m. UTC
  Here is an xstat patch to allow the 32 bit generic xstat functions
in sysdeps/unix/sysv/linux/generic/wordsize-32 be aliases of the 64
bit versions.  This is similar to what is done for the non-generic xstat
functions and uses the same macro, XSTAT_IS_XSTAT64, to control if they
are aliased or not.

I tested this on x86 and aarch64 using the top-of-tree sources where it
has no affect and on aarch64 with the rest of the ILP32 patches where
it is used and there were no regressions.

As with the earlier statfs patches I don't know if we want to stick with
this defined/undefined use of XSTAT_IS_XSTAT64 that already exists or
if I should change it to be defined all the time to either 0 or 1. For
this patch, I left it as is.

OK to checkin?

Steve Ellcey
sellcey@caviumnetworks.com


2016-11-10  Yury Norov  <ynorov@caviumnetworks.com>
	    Steve Ellcey  <sellcey@caviumnetworks.com>

	* sysdeps/unix/sysv/linux/generic/wordsize-32/fxstat.c: Do not define
	fxstat if XSTAT_IS_XSTAT64 is defined.
	* sysdeps/unix/sysv/linux/generic/wordsize-32/fxstatat.c: Ditto for
	fxstatat.
	* sysdeps/unix/sysv/linux/generic/wordsize-32/lxstat.c: Ditto for
	lxstat.
	* sysdeps/unix/sysv/linux/generic/wordsize-32/xstat.c: Ditto for xstat.

	* sysdeps/unix/sysv/linux/generic/wordsize-32/fxstat64.c: New file.
	* sysdeps/unix/sysv/linux/generic/wordsize-32/fxstatat64.c: New file.
	* sysdeps/unix/sysv/linux/generic/wordsize-32/lxstat64.c: Make __lxstat
	an alias of __lxstat64 if XSTAT_IS_XSTAT64 is defined.
	* sysdeps/unix/sysv/linux/generic/wordsize-32/xstat64.c: Ditto for
	__xstat.
  

Patch

diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/fxstat.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/fxstat.c
index dd52011..ac015c0 100644
--- a/sysdeps/unix/sysv/linux/generic/wordsize-32/fxstat.c
+++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/fxstat.c
@@ -25,6 +25,7 @@ 
 #include <sysdep.h>
 #include <sys/syscall.h>
 
+#ifndef XSTAT_IS_XSTAT64
 #include "overflow.h"
 
 /* Get information about the file FD in BUF.  */
@@ -43,3 +44,4 @@  __fxstat (int vers, int fd, struct stat *buf)
 
 hidden_def (__fxstat)
 weak_alias (__fxstat, _fxstat);
+#endif
diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/fxstat64.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/fxstat64.c
index e69de29..00f9119 100644
--- a/sysdeps/unix/sysv/linux/generic/wordsize-32/fxstat64.c
+++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/fxstat64.c
@@ -0,0 +1,36 @@ 
+/* __fxstat64 () implementation.
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011.
+
+   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
+   <http://www.gnu.org/licenses/>.  */
+
+/* Hide the prototypes for __fxstat and _fxstat so that GCC will not
+   complain about the different function signatures if they are aliased
+   to  __fxstat64.  If XSTAT_IS_XSTAT64 is set then the stat and
+   stat64 structures have an identical layout but different type names.  */
+
+#define __fxstat __fxstat_disable
+#define _fxstat _fxstat_disable
+
+#include <sysdeps/unix/sysv/linux/fxstat64.c>
+
+#undef __fxstat
+#undef _fxstat
+#ifdef XSTAT_IS_XSTAT64
+weak_alias (__fxstat64, __fxstat)
+weak_alias (__fxstat64, _fxstat)
+hidden_ver (__fxstat64, __fxstat)
+#endif
diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/fxstatat.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/fxstatat.c
index dc7f934..b00f65d 100644
--- a/sysdeps/unix/sysv/linux/generic/wordsize-32/fxstatat.c
+++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/fxstatat.c
@@ -26,6 +26,7 @@ 
 #include <sysdep.h>
 #include <sys/syscall.h>
 
+#ifndef XSTAT_IS_XSTAT64
 #include "overflow.h"
 
 /* Get information about the file NAME in BUF.  */
@@ -42,3 +43,4 @@  __fxstatat (int vers, int fd, const char *file, struct stat *buf, int flag)
   return -1;
 }
 libc_hidden_def (__fxstatat)
+#endif
diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/fxstatat64.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/fxstatat64.c
index e69de29..2d72fb1 100644
--- a/sysdeps/unix/sysv/linux/generic/wordsize-32/fxstatat64.c
+++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/fxstatat64.c
@@ -0,0 +1,37 @@ 
+/* __fxstatat64 () implementation.
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011.
+
+   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
+   <http://www.gnu.org/licenses/>.  */
+
+/* Hide the prototype for __fxstatat so that GCC will not complain about
+   the different function signature if it is aliased to  __fxstatat64.
+   If XSTAT_IS_XSTAT64 is set then the stat and stat64 structures have an
+   identical layout but different type names.  */
+
+#define __fxstatat __fxstatat_disable
+
+#include <sys/stat.h>
+#undef _STAT_VER_LINUX
+#define _STAT_VER_LINUX _STAT_VER_KERNEL
+
+#include <sysdeps/unix/sysv/linux/fxstatat64.c>
+
+#undef __fxstatat
+#ifdef XSTAT_IS_XSTAT64
+weak_alias (__fxstatat64, __fxstatat)
+libc_hidden_ver (__fxstatat64, __fxstatat)
+#endif
diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/lxstat.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/lxstat.c
index 395f98b..4fec6c9 100644
--- a/sysdeps/unix/sysv/linux/generic/wordsize-32/lxstat.c
+++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/lxstat.c
@@ -25,6 +25,7 @@ 
 #include <sysdep.h>
 #include <sys/syscall.h>
 
+#ifndef XSTAT_IS_XSTAT64
 #include "overflow.h"
 
 /* Get information about the file NAME in BUF.  */
@@ -41,3 +42,4 @@  __lxstat (int vers, const char *name, struct stat *buf)
   return -1;
 }
 hidden_def (__lxstat)
+#endif
diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/lxstat64.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/lxstat64.c
index e1c15a8..49ed940 100644
--- a/sysdeps/unix/sysv/linux/generic/wordsize-32/lxstat64.c
+++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/lxstat64.c
@@ -16,6 +16,13 @@ 
    License along with the GNU C Library.  If not, see
    <http://www.gnu.org/licenses/>.  */
 
+/* Hide the prototype for __lxstat so that GCC will not complain about
+   the different function signature if it is aliased to  __lxstat64.
+   If XSTAT_IS_XSTAT64 is set then the stat and stat64 structures have an
+   identical layout but different type names.  */
+
+#define __lxstat __lxstat_disable
+
 #include <errno.h>
 #include <stddef.h>
 #include <fcntl.h>
@@ -36,3 +43,9 @@  __lxstat64 (int vers, const char *name, struct stat64 *buf)
   return -1;
 }
 hidden_def (__lxstat64)
+
+#undef __lxstat
+#ifdef XSTAT_IS_XSTAT64
+strong_alias (__lxstat64, __lxstat)
+hidden_ver (__lxstat64, __lxstat)
+#endif
diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/xstat.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/xstat.c
index fdd2cb0..8fc13bd 100644
--- a/sysdeps/unix/sysv/linux/generic/wordsize-32/xstat.c
+++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/xstat.c
@@ -25,6 +25,7 @@ 
 #include <sysdep.h>
 #include <sys/syscall.h>
 
+#ifndef XSTAT_IS_XSTAT64
 #include "overflow.h"
 
 /* Get information about the file NAME in BUF.  */
@@ -41,3 +42,4 @@  __xstat (int vers, const char *name, struct stat *buf)
   return -1;
 }
 hidden_def (__xstat)
+#endif
diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/xstat64.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/xstat64.c
index 2252337..75a90f0 100644
--- a/sysdeps/unix/sysv/linux/generic/wordsize-32/xstat64.c
+++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/xstat64.c
@@ -16,6 +16,13 @@ 
    License along with the GNU C Library.  If not, see
    <http://www.gnu.org/licenses/>.  */
 
+/* Hide the prototype for __xstat so that GCC will not complain about
+   the different function signature if it is aliased to  __xstat64.
+   If XSTAT_IS_XSTAT64 is set then the stat and stat64 structures have an
+   identical layout but different type names.  */
+
+#define __xstat __xstat_disable
+
 #include <errno.h>
 #include <stddef.h>
 #include <fcntl.h>
@@ -36,3 +43,9 @@  __xstat64 (int vers, const char *name, struct stat64 *buf)
   return -1;
 }
 hidden_def (__xstat64)
+
+#undef __xstat
+#ifdef XSTAT_IS_XSTAT64
+strong_alias (__xstat64, __xstat)
+hidden_ver (__xstat64, __xstat)
+#endif