public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH 0/2] Revised: deprecate sys/sysmacros.h inclusion from sys/types.h
@ 2016-04-23 21:15 Zack Weinberg
  2016-04-23 21:15 ` [PATCH 2/2] Deprecate inclusion of sys/sysmacros.h by sys/types.h Zack Weinberg
  2016-04-23 21:15 ` [PATCH 1/2] Add __clang_has_extension to sys/cdefs.h Zack Weinberg
  0 siblings, 2 replies; 14+ messages in thread
From: Zack Weinberg @ 2016-04-23 21:15 UTC (permalink / raw)
  To: libc-alpha

This revised patch series incorporates all of Roland's requested
changes from https://sourceware.org/ml/libc-alpha/2016-04/msg00537.html
et seq and also corrects some problems I discovered in the process.
In addition to the changes discussed in the earlier thread:

 * there is now a NEWS entry for the deprecation
 * the wording of the deprecation message in the headers has been polished
 * the macros in sysdeps/unix/sysv/linux/bits/sysmacros.h have been debugged
   and exhaustively validated up to (dev_t)0x0000_FFFF_FFFF_FFFF /
   (major,minor) 0x00FF_FFFF; these limits are well past the range actually
   accepted by Linux-the-kernel
 * adding gnu_dev_{major,minor,makedev} to misc/Versions entailed a
   bump to every single libc.abilist, feh

I wonder if the encoding we use for dev_t on Linux should be promoted
to sysdeps/generic; it is compatible with any OS that only supports
8-bit major and minor numbers, supports 32-bit major/minor (note that
Linux only does 12-bit major and 20-bit minor), and if we ever need to
support a kernel with a different encoding for wide dev_t values
(e.g. FreeBSD) we can add an override then.

ChangeLog entries are in the commit messages.

zw

Zack Weinberg (2):
  Add __clang_has_extension to sys/cdefs.h.
  Deprecate inclusion of sys/sysmacros.h by sys/types.h.

 NEWS                                               | 14 ++++
 include/sys/sysmacros.h                            |  1 +
 misc/Makefile                                      |  5 +-
 misc/Versions                                      |  3 +
 misc/makedev.c                                     | 40 +++++++++
 misc/sys/cdefs.h                                   | 21 ++++-
 misc/sys/sysmacros.h                               | 97 ++++++++++++++++++++++
 posix/Makefile                                     |  2 +-
 posix/sys/types.h                                  |  8 +-
 sysdeps/arm/nacl/libc.abilist                      |  4 +
 sysdeps/generic/bits/sysmacros.h                   | 30 +++++++
 sysdeps/generic/sys/sysmacros.h                    | 30 -------
 sysdeps/unix/sysv/linux/Makefile                   |  2 +-
 sysdeps/unix/sysv/linux/aarch64/libc.abilist       |  1 +
 sysdeps/unix/sysv/linux/alpha/libc.abilist         |  1 +
 sysdeps/unix/sysv/linux/arm/libc.abilist           |  1 +
 sysdeps/unix/sysv/linux/bits/sysmacros.h           | 44 ++++++++++
 sysdeps/unix/sysv/linux/hppa/libc.abilist          |  1 +
 sysdeps/unix/sysv/linux/i386/libc.abilist          |  1 +
 sysdeps/unix/sysv/linux/ia64/libc.abilist          |  1 +
 sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist |  1 +
 sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist   |  1 +
 sysdeps/unix/sysv/linux/makedev.c                  | 40 ---------
 sysdeps/unix/sysv/linux/microblaze/libc.abilist    |  1 +
 .../unix/sysv/linux/mips/mips32/fpu/libc.abilist   |  1 +
 .../unix/sysv/linux/mips/mips32/nofpu/libc.abilist |  1 +
 .../unix/sysv/linux/mips/mips64/n32/libc.abilist   |  1 +
 .../unix/sysv/linux/mips/mips64/n64/libc.abilist   |  1 +
 sysdeps/unix/sysv/linux/nios2/libc.abilist         |  1 +
 .../sysv/linux/powerpc/powerpc32/fpu/libc.abilist  |  1 +
 .../linux/powerpc/powerpc32/nofpu/libc.abilist     |  1 +
 .../sysv/linux/powerpc/powerpc64/libc-le.abilist   |  1 +
 .../unix/sysv/linux/powerpc/powerpc64/libc.abilist |  1 +
 sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist  |  1 +
 sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist  |  1 +
 sysdeps/unix/sysv/linux/sh/libc.abilist            |  1 +
 sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist |  1 +
 sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist |  1 +
 sysdeps/unix/sysv/linux/sys/sysmacros.h            | 65 ---------------
 .../sysv/linux/tile/tilegx/tilegx32/libc.abilist   |  1 +
 .../sysv/linux/tile/tilegx/tilegx64/libc.abilist   |  1 +
 sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist  |  1 +
 sysdeps/unix/sysv/linux/x86_64/64/libc.abilist     |  1 +
 sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist    |  1 +
 44 files changed, 293 insertions(+), 141 deletions(-)
 create mode 100644 include/sys/sysmacros.h
 create mode 100644 misc/makedev.c
 create mode 100644 misc/sys/sysmacros.h
 create mode 100644 sysdeps/generic/bits/sysmacros.h
 delete mode 100644 sysdeps/generic/sys/sysmacros.h
 create mode 100644 sysdeps/unix/sysv/linux/bits/sysmacros.h
 delete mode 100644 sysdeps/unix/sysv/linux/makedev.c
 delete mode 100644 sysdeps/unix/sysv/linux/sys/sysmacros.h

-- 
2.8.1

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH 1/2] Add __clang_has_extension to sys/cdefs.h.
  2016-04-23 21:15 [PATCH 0/2] Revised: deprecate sys/sysmacros.h inclusion from sys/types.h Zack Weinberg
  2016-04-23 21:15 ` [PATCH 2/2] Deprecate inclusion of sys/sysmacros.h by sys/types.h Zack Weinberg
@ 2016-04-23 21:15 ` Zack Weinberg
  2016-04-25  7:23   ` Florian Weimer
  2016-04-28 22:16   ` Roland McGrath
  1 sibling, 2 replies; 14+ messages in thread
From: Zack Weinberg @ 2016-04-23 21:15 UTC (permalink / raw)
  To: libc-alpha

clang provides an intrinsic __has_extension() to #if statements, useful
for feature detection.  Other compilers may throw a syntax error on

    #if defined __clang__ && __has_extension(...)

even though they do not need to evaluate the right-hand side of the
logical AND.  __clang_has_extension(...) therefore expands to
__has_extension(...) when __clang__ is defined, and to 0 otherwise.

	* misc/sys/cdefs.h: New utility macro __clang_has_extension.
---
 misc/sys/cdefs.h | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/misc/sys/cdefs.h b/misc/sys/cdefs.h
index 7fd4154..b31878b 100644
--- a/misc/sys/cdefs.h
+++ b/misc/sys/cdefs.h
@@ -77,7 +77,15 @@
 
 #endif	/* GCC.  */
 
+/* Compilers that are not clang may object to
+       #if defined __clang__ && __has_extension (...)
+   even though they do not need to evaluate the right-hand side of the &&.  */
+#ifdef __clang__
+# define __clang_has_extension(ext) __has_extension (ext)
+#else
+# define __clang_has_extension(ext) 0
+#endif
+
 /* These two macros are not used in glibc anymore.  They are kept here
    only because some other projects expect the macros to be defined.  */
 #define __P(args)	args
-- 
2.8.1

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH 2/2] Deprecate inclusion of sys/sysmacros.h by sys/types.h.
  2016-04-23 21:15 [PATCH 0/2] Revised: deprecate sys/sysmacros.h inclusion from sys/types.h Zack Weinberg
@ 2016-04-23 21:15 ` Zack Weinberg
  2016-04-25  7:24   ` Florian Weimer
  2016-04-23 21:15 ` [PATCH 1/2] Add __clang_has_extension to sys/cdefs.h Zack Weinberg
  1 sibling, 1 reply; 14+ messages in thread
From: Zack Weinberg @ 2016-04-23 21:15 UTC (permalink / raw)
  To: libc-alpha

        BZ #19239
	* NEWS: Definition of the macros “major”, “minor”, and
	“makedev” by <sys/types.h> is deprecated.  In a future release
	these macros will only be available from <sys/sysmacros.h>.
        * sysdeps/generic/bits/sysmacros.h
        * sysdeps/unix/sysv/linux/bits/sysmacros.h: New files.
        * sysdeps/unix/sysv/linux/makedev.c: Move ...
        * misc/makedev.c: ...here, and genericize.
        * sysdeps/unix/sysv/linux/sys/sysmacros.h: Move ...
        * misc/sys/sysmacros.h: ...here, and genericize.
        * posix/Makefile: Don't install sys/sysmacros.h.
        * sysdeps/unix/sysv/linux/Makefile: Don't build makedev.c.
        * misc/Makefile: Build makedev.c and install sys/sysmacros.h and
        bits/sysmacros.h.
        * misc/Versions [GLIBC_2.24]: Add gnu_dev_major, gnu_dev_minor,
        and gnu_dev_makedev.

        * sysdeps/arm/nacl/libc.abilist: Add GLIBC_2.24 and
	gnu_dev_major, gnu_dev_minor, gnu_dev_makedev.

        * sysdeps/unix/sysv/linux/aarch64/libc.abilist
        * sysdeps/unix/sysv/linux/alpha/libc.abilist
        * sysdeps/unix/sysv/linux/arm/libc.abilist
        * sysdeps/unix/sysv/linux/hppa/libc.abilist
        * sysdeps/unix/sysv/linux/i386/libc.abilist
        * sysdeps/unix/sysv/linux/ia64/libc.abilist
        * sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
        * sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
        * sysdeps/unix/sysv/linux/microblaze/libc.abilist
        * sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
        * sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
        * sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
        * sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
        * sysdeps/unix/sysv/linux/nios2/libc.abilist
        * sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
        * sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
        * sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist
        * sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist
        * sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
        * sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
        * sysdeps/unix/sysv/linux/sh/libc.abilist
        * sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
        * sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
        * sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist
        * sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist
        * sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist
        * sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
        * sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist:
	Add GLIBC_2.24.

        * misc/sys/cdefs.h: Add __attribute_deprecated_msg__, wrapping
        GCC >=4.5's ability to specify a detailed deprecation message.

        * posix/sys/types.h [__USE_MISC]:
        Define __SYSMACROS_DEPRECATED_INCLUSION before including
        <sys/sysmacros.h> and undefine it again afterward.
        * misc/sys/sysmacros.h: If __SYSMACROS_DEPRECATED_INCLUSION
        is defined, cause 'major', 'minor', and 'makedev' to issue
        deprecation warnings explaining that, in a future release,
        sys/types.h will not provide these macros.  If included directly
        (whether or not sys/types.h has been or will be included),
        define them without these warnings.
---
 NEWS                                               | 14 ++++
 include/sys/sysmacros.h                            |  1 +
 misc/Makefile                                      |  5 +-
 misc/Versions                                      |  3 +
 misc/makedev.c                                     | 40 +++++++++
 misc/sys/cdefs.h                                   | 12 ++-
 misc/sys/sysmacros.h                               | 97 ++++++++++++++++++++++
 posix/Makefile                                     |  2 +-
 posix/sys/types.h                                  |  8 +-
 sysdeps/arm/nacl/libc.abilist                      |  4 +
 sysdeps/generic/bits/sysmacros.h                   | 30 +++++++
 sysdeps/generic/sys/sysmacros.h                    | 30 -------
 sysdeps/unix/sysv/linux/Makefile                   |  2 +-
 sysdeps/unix/sysv/linux/aarch64/libc.abilist       |  1 +
 sysdeps/unix/sysv/linux/alpha/libc.abilist         |  1 +
 sysdeps/unix/sysv/linux/arm/libc.abilist           |  1 +
 sysdeps/unix/sysv/linux/bits/sysmacros.h           | 44 ++++++++++
 sysdeps/unix/sysv/linux/hppa/libc.abilist          |  1 +
 sysdeps/unix/sysv/linux/i386/libc.abilist          |  1 +
 sysdeps/unix/sysv/linux/ia64/libc.abilist          |  1 +
 sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist |  1 +
 sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist   |  1 +
 sysdeps/unix/sysv/linux/makedev.c                  | 40 ---------
 sysdeps/unix/sysv/linux/microblaze/libc.abilist    |  1 +
 .../unix/sysv/linux/mips/mips32/fpu/libc.abilist   |  1 +
 .../unix/sysv/linux/mips/mips32/nofpu/libc.abilist |  1 +
 .../unix/sysv/linux/mips/mips64/n32/libc.abilist   |  1 +
 .../unix/sysv/linux/mips/mips64/n64/libc.abilist   |  1 +
 sysdeps/unix/sysv/linux/nios2/libc.abilist         |  1 +
 .../sysv/linux/powerpc/powerpc32/fpu/libc.abilist  |  1 +
 .../linux/powerpc/powerpc32/nofpu/libc.abilist     |  1 +
 .../sysv/linux/powerpc/powerpc64/libc-le.abilist   |  1 +
 .../unix/sysv/linux/powerpc/powerpc64/libc.abilist |  1 +
 sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist  |  1 +
 sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist  |  1 +
 sysdeps/unix/sysv/linux/sh/libc.abilist            |  1 +
 sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist |  1 +
 sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist |  1 +
 sysdeps/unix/sysv/linux/sys/sysmacros.h            | 65 ---------------
 .../sysv/linux/tile/tilegx/tilegx32/libc.abilist   |  1 +
 .../sysv/linux/tile/tilegx/tilegx64/libc.abilist   |  1 +
 sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist  |  1 +
 sysdeps/unix/sysv/linux/x86_64/64/libc.abilist     |  1 +
 sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist    |  1 +
 44 files changed, 284 insertions(+), 141 deletions(-)
 create mode 100644 include/sys/sysmacros.h
 create mode 100644 misc/makedev.c
 create mode 100644 misc/sys/sysmacros.h
 create mode 100644 sysdeps/generic/bits/sysmacros.h
 delete mode 100644 sysdeps/generic/sys/sysmacros.h
 create mode 100644 sysdeps/unix/sysv/linux/bits/sysmacros.h
 delete mode 100644 sysdeps/unix/sysv/linux/makedev.c
 delete mode 100644 sysdeps/unix/sysv/linux/sys/sysmacros.h

diff --git a/NEWS b/NEWS
index 54ffb02..ab33e8f 100644
--- a/NEWS
+++ b/NEWS
@@ -25,6 +25,20 @@ Version 2.24
   1990s and never part of POSIX.  Application code should use the int type
   instead of “union wait”.
 
+* Definition of the macros “major”, “minor”, and “makedev” by <sys/types.h>
+  is deprecated.  In a future release these macros will only be available
+  from <sys/sysmacros.h>.
+
+  These macros are not part of POSIX nor XSI, and their names have been
+  found frequently to collide with user code; see for instance glibc bug
+  19239 and Red Hat bug 130601.  C++ code presently cannot avoid being
+  compiled under _GNU_SOURCE, exacerbating the problem.
+
+  Code that does not need these macros should #undef them after including
+  <sys/types.h>; this will also improve portability to BSD-derived systems.
+  Code that *does* need these macros should include <sys/sysmacros.h> as well
+  as <sys/types.h>.
+
 Security related changes:
 
   [Add security related changes here]
diff --git a/include/sys/sysmacros.h b/include/sys/sysmacros.h
new file mode 100644
index 0000000..87813c5
--- /dev/null
+++ b/include/sys/sysmacros.h
@@ -0,0 +1 @@
+#include <misc/sys/sysmacros.h>
diff --git a/misc/Makefile b/misc/Makefile
index d7bbc85..f173c0a 100644
--- a/misc/Makefile
+++ b/misc/Makefile
@@ -34,7 +34,8 @@ headers	:= sys/uio.h bits/uio.h sys/ioctl.h bits/ioctls.h bits/ioctl-types.h \
 	   regexp.h bits/select.h bits/mman.h sys/xattr.h \
 	   syslog.h sys/syslog.h \
 	   bits/syslog.h bits/syslog-ldbl.h bits/syslog-path.h bits/error.h \
-	   bits/select2.h bits/hwcap.h sys/auxv.h
+	   bits/select2.h bits/hwcap.h sys/auxv.h \
+	   sys/sysmacros.h bits/sysmacros.h
 
 routines := brk sbrk sstk ioctl \
 	    readv writev preadv preadv64 pwritev pwritev64 \
@@ -67,7 +68,7 @@ routines := brk sbrk sstk ioctl \
 	    getloadavg getclktck \
 	    fgetxattr flistxattr fremovexattr fsetxattr getxattr \
 	    listxattr lgetxattr llistxattr lremovexattr lsetxattr \
-	    removexattr setxattr getauxval ifunc-impl-list
+	    removexattr setxattr getauxval ifunc-impl-list makedev
 
 generated += tst-error1.mtrace tst-error1-mem.out
 
diff --git a/misc/Versions b/misc/Versions
index 671f487..afa22bd 100644
--- a/misc/Versions
+++ b/misc/Versions
@@ -152,6 +152,9 @@ libc {
   GLIBC_2.23 {
     # SHLIB_COMPAT(GLIBC_2_0, GLIBC_2_23) used in regexp.c
   }
+  GLIBC_2.24 {
+    gnu_dev_major; gnu_dev_minor; gnu_dev_makedev;
+  }
   GLIBC_PRIVATE {
     __madvise;
     __mktemp;
diff --git a/misc/makedev.c b/misc/makedev.c
new file mode 100644
index 0000000..6ade663
--- /dev/null
+++ b/misc/makedev.c
@@ -0,0 +1,40 @@
+/* Definitions of functions to access `dev_t' values.
+   Copyright (C) 2003-2016 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
+   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/>.  */
+
+#include <features.h>
+#undef __USE_EXTERN_INLINES
+#include <sys/sysmacros.h>
+#include <sys/types.h>
+
+unsigned int
+gnu_dev_major (dev_t dev)
+{
+  return __dev_major (dev);
+}
+
+unsigned int
+gnu_dev_minor (dev_t dev)
+{
+  return __dev_minor (dev);
+}
+
+dev_t
+gnu_dev_makedev (unsigned int major, unsigned int minor)
+{
+  return __dev_makedev (major, minor);
+}
diff --git a/misc/sys/cdefs.h b/misc/sys/cdefs.h
index b31878b..ee4f33b 100644
--- a/misc/sys/cdefs.h
+++ b/misc/sys/cdefs.h
@@ -258,13 +258,23 @@
 # define __attribute_noinline__ /* Ignore */
 #endif
 
-/* gcc allows marking deprecated functions.  */
+/* gcc has supported marking deprecated functions since 3.2, but the
+   ability to specify a message was only added in 4.5.  clang claims
+   to be gcc 4.2, but may support messages anyway.  */
 #if __GNUC_PREREQ (3,2)
 # define __attribute_deprecated__ __attribute__ ((__deprecated__))
 #else
 # define __attribute_deprecated__ /* Ignore */
 #endif
 
+#if __GNUC_PREREQ (4,5) || \
+    __clang_has_extension (__attribute_deprecated_with_message__)
+# define __attribute_deprecated_msg__(msg) \
+         __attribute__ ((__deprecated__ (msg)))
+#else
+# define __attribute_deprecated_msg__(msg) __attribute_deprecated__
+#endif
+
 /* At some point during the gcc 2.8 development the `format_arg' attribute
    for functions was introduced.  We don't want to use it unconditionally
    (although this would be possible) since it generates warnings.
diff --git a/misc/sys/sysmacros.h b/misc/sys/sysmacros.h
new file mode 100644
index 0000000..a0c55d6
--- /dev/null
+++ b/misc/sys/sysmacros.h
@@ -0,0 +1,97 @@
+/* Definitions of macros to access `dev_t' values.
+   Copyright (C) 1996-2015 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
+   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/>.  */
+
+#ifndef _SYS_SYSMACROS_H
+
+#ifndef __SYSMACROS_DEPRECATED_INCLUSION
+# define _SYS_SYSMACROS_H	1
+#endif
+
+/* If <sys/sysmacros.h> is included after <sys/types.h>, these macros
+   will already be defined, and we need to redefine them without the
+   deprecation warnings.  (If they are included in the opposite order,
+   the outer #ifndef will suppress this entire file and the macros
+   will be usable without warnings.)  */
+#undef major
+#undef minor
+#undef makedev
+
+#ifndef _SYS_SYSMACROS_H_INNER
+# define _SYS_SYSMACROS_H_INNER 1
+
+# include <features.h>
+# include <bits/types.h>
+# include <bits/sysmacros.h>
+
+/* The final \n and space move gcc's [-Wdeprecated-declarations]
+   annotation onto the next line.  */
+# define __SYSMACROS_DEPRECATION_MSG(symbol)                            \
+  "\n  In the GNU C Library, `" #symbol "' is defined by <sys/sysmacros.h>." \
+  "\n  For historical compatibility, it is currently defined by"        \
+  "\n  <sys/types.h> as well, but we plan to remove this soon."         \
+  "\n  To use `" #symbol "', include <sys/sysmacros.h> directly."       \
+  "\n  If you did not intend to use a system-defined macro `" #symbol "'," \
+  "\n  you should #undef it after including <sys/types.h>."             \
+  "\n "
+
+# define __SYSMACROS_DECL(rtype, name, proto)                           \
+  extern rtype gnu_dev_##name proto __THROW __attribute_const__;        \
+  extern rtype __REDIRECT_NTH (__##name##_from_sys_types, proto,        \
+                               gnu_dev_##name)                          \
+       __attribute_const__                                              \
+       __attribute_deprecated_msg__ (__SYSMACROS_DEPRECATION_MSG (name));
+
+# ifdef __USE_EXTERN_INLINES
+#  define __SYSMACROS_IMPL(rtype, name, proto, expr)            \
+  __SYSMACROS_DECL (rtype, name, proto)                         \
+  __extension__ __extern_inline __attribute_const__ rtype       \
+  __NTH (gnu_dev_##name proto) { return expr; }                 \
+  __extension__ __extern_inline __attribute_const__ rtype       \
+  __NTH (__##name##_from_sys_types proto) { return expr; }
+# else
+#  define __SYSMACROS_IMPL(rtype, name, proto, expr)    \
+  __SYSMACROS_DECL (rtype, name, proto)
+#endif
+
+__BEGIN_DECLS
+
+__SYSMACROS_IMPL (unsigned int, major, (__dev_t __dev), __dev_major (__dev))
+__SYSMACROS_IMPL (unsigned int, minor, (__dev_t __dev), __dev_minor (__dev))
+__SYSMACROS_IMPL (__dev_t, makedev,
+                  (unsigned int __major, unsigned int __minor),
+                  __dev_makedev (__major, __minor))
+
+__END_DECLS
+
+# undef __SYSMACROS_IMPL
+# undef __SYSMACROS_DECL
+# undef __SYSMACROS_INCLUSION_DEPRECATION_MSG
+
+# endif /* _SYS_SYSMACROS_H_INNER */
+
+# ifdef __SYSMACROS_DEPRECATED_INCLUSION
+#  define major(dev) __major_from_sys_types (dev)
+#  define minor(dev) __minor_from_sys_types (dev)
+#  define makedev(maj, min) __makedev_from_sys_types (maj, min)
+# else
+#  define major(dev) gnu_dev_major (dev)
+#  define minor(dev) gnu_dev_minor (dev)
+#  define makedev(maj, min) gnu_dev_makedev (maj, min)
+#endif
+
+#endif /* sys/sysmacros.h */
diff --git a/posix/Makefile b/posix/Makefile
index 5b0e298..3a7719e 100644
--- a/posix/Makefile
+++ b/posix/Makefile
@@ -29,7 +29,7 @@ headers	:= sys/utsname.h sys/times.h sys/wait.h sys/types.h unistd.h	      \
 	   bits/local_lim.h tar.h bits/utsname.h bits/confname.h	      \
 	   bits/waitflags.h bits/waitstatus.h sys/unistd.h sched.h	      \
 	   bits/sched.h re_comp.h wait.h bits/environments.h cpio.h	      \
-	   sys/sysmacros.h spawn.h bits/unistd.h
+	   spawn.h bits/unistd.h
 
 routines :=								      \
 	uname								      \
diff --git a/posix/sys/types.h b/posix/sys/types.h
index a728567..83dadcd 100644
--- a/posix/sys/types.h
+++ b/posix/sys/types.h
@@ -218,8 +218,14 @@ typedef int register_t __attribute__ ((__mode__ (__word__)));
 /* It also defines `fd_set' and the FD_* macros for `select'.  */
 # include <sys/select.h>
 
-/* BSD defines these symbols, so we follow.  */
+/* BSD defines `major', `minor', and `makedev' in this header.
+   However, these symbols are likely to collide with user code, so we are
+   going to stop defining them here in an upcoming release.  Code that needs
+   these macros should include <sys/sysmacros.h> directly.  Code that does
+   not need these macros should #undef them after including this header.  */
+# define __SYSMACROS_DEPRECATED_INCLUSION
 # include <sys/sysmacros.h>
+# undef __SYSMACROS_DEPRECATED_INCLUSION
 #endif /* Use misc.  */
 
 
diff --git a/sysdeps/arm/nacl/libc.abilist b/sysdeps/arm/nacl/libc.abilist
index 0560510..8cf81fd 100644
--- a/sysdeps/arm/nacl/libc.abilist
+++ b/sysdeps/arm/nacl/libc.abilist
@@ -1840,3 +1840,7 @@ GLIBC_2.23 fts64_close F
 GLIBC_2.23 fts64_open F
 GLIBC_2.23 fts64_read F
 GLIBC_2.23 fts64_set F
+GLIBC_2.24 GLIBC_2.24 A
+GLIBC_2.24 gnu_dev_major F
+GLIBC_2.24 gnu_dev_minor F
+GLIBC_2.24 gnu_dev_mkdev F
diff --git a/sysdeps/generic/bits/sysmacros.h b/sysdeps/generic/bits/sysmacros.h
new file mode 100644
index 0000000..bc15c5b
--- /dev/null
+++ b/sysdeps/generic/bits/sysmacros.h
@@ -0,0 +1,30 @@
+/* Definitions of macros to access `dev_t' values.
+   Copyright (C) 1996-2016 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
+   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/>.  */
+
+#ifndef _BITS_SYSMACROS_H
+#define _BITS_SYSMACROS_H	1
+
+#ifndef _SYS_SYSMACROS_H_INNER
+# error "Never include <bits/sysmacros.h> directly; use <sys/sysmacros.h> instead."
+#endif
+
+#define __dev_major(dev) ((dev) >> 8) & 0xff))
+#define __dev_minor(dev) ((dev)       & 0xff))
+#define __dev_makedev(major, minor) (((major) << 8) | (minor & 0xff))
+
+#endif /* bits/sysmacros.h */
diff --git a/sysdeps/generic/sys/sysmacros.h b/sysdeps/generic/sys/sysmacros.h
deleted file mode 100644
index 4cc5961..0000000
--- a/sysdeps/generic/sys/sysmacros.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Definitions of macros to access `dev_t' values.
-   Copyright (C) 1996-2016 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
-   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/>.  */
-
-#ifndef _SYS_SYSMACROS_H
-#define _SYS_SYSMACROS_H	1
-
-/* For compatibility we provide alternative names.
-
-   The problem here is that compilers other than GCC probably don't
-   have the `long long' type and so `dev_t' is actually an array.  */
-#define major(dev) ((int)(((unsigned int) (dev) >> 8) & 0xff))
-#define minor(dev) ((int)((dev) & 0xff))
-#define makedev(major, minor) (((major) << 8) | (minor))
-
-#endif /* sys/sysmacros.h */
diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
index 9999600..bc26db3 100644
--- a/sysdeps/unix/sysv/linux/Makefile
+++ b/sysdeps/unix/sysv/linux/Makefile
@@ -15,7 +15,7 @@ ifeq ($(subdir),misc)
 include $(firstword $(wildcard $(sysdirs:=/sysctl.mk)))
 
 sysdep_routines += clone llseek umount umount2 readahead \
-		   setfsuid setfsgid makedev epoll_pwait signalfd \
+		   setfsuid setfsgid epoll_pwait signalfd \
 		   eventfd eventfd_read eventfd_write prlimit \
 		   personality
 
diff --git a/sysdeps/unix/sysv/linux/aarch64/libc.abilist b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
index 5799239..7c2c757 100644
--- a/sysdeps/unix/sysv/linux/aarch64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
@@ -2087,3 +2087,4 @@ GLIBC_2.23 fts64_close F
 GLIBC_2.23 fts64_open F
 GLIBC_2.23 fts64_read F
 GLIBC_2.23 fts64_set F
+GLIBC_2.24 GLIBC_2.24 A
diff --git a/sysdeps/unix/sysv/linux/alpha/libc.abilist b/sysdeps/unix/sysv/linux/alpha/libc.abilist
index 0fa4ee9..c93737c 100644
--- a/sysdeps/unix/sysv/linux/alpha/libc.abilist
+++ b/sysdeps/unix/sysv/linux/alpha/libc.abilist
@@ -1998,6 +1998,7 @@ GLIBC_2.23 fts64_close F
 GLIBC_2.23 fts64_open F
 GLIBC_2.23 fts64_read F
 GLIBC_2.23 fts64_set F
+GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
diff --git a/sysdeps/unix/sysv/linux/arm/libc.abilist b/sysdeps/unix/sysv/linux/arm/libc.abilist
index db9fa35..faae0de 100644
--- a/sysdeps/unix/sysv/linux/arm/libc.abilist
+++ b/sysdeps/unix/sysv/linux/arm/libc.abilist
@@ -88,6 +88,7 @@ GLIBC_2.23 fts64_close F
 GLIBC_2.23 fts64_open F
 GLIBC_2.23 fts64_read F
 GLIBC_2.23 fts64_set F
+GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 _Exit F
 GLIBC_2.4 _IO_2_1_stderr_ D 0xa0
diff --git a/sysdeps/unix/sysv/linux/bits/sysmacros.h b/sysdeps/unix/sysv/linux/bits/sysmacros.h
new file mode 100644
index 0000000..397aedf
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/bits/sysmacros.h
@@ -0,0 +1,44 @@
+/* Definitions of macros to access `dev_t' values.
+   Copyright (C) 1996-2015 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
+   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/>.  */
+
+#ifndef _BITS_SYSMACROS_H
+#define _BITS_SYSMACROS_H	1
+
+#ifndef _SYS_SYSMACROS_H_INNER
+# error "Never include <bits/sysmacros.h> directly; use <sys/sysmacros.h> instead."
+#endif
+
+/* dev_t in glibc is a 64-bit quantity, encoded as MMMM Mmmm mmmM MMmm,
+   where M is a hex digit of the major number and m is a hex digit of
+   the minor number.  Linux-the-kernel only uses the low 32 bits.  */
+
+#define __dev_major(dev)                                \
+  (  (((dev) & (__dev_t) 0x00000000000fff00u) >>  8)    \
+   | (((dev) & (__dev_t) 0xfffff00000000000u) >> 32))
+
+#define __dev_minor(dev)                                \
+  (  (((dev) & (__dev_t) 0x00000000000000ffu) >>  0)    \
+   | (((dev) & (__dev_t) 0x00000ffffff00000u) >> 12))
+
+#define __dev_makedev(major, minor)                     \
+  (  (((__dev_t) ((minor) & 0x000000ffu)) <<  0)        \
+   | (((__dev_t) ((minor) & 0xffffff00u)) << 12)        \
+   | (((__dev_t) ((major) & 0x00000fffu)) <<  8)        \
+   | (((__dev_t) ((major) & 0xfffff000u)) << 32))
+
+#endif /* bits/sysmacros.h */
diff --git a/sysdeps/unix/sysv/linux/hppa/libc.abilist b/sysdeps/unix/sysv/linux/hppa/libc.abilist
index 1d30644..3389ede 100644
--- a/sysdeps/unix/sysv/linux/hppa/libc.abilist
+++ b/sysdeps/unix/sysv/linux/hppa/libc.abilist
@@ -1852,6 +1852,7 @@ GLIBC_2.23 fts64_close F
 GLIBC_2.23 fts64_open F
 GLIBC_2.23 fts64_read F
 GLIBC_2.23 fts64_set F
+GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
diff --git a/sysdeps/unix/sysv/linux/i386/libc.abilist b/sysdeps/unix/sysv/linux/i386/libc.abilist
index 8f3502d..40a9ff1 100644
--- a/sysdeps/unix/sysv/linux/i386/libc.abilist
+++ b/sysdeps/unix/sysv/linux/i386/libc.abilist
@@ -2010,6 +2010,7 @@ GLIBC_2.23 fts64_close F
 GLIBC_2.23 fts64_open F
 GLIBC_2.23 fts64_read F
 GLIBC_2.23 fts64_set F
+GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
diff --git a/sysdeps/unix/sysv/linux/ia64/libc.abilist b/sysdeps/unix/sysv/linux/ia64/libc.abilist
index 921ec55..8794ae7 100644
--- a/sysdeps/unix/sysv/linux/ia64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/ia64/libc.abilist
@@ -1874,6 +1874,7 @@ GLIBC_2.23 fts64_close F
 GLIBC_2.23 fts64_open F
 GLIBC_2.23 fts64_read F
 GLIBC_2.23 fts64_set F
+GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
index 019095b..5a4ae8c 100644
--- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
@@ -89,6 +89,7 @@ GLIBC_2.23 fts64_close F
 GLIBC_2.23 fts64_open F
 GLIBC_2.23 fts64_read F
 GLIBC_2.23 fts64_set F
+GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 _Exit F
 GLIBC_2.4 _IO_2_1_stderr_ D 0x98
diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
index a999a48..5b7b67a 100644
--- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
@@ -1966,6 +1966,7 @@ GLIBC_2.23 fts64_close F
 GLIBC_2.23 fts64_open F
 GLIBC_2.23 fts64_read F
 GLIBC_2.23 fts64_set F
+GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
diff --git a/sysdeps/unix/sysv/linux/makedev.c b/sysdeps/unix/sysv/linux/makedev.c
deleted file mode 100644
index 68c18ca..0000000
--- a/sysdeps/unix/sysv/linux/makedev.c
+++ /dev/null
@@ -1,40 +0,0 @@
-/* Definitions of functions to access `dev_t' values.
-   Copyright (C) 2003-2016 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
-   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/>.  */
-
-#include <endian.h>
-#include <sys/sysmacros.h>
-
-unsigned int
-gnu_dev_major (unsigned long long int dev)
-{
-  return ((dev >> 8) & 0xfff) | ((unsigned int) (dev >> 32) & ~0xfff);
-}
-
-unsigned int
-gnu_dev_minor (unsigned long long int dev)
-{
-  return (dev & 0xff) | ((unsigned int) (dev >> 12) & ~0xff);
-}
-
-unsigned long long int
-gnu_dev_makedev (unsigned int major, unsigned int minor)
-{
-  return ((minor & 0xff) | ((major & 0xfff) << 8)
-	  | (((unsigned long long int) (minor & ~0xff)) << 12)
-	  | (((unsigned long long int) (major & ~0xfff)) << 32));
-}
diff --git a/sysdeps/unix/sysv/linux/microblaze/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/libc.abilist
index 0a08bba..25f509f 100644
--- a/sysdeps/unix/sysv/linux/microblaze/libc.abilist
+++ b/sysdeps/unix/sysv/linux/microblaze/libc.abilist
@@ -2087,3 +2087,4 @@ GLIBC_2.23 fts64_close F
 GLIBC_2.23 fts64_open F
 GLIBC_2.23 fts64_read F
 GLIBC_2.23 fts64_set F
+GLIBC_2.24 GLIBC_2.24 A
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
index 2ab9e94..b8eaf1d 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
@@ -1941,6 +1941,7 @@ GLIBC_2.23 fts64_close F
 GLIBC_2.23 fts64_open F
 GLIBC_2.23 fts64_read F
 GLIBC_2.23 fts64_set F
+GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
index b9b4b74..f126bc3 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
@@ -1939,6 +1939,7 @@ GLIBC_2.23 fts64_close F
 GLIBC_2.23 fts64_open F
 GLIBC_2.23 fts64_read F
 GLIBC_2.23 fts64_set F
+GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
index 14e1236..8d1192f 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
@@ -1937,6 +1937,7 @@ GLIBC_2.23 fts64_close F
 GLIBC_2.23 fts64_open F
 GLIBC_2.23 fts64_read F
 GLIBC_2.23 fts64_set F
+GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
index 53e0c9a..b948fb9 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
@@ -1932,6 +1932,7 @@ GLIBC_2.23 fts64_close F
 GLIBC_2.23 fts64_open F
 GLIBC_2.23 fts64_read F
 GLIBC_2.23 fts64_set F
+GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
diff --git a/sysdeps/unix/sysv/linux/nios2/libc.abilist b/sysdeps/unix/sysv/linux/nios2/libc.abilist
index dff1ee9..ff5d6b8 100644
--- a/sysdeps/unix/sysv/linux/nios2/libc.abilist
+++ b/sysdeps/unix/sysv/linux/nios2/libc.abilist
@@ -2128,3 +2128,4 @@ GLIBC_2.23 fts64_close F
 GLIBC_2.23 fts64_open F
 GLIBC_2.23 fts64_read F
 GLIBC_2.23 fts64_set F
+GLIBC_2.24 GLIBC_2.24 A
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
index 6861846..0ee8943 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
@@ -1970,6 +1970,7 @@ GLIBC_2.23 fts64_close F
 GLIBC_2.23 fts64_open F
 GLIBC_2.23 fts64_read F
 GLIBC_2.23 fts64_set F
+GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
index fd611aa..8fd0b59 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
@@ -1975,6 +1975,7 @@ GLIBC_2.23 fts64_close F
 GLIBC_2.23 fts64_open F
 GLIBC_2.23 fts64_read F
 GLIBC_2.23 fts64_set F
+GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist
index a97bd43..31e3184 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist
@@ -2175,3 +2175,4 @@ GLIBC_2.23 fts64_close F
 GLIBC_2.23 fts64_open F
 GLIBC_2.23 fts64_read F
 GLIBC_2.23 fts64_set F
+GLIBC_2.24 GLIBC_2.24 A
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist
index 00772cb..f10ecb1 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist
@@ -89,6 +89,7 @@ GLIBC_2.23 fts64_close F
 GLIBC_2.23 fts64_open F
 GLIBC_2.23 fts64_read F
 GLIBC_2.23 fts64_set F
+GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 _Exit F
 GLIBC_2.3 _IO_2_1_stderr_ D 0xe0
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
index 05cb85e..6ff891f 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
@@ -1970,6 +1970,7 @@ GLIBC_2.23 fts64_close F
 GLIBC_2.23 fts64_open F
 GLIBC_2.23 fts64_read F
 GLIBC_2.23 fts64_set F
+GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
index 1af185f..9e22c2a 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
@@ -1871,6 +1871,7 @@ GLIBC_2.23 fts64_close F
 GLIBC_2.23 fts64_open F
 GLIBC_2.23 fts64_read F
 GLIBC_2.23 fts64_set F
+GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
diff --git a/sysdeps/unix/sysv/linux/sh/libc.abilist b/sysdeps/unix/sysv/linux/sh/libc.abilist
index e128692..64d8988 100644
--- a/sysdeps/unix/sysv/linux/sh/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sh/libc.abilist
@@ -1856,6 +1856,7 @@ GLIBC_2.23 fts64_close F
 GLIBC_2.23 fts64_open F
 GLIBC_2.23 fts64_read F
 GLIBC_2.23 fts64_set F
+GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
index eb14113..2442ac3 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
@@ -1962,6 +1962,7 @@ GLIBC_2.23 fts64_close F
 GLIBC_2.23 fts64_open F
 GLIBC_2.23 fts64_read F
 GLIBC_2.23 fts64_set F
+GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
index 91b97ef..2edf17e 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
@@ -1900,6 +1900,7 @@ GLIBC_2.23 fts64_close F
 GLIBC_2.23 fts64_open F
 GLIBC_2.23 fts64_read F
 GLIBC_2.23 fts64_set F
+GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
diff --git a/sysdeps/unix/sysv/linux/sys/sysmacros.h b/sysdeps/unix/sysv/linux/sys/sysmacros.h
deleted file mode 100644
index 4c4a697..0000000
--- a/sysdeps/unix/sysv/linux/sys/sysmacros.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/* Definitions of macros to access `dev_t' values.
-   Copyright (C) 1996-2016 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
-   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/>.  */
-
-#ifndef _SYS_SYSMACROS_H
-#define _SYS_SYSMACROS_H	1
-
-#include <features.h>
-
-__BEGIN_DECLS
-
-__extension__
-extern unsigned int gnu_dev_major (unsigned long long int __dev)
-     __THROW __attribute_const__;
-__extension__
-extern unsigned int gnu_dev_minor (unsigned long long int __dev)
-     __THROW __attribute_const__;
-__extension__
-extern unsigned long long int gnu_dev_makedev (unsigned int __major,
-					       unsigned int __minor)
-     __THROW __attribute_const__;
-
-#ifdef __USE_EXTERN_INLINES
-__extension__ __extern_inline __attribute_const__ unsigned int
-__NTH (gnu_dev_major (unsigned long long int __dev))
-{
-  return ((__dev >> 8) & 0xfff) | ((unsigned int) (__dev >> 32) & ~0xfff);
-}
-
-__extension__ __extern_inline __attribute_const__ unsigned int
-__NTH (gnu_dev_minor (unsigned long long int __dev))
-{
-  return (__dev & 0xff) | ((unsigned int) (__dev >> 12) & ~0xff);
-}
-
-__extension__ __extern_inline __attribute_const__ unsigned long long int
-__NTH (gnu_dev_makedev (unsigned int __major, unsigned int __minor))
-{
-  return ((__minor & 0xff) | ((__major & 0xfff) << 8)
-	  | (((unsigned long long int) (__minor & ~0xff)) << 12)
-	  | (((unsigned long long int) (__major & ~0xfff)) << 32));
-}
-#endif
-__END_DECLS
-
-/* Access the functions with their traditional names.  */
-#define major(dev) gnu_dev_major (dev)
-#define minor(dev) gnu_dev_minor (dev)
-#define makedev(maj, min) gnu_dev_makedev (maj, min)
-
-#endif /* sys/sysmacros.h */
diff --git a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist
index ffcc4a0..6174283 100644
--- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist
@@ -2094,3 +2094,4 @@ GLIBC_2.23 fts64_close F
 GLIBC_2.23 fts64_open F
 GLIBC_2.23 fts64_read F
 GLIBC_2.23 fts64_set F
+GLIBC_2.24 GLIBC_2.24 A
diff --git a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist
index a66e8ec..bba6d7e 100644
--- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist
@@ -2094,3 +2094,4 @@ GLIBC_2.23 fts64_close F
 GLIBC_2.23 fts64_open F
 GLIBC_2.23 fts64_read F
 GLIBC_2.23 fts64_set F
+GLIBC_2.24 GLIBC_2.24 A
diff --git a/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist b/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist
index ffcc4a0..6174283 100644
--- a/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist
+++ b/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist
@@ -2094,3 +2094,4 @@ GLIBC_2.23 fts64_close F
 GLIBC_2.23 fts64_open F
 GLIBC_2.23 fts64_read F
 GLIBC_2.23 fts64_set F
+GLIBC_2.24 GLIBC_2.24 A
diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
index c6e3cd4..d55d4f1 100644
--- a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
@@ -1851,6 +1851,7 @@ GLIBC_2.23 fts64_close F
 GLIBC_2.23 fts64_open F
 GLIBC_2.23 fts64_read F
 GLIBC_2.23 fts64_set F
+GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
index 04dc8e4..dd5274a 100644
--- a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
@@ -2094,3 +2094,4 @@ GLIBC_2.23 fts64_close F
 GLIBC_2.23 fts64_open F
 GLIBC_2.23 fts64_read F
 GLIBC_2.23 fts64_set F
+GLIBC_2.24 GLIBC_2.24 A
-- 
2.8.1

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/2] Add __clang_has_extension to sys/cdefs.h.
  2016-04-23 21:15 ` [PATCH 1/2] Add __clang_has_extension to sys/cdefs.h Zack Weinberg
@ 2016-04-25  7:23   ` Florian Weimer
  2016-04-25 13:57     ` Zack Weinberg
  2016-04-28 22:16   ` Roland McGrath
  1 sibling, 1 reply; 14+ messages in thread
From: Florian Weimer @ 2016-04-25  7:23 UTC (permalink / raw)
  To: Zack Weinberg; +Cc: libc-alpha

On 04/23/2016 01:05 AM, Zack Weinberg wrote:
> 	* misc/sys/cdefs.h: New utility macro __clang_has_extension.

I don't feel strongly about this, but the identifier looks like it's in 
the Clang namespace.  Perhaps use __glibc_clang_has_extension instead?

Florian

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/2] Deprecate inclusion of sys/sysmacros.h by sys/types.h.
  2016-04-23 21:15 ` [PATCH 2/2] Deprecate inclusion of sys/sysmacros.h by sys/types.h Zack Weinberg
@ 2016-04-25  7:24   ` Florian Weimer
  2016-04-25 13:50     ` Zack Weinberg
  0 siblings, 1 reply; 14+ messages in thread
From: Florian Weimer @ 2016-04-25  7:24 UTC (permalink / raw)
  To: Zack Weinberg; +Cc: libc-alpha

On 11/19/2015 05:11 AM, Zack Weinberg wrote:

>          * misc/Versions [GLIBC_2.24]: Add gnu_dev_major, gnu_dev_minor,
>          and gnu_dev_makedev.

Why do we need these new functions?  Recent GCC has support for emitting 
warnings from macros, if that's what you need.

>          * misc/sys/cdefs.h: Add __attribute_deprecated_msg__, wrapping
>          GCC >=4.5's ability to specify a detailed deprecation message.

That should probably go into a separate patch.

Florian

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/2] Deprecate inclusion of sys/sysmacros.h by sys/types.h.
  2016-04-25  7:24   ` Florian Weimer
@ 2016-04-25 13:50     ` Zack Weinberg
  2016-04-28 22:05       ` Roland McGrath
  2016-05-10 14:13       ` Zack Weinberg
  0 siblings, 2 replies; 14+ messages in thread
From: Zack Weinberg @ 2016-04-25 13:50 UTC (permalink / raw)
  To: Florian Weimer; +Cc: GNU C Library

On Mon, Apr 25, 2016 at 3:24 AM, Florian Weimer <fweimer@redhat.com> wrote:
> On 11/19/2015 05:11 AM, Zack Weinberg wrote:
>
>>          * misc/Versions [GLIBC_2.24]: Add gnu_dev_major, gnu_dev_minor,
>>          and gnu_dev_makedev.
>
> Why do we need these new functions?  Recent GCC has support for emitting
> warnings from macros, if that's what you need.

I should maybe split the patch again to make clearer what is going on.
These functions exist already for Linux-based configurations; I promoted
them to generic so that the new bits/sysmacros.h could contain only the
minimum amount of system-specific logic.

The functions are *needed* because the Linux kernel encoding of dev_t
values is complicated.  Pure macro implementations of major, minor,
makedev could only avoid evaluating their arguments multiple times by
resorting to the ({ ... }) extension, which is no good for a header
that has to work with any compiler.  Instead, the original author of
sysdeps/.../linux/sys/sysmacros.h went for inline functions, with
out-of-line fallbacks in case inlining is suppressed or unavailable.
I imagine we wouldn't name those functions gnu_dev_(major|minor|makedev)
nowadays, but they're in the ABI already.

I shall look into the warnings-from-macros feature; maybe it will get
me out of having to use __REDIRECT.

>>          * misc/sys/cdefs.h: Add __attribute_deprecated_msg__, wrapping
>>          GCC >=4.5's ability to specify a detailed deprecation message.
>
> That should probably go into a separate patch.

Do you think it can be lumped with the addition of __clang_has_extension,
or should each of those be separate patches?

zw

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/2] Add __clang_has_extension to sys/cdefs.h.
  2016-04-25  7:23   ` Florian Weimer
@ 2016-04-25 13:57     ` Zack Weinberg
  2016-04-26 13:48       ` Florian Weimer
  0 siblings, 1 reply; 14+ messages in thread
From: Zack Weinberg @ 2016-04-25 13:57 UTC (permalink / raw)
  To: Florian Weimer; +Cc: GNU C Library

On Mon, Apr 25, 2016 at 3:22 AM, Florian Weimer <fweimer@redhat.com> wrote:
> On 04/23/2016 01:05 AM, Zack Weinberg wrote:
>>
>>         * misc/sys/cdefs.h: New utility macro __clang_has_extension.
>
> I don't feel strongly about this, but the identifier looks like it's in the
> Clang namespace.  Perhaps use __glibc_clang_has_extension instead?

That's a good point, but I think the name __glibc_clang_has_extension is
far too clunky to tolerate.

Experimenting, clang treats __has_extension as an intrinsic *macro* --
for instance, #ifdef __has_extension is true.  So maybe we could just do

#ifndef __has_extension
#define __has_extension(...) 0
#endif

and that would be good enough? It seems consistent with the way
sys/cdefs.h handles macro wrappers for GCC extensions.

zw

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/2] Add __clang_has_extension to sys/cdefs.h.
  2016-04-25 13:57     ` Zack Weinberg
@ 2016-04-26 13:48       ` Florian Weimer
  2016-04-26 15:13         ` Paul Eggert
  0 siblings, 1 reply; 14+ messages in thread
From: Florian Weimer @ 2016-04-26 13:48 UTC (permalink / raw)
  To: Zack Weinberg; +Cc: GNU C Library

On 04/25/2016 03:57 PM, Zack Weinberg wrote:

> Experimenting, clang treats __has_extension as an intrinsic *macro* --
> for instance, #ifdef __has_extension is true.  So maybe we could just do
>
> #ifndef __has_extension
> #define __has_extension(...) 0
> #endif
>
> and that would be good enough?

This will confuse application that checks for the presence of 
__has_extension.  glibc should not provide compiler-defined macros 
coming from non-GNU compilers because it will be difficult to coordinate 
with these parties (it's sometimes even difficult with GCC).

Florian

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/2] Add __clang_has_extension to sys/cdefs.h.
  2016-04-26 13:48       ` Florian Weimer
@ 2016-04-26 15:13         ` Paul Eggert
  0 siblings, 0 replies; 14+ messages in thread
From: Paul Eggert @ 2016-04-26 15:13 UTC (permalink / raw)
  To: Florian Weimer, Zack Weinberg; +Cc: GNU C Library

On 04/26/2016 06:48 AM, Florian Weimer wrote:
>
> This will confuse application that checks for the presence of 
> __has_extension.

Yes. As an example of this sort of thing, GNU Emacs does this:

    #ifndef __has_attribute
    # define __has_attribute(a) __has_attribute_##a
    # define __has_attribute_alloc_size (4 < __GNUC__ + (3 <= 
__GNUC_MINOR__))
    # define __has_attribute_cleanup (3 < __GNUC__ + (4 <= __GNUC_MINOR__))
    ...

and this would stop working if Glibc sys/cdefs.h defined 
__has_attribute(x) to be 0 when compiling with GCC. This specific 
example is about __has_attribute and not __has_extension, but the same 
idea applies to __has_extension.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/2] Deprecate inclusion of sys/sysmacros.h by sys/types.h.
  2016-04-25 13:50     ` Zack Weinberg
@ 2016-04-28 22:05       ` Roland McGrath
  2016-05-10 14:13       ` Zack Weinberg
  1 sibling, 0 replies; 14+ messages in thread
From: Roland McGrath @ 2016-04-28 22:05 UTC (permalink / raw)
  To: Zack Weinberg; +Cc: Florian Weimer, GNU C Library

> >>          * misc/sys/cdefs.h: Add __attribute_deprecated_msg__, wrapping
> >>          GCC >=4.5's ability to specify a detailed deprecation message.
> >
> > That should probably go into a separate patch.
> 
> Do you think it can be lumped with the addition of __clang_has_extension,
> or should each of those be separate patches?

Please keep them separate.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/2] Add __clang_has_extension to sys/cdefs.h.
  2016-04-23 21:15 ` [PATCH 1/2] Add __clang_has_extension to sys/cdefs.h Zack Weinberg
  2016-04-25  7:23   ` Florian Weimer
@ 2016-04-28 22:16   ` Roland McGrath
  1 sibling, 0 replies; 14+ messages in thread
From: Roland McGrath @ 2016-04-28 22:16 UTC (permalink / raw)
  To: Zack Weinberg; +Cc: libc-alpha

I think this is a bad addition.  I don't think we want miscellaneous header
files to have Clang-specific #if checks.  What we really want is for header
files to do specific feature checks using some compiler-independent macros
defined by <sys/cdefs.h>.  This is also superior to the existing cases of
headers using __GNUC_PREREQ as a proxy for specific feature tests.

As Florian and Paul mentioned, new macros should avoid name space issues.
Just use the prefix __glibc_ on any new macro.

I think a generalized thing like __glibc_has_feature (foobar) would be
fine.  sys/cdefs.h can do a variety of macro magic things to map that to
what works in Clang and to __GNUC_PREREQ for GCC.  This is probably also
the best way to enable distros that backport features to their compilers to
update the corresponding conditionals easily, i.e. they can just patch
sys/cdefs.h in their glibc package to change some of these macro
definitions rather than dealing with the __GNUC_PREREQ mess throughout all
the headers.

You don't need to do the whole conversion for us, of course.  But look at
existing __GNUC_PREREQ tests and make sure that the scheme you come up with
will extend readily to cover all those cases.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/2] Deprecate inclusion of sys/sysmacros.h by sys/types.h.
  2016-04-25 13:50     ` Zack Weinberg
  2016-04-28 22:05       ` Roland McGrath
@ 2016-05-10 14:13       ` Zack Weinberg
  2016-05-10 14:22         ` Florian Weimer
  1 sibling, 1 reply; 14+ messages in thread
From: Zack Weinberg @ 2016-05-10 14:13 UTC (permalink / raw)
  To: Florian Weimer; +Cc: GNU C Library

On 04/25/2016 09:50 AM, Zack Weinberg wrote:
> On Mon, Apr 25, 2016 at 3:24 AM, Florian Weimer <fweimer@redhat.com> wrote:
>>
>> Why do we need these new functions?  Recent GCC has support for emitting
>> warnings from macros, if that's what you need.
> 
> I shall look into the warnings-from-macros feature; maybe it will get
> me out of having to use __REDIRECT.

Assuming the feature you were thinking of is

    _Pragma("GCC warning \"...\"")

it is not useful for this task, because _Pragma accepts only a _single_
string literal as its argument; you cannot use string literal
concatenation to assemble a message.  The C standard seems to think it's
good enough to be able to assemble a _Pragma directive as unquoted
tokens and then stringify it all in one go, e.g.

    #define _PRAGMA(whatever) _Pragma(#whatever)
    _PRAGMA(GCC warning "...")

... but that is also impractical in this case because the desired
warning message includes the names of macros.  I *might* be able to use
token-pasting with dummy empty arguments to shield everything from
expansion till just the right point, but it would be messy to the point
of illegibility, and this is already messy enough.

zw

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/2] Deprecate inclusion of sys/sysmacros.h by sys/types.h.
  2016-05-10 14:13       ` Zack Weinberg
@ 2016-05-10 14:22         ` Florian Weimer
  2016-05-13 12:32           ` Zack Weinberg
  0 siblings, 1 reply; 14+ messages in thread
From: Florian Weimer @ 2016-05-10 14:22 UTC (permalink / raw)
  To: Zack Weinberg; +Cc: GNU C Library

On 05/10/2016 04:13 PM, Zack Weinberg wrote:
> On 04/25/2016 09:50 AM, Zack Weinberg wrote:
>> On Mon, Apr 25, 2016 at 3:24 AM, Florian Weimer <fweimer@redhat.com> wrote:
>>>
>>> Why do we need these new functions?  Recent GCC has support for emitting
>>> warnings from macros, if that's what you need.
>>
>> I shall look into the warnings-from-macros feature; maybe it will get
>> me out of having to use __REDIRECT.
>
> Assuming the feature you were thinking of is
>
>      _Pragma("GCC warning \"...\"")
>
> it is not useful for this task, because _Pragma accepts only a _single_
> string literal as its argument; you cannot use string literal
> concatenation to assemble a message.

I'm not sure which compiler version you are using but with

#include <stdio.h>

#define warn1(msg) _Pragma (#msg)
#define warn(msg) warn1 (GCC warning msg)

#define SYMBOL warn ("SYMBOL is deprecated") 1

int
main (void)
{
   printf ("%d\n", SYMBOL);
   return 0;
}

and GCC 5.3, I get:

t.c: In function ‘main’:
t.c:11:13: warning: SYMBOL is deprecated
    printf ("%d\n", SYMBOL);
              ^

The caret diagnostic isn't great, but it's better than nothing.

Florian

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/2] Deprecate inclusion of sys/sysmacros.h by sys/types.h.
  2016-05-10 14:22         ` Florian Weimer
@ 2016-05-13 12:32           ` Zack Weinberg
  0 siblings, 0 replies; 14+ messages in thread
From: Zack Weinberg @ 2016-05-13 12:32 UTC (permalink / raw)
  To: Florian Weimer; +Cc: GNU C Library

On 05/10/2016 10:22 AM, Florian Weimer wrote:
> On 05/10/2016 04:13 PM, Zack Weinberg wrote:
>> On 04/25/2016 09:50 AM, Zack Weinberg wrote:
>>> On Mon, Apr 25, 2016 at 3:24 AM, Florian Weimer <fweimer@redhat.com>
>>> wrote:
>>>>
>>>> Why do we need these new functions?  Recent GCC has support for
>>>> emitting
>>>> warnings from macros, if that's what you need.
>>>
>>> I shall look into the warnings-from-macros feature; maybe it will get
>>> me out of having to use __REDIRECT.
>>
>> Assuming the feature you were thinking of is
>>
>>      _Pragma("GCC warning \"...\"")
>>
>> it is not useful for this task, because _Pragma accepts only a _single_
>> string literal as its argument; you cannot use string literal
>> concatenation to assemble a message.
> 
> I'm not sure which compiler version you are using but with
> 
> #include <stdio.h>
> 
> #define warn1(msg) _Pragma (#msg)
> #define warn(msg) warn1 (GCC warning msg)
> 
> #define SYMBOL warn ("SYMBOL is deprecated") 1

#define warn1(msg) _Pragma (#msg)
#define warn(msg) warn1 (GCC warning msg)
#define lengthy_explanation(name) \
  "This is a long explanation about why `" #name "' is deprecated."

#define SYMBOL warn(lengthy_explanation(SYMBOL)) 1

int main(void) { return SYMBOL; }

=>

test.c: In function ‘main’:
test.c:9:13: warning: This is a long explanation about why `
 int main(void) { return SYMBOL; }

And that is the point at which I gave up.
(https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71102)

zw

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2016-05-13 12:32 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-04-23 21:15 [PATCH 0/2] Revised: deprecate sys/sysmacros.h inclusion from sys/types.h Zack Weinberg
2016-04-23 21:15 ` [PATCH 2/2] Deprecate inclusion of sys/sysmacros.h by sys/types.h Zack Weinberg
2016-04-25  7:24   ` Florian Weimer
2016-04-25 13:50     ` Zack Weinberg
2016-04-28 22:05       ` Roland McGrath
2016-05-10 14:13       ` Zack Weinberg
2016-05-10 14:22         ` Florian Weimer
2016-05-13 12:32           ` Zack Weinberg
2016-04-23 21:15 ` [PATCH 1/2] Add __clang_has_extension to sys/cdefs.h Zack Weinberg
2016-04-25  7:23   ` Florian Weimer
2016-04-25 13:57     ` Zack Weinberg
2016-04-26 13:48       ` Florian Weimer
2016-04-26 15:13         ` Paul Eggert
2016-04-28 22:16   ` Roland McGrath

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).