diff options
| author | Zack Weinberg <zackw@panix.com> | 2016-04-28 12:29:55 -0400 |
|---|---|---|
| committer | Zack Weinberg <zackw@panix.com> | 2016-08-03 15:23:04 -0400 |
| commit | 63eb8df85a17f7f966d4daa4cf44c8e956636a86 (patch) | |
| tree | 793529ad978b79909ab073297db2515d3e08118b | |
| parent | cab4d74b01320670f57dcf356ff89256f4d2fc12 (diff) | |
| download | glibc-63eb8df85a17f7f966d4daa4cf44c8e956636a86.tar.xz glibc-63eb8df85a17f7f966d4daa4cf44c8e956636a86.zip | |
Minimize sysdeps code involved in defining major/minor/makedev.
Presently sys/sysmacros.h is entirely defined in sysdeps. This would
mean that the deprecation logic coming up in the next patch would have
to be written twice (in generic/ and unix/sysv/linux/). To avoid that,
hoist all but the unavoidably system-dependent logic to misc/, leaving a
bits/ header behind. This also promotes the Linux-specific encoding of
dev_t, which accommodates 32-bit major and minor numbers in a 64-bit dev_t,
to generic, as glibc's dev_t is always 64 bits wide.
The former Linux implementation used inline functions to avoid evaluating
arguments more than once. After this change, all platforms use inline
functions, which means that three new symbols are added to the generic ABI.
(These symbols are in the user namespace, which is how they have always
been on Linux. They begin with "gnu_dev_", so collisions with user code
are pretty unlikely.)
New ports henceforth need only provide a bits/sysmacros.h defining
internal macros __SYSMACROS_{DECLARE,DEFINE}_{MAJOR,MINOR,MAKEDEV}.
This is only necessary if the kernel encoding is incompatible with
the now-generic encoding (for instance, it would be necessary for
FreeBSD).
While I was at it, I added a basic round-trip test for these functions.
* sysdeps/generic/sys/sysmacros.h: Delete file.
* sysdeps/unix/sysv/linux/makedev.c: Delete file.
* sysdeps/unix/sysv/linux/sys/sysmacros.h: Move file ...
* bits/sysmacros.h: ... here; this encoding is now the generic
encoding. Now defines only the following macros:
__SYSMACROS_DECLARE_MAJOR, __SYSMACROS_DEFINE_MAJOR,
__SYSMACROS_DECLARE_MINOR, __SYSMACROS_DEFINE_MINOR,
__SYSMACROS_DECLARE_MAKEDEV, __SYSMACROS_DEFINE_MAKEDEV.
* misc/sys/sysmacros.h, misc/makedev.c: New files that use
bits/sysmacros.h and the above new macros to generate the
public implementations of major, minor, and makedev.
* misc/tst-makedev.c: New test.
* include/sys/sysmacros.h: New wrapper.
* misc/Makefile (headers): Add sys/sysmacros.h, bits/sysmacros.h.
(routines): Add makedev.
(tests): Add tst-makedev.
* misc/Versions [GLIBC_2.25]: Add gnu_dev_major, gnu_dev_minor,
gnu_dev_makedev.
* posix/Makefile (headers): Remove sys/sysmacros.h.
* sysdeps/unix/sysv/linux/Makefile (sysdep_routines): Remove makedev.
* sysdeps/arm/nacl/libc.abilist: Add GLIBC_2.25,
gnu_dev_major, gnu_dev_makedev, gnu_dev_minor.
* 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.25.
41 files changed, 349 insertions, 119 deletions
@@ -1,5 +1,60 @@ 2016-08-03 Zack Weinberg <zackw@panix.com> + * sysdeps/generic/sys/sysmacros.h: Delete file. + * sysdeps/unix/sysv/linux/makedev.c: Delete file. + * sysdeps/unix/sysv/linux/sys/sysmacros.h: Move file ... + * bits/sysmacros.h: ... here; this encoding is now the generic + encoding. Now defines only the following macros: + __SYSMACROS_DECLARE_MAJOR, __SYSMACROS_DEFINE_MAJOR, + __SYSMACROS_DECLARE_MINOR, __SYSMACROS_DEFINE_MINOR, + __SYSMACROS_DECLARE_MAKEDEV, __SYSMACROS_DEFINE_MAKEDEV. + + * misc/sys/sysmacros.h, misc/makedev.c: New files that use + bits/sysmacros.h and the above new macros to generate the + public implementations of major, minor, and makedev. + * misc/tst-makedev.c: New test. + * include/sys/sysmacros.h: New wrapper. + + * misc/Makefile (headers): Add sys/sysmacros.h, bits/sysmacros.h. + (routines): Add makedev. + (tests): Add tst-makedev. + * misc/Versions [GLIBC_2.25]: Add gnu_dev_major, gnu_dev_minor, + gnu_dev_makedev. + * posix/Makefile (headers): Remove sys/sysmacros.h. + * sysdeps/unix/sysv/linux/Makefile (sysdep_routines): Remove makedev. + + * sysdeps/arm/nacl/libc.abilist: Add GLIBC_2.25, + gnu_dev_major, gnu_dev_makedev, gnu_dev_minor. + * 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.25. + * include/features.h (__glibc_clang_prereq): New macro. * misc/sys/cdefs.h (__glibc_clang_has_extension) (__attribute_deprecated_msg__): New macros. diff --git a/bits/sysmacros.h b/bits/sysmacros.h new file mode 100644 index 0000000000..e2c0bc2f65 --- /dev/null +++ b/bits/sysmacros.h @@ -0,0 +1,74 @@ +/* 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 +# error "Never include <bits/sysmacros.h> directly; use <sys/sysmacros.h> instead." +#endif + +/* dev_t in glibc is a 64-bit quantity, with 32-bit major and minor numbers. + Our default encoding is MMMM Mmmm mmmM MMmm, where M is a hex digit of + the major number and m is a hex digit of the minor number. This is + downward compatible with legacy systems where dev_t is 16 bits wide, + encoded as MMmm. It is also downward compatible with the Linux kernel, + which (as of 2016) uses 32-bit dev_t, encoded as mmmM MMmm. + + Systems that use an incompatible encoding for dev_t should override this + file in the appropriate sysdeps subdirectory. */ + +#define __SYSMACROS_DECLARE_MAJOR(DECL_TEMPL) \ + DECL_TEMPL(unsigned int, major, (__dev_t __dev)) + +#define __SYSMACROS_DEFINE_MAJOR(DECL_TEMPL) \ + __SYSMACROS_DECLARE_MAJOR (DECL_TEMPL) \ + { \ + unsigned int __major; \ + __major = ((__dev & (__dev_t) 0x00000000000fff00u) >> 8); \ + __major |= ((__dev & (__dev_t) 0xfffff00000000000u) >> 32); \ + return __major; \ + } + +#define __SYSMACROS_DECLARE_MINOR(DECL_TEMPL) \ + DECL_TEMPL(unsigned int, minor, (__dev_t __dev)) + +#define __SYSMACROS_DEFINE_MINOR(DECL_TEMPL) \ + __SYSMACROS_DECLARE_MINOR (DECL_TEMPL) \ + { \ + unsigned int __minor; \ + __minor = ((__dev & (__dev_t) 0x00000000000000ffu) >> 0); \ + __minor |= ((__dev & (__dev_t) 0x00000ffffff00000u) >> 12); \ + return __minor; \ + } + +#define __SYSMACROS_DECLARE_MAKEDEV(DECL_TEMPL) \ + DECL_TEMPL(__dev_t, makedev, (unsigned int __major, unsigned int __minor)) + +#define __SYSMACROS_DEFINE_MAKEDEV(DECL_TEMPL) \ + __SYSMACROS_DECLARE_MAKEDEV (DECL_TEMPL) \ + { \ + __dev_t __dev; \ + __dev = (((__dev_t) (__major & 0x00000fffu)) << 8); \ + __dev |= (((__dev_t) (__major & 0xfffff000u)) << 32); \ + __dev |= (((__dev_t) (__minor & 0x000000ffu)) << 0); \ + __dev |= (((__dev_t) (__minor & 0xffffff00u)) << 12); \ + return __dev; \ + } + +#endif /* bits/sysmacros.h */ diff --git a/include/sys/sysmacros.h b/include/sys/sysmacros.h new file mode 100644 index 0000000000..87813c5b53 --- /dev/null +++ b/include/sys/sysmacros.h @@ -0,0 +1 @@ +#include <misc/sys/sysmacros.h> diff --git a/misc/Makefile b/misc/Makefile index 56e20ce521..3d2ebb8e45 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 @@ -78,7 +79,7 @@ gpl2lgpl := error.c error.h tests := tst-dirname tst-tsearch tst-fdset tst-efgcvt tst-mntent tst-hsearch \ tst-error1 tst-pselect tst-insremque tst-mntent2 bug-hsearch1 \ tst-mntent-blank-corrupt tst-mntent-blank-passno bug18240 \ - tst-preadvwritev tst-preadvwritev64 + tst-preadvwritev tst-preadvwritev64 tst-makedev ifeq ($(run-built-tests),yes) tests-special += $(objpfx)tst-error1-mem.out endif diff --git a/misc/Versions b/misc/Versions index 671f4870e9..f2c90fffda 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.25 { + gnu_dev_major; gnu_dev_minor; gnu_dev_makedev; + } GLIBC_PRIVATE { __madvise; __mktemp; diff --git a/sysdeps/unix/sysv/linux/makedev.c b/misc/makedev.c index 68c18ca333..7303fb67a2 100644 --- a/sysdeps/unix/sysv/linux/makedev.c +++ b/misc/makedev.c @@ -16,25 +16,15 @@ License along with the GNU C Library; if not, see <http://www.gnu.org/licenses/>. */ -#include <endian.h> -#include <sys/sysmacros.h> +#include <features.h> -unsigned int -gnu_dev_major (unsigned long long int dev) -{ - return ((dev >> 8) & 0xfff) | ((unsigned int) (dev >> 32) & ~0xfff); -} +#undef __USE_EXTERN_INLINES +#define __SYSMACROS_NEED_IMPLEMENTATION +#include <sys/sysmacros.h> -unsigned int -gnu_dev_minor (unsigned long long int dev) -{ - return (dev & 0xff) | ((unsigned int) (dev >> 12) & ~0xff); -} +#define OUT_OF_LINE_IMPL_TEMPL(rtype, name, proto) \ + rtype gnu_dev_##name proto -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)); -} +__SYSMACROS_DEFINE_MAJOR(OUT_OF_LINE_IMPL_TEMPL) +__SYSMACROS_DEFINE_MINOR(OUT_OF_LINE_IMPL_TEMPL) +__SYSMACROS_DEFINE_MAKEDEV(OUT_OF_LINE_IMPL_TEMPL) diff --git a/misc/sys/sysmacros.h b/misc/sys/sysmacros.h new file mode 100644 index 0000000000..dc2eb837a1 --- /dev/null +++ b/misc/sys/sysmacros.h @@ -0,0 +1,64 @@ +/* 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 +#define _SYS_SYSMACROS_H 1 + +#include <features.h> +#include <bits/types.h> +#include <bits/sysmacros.h> + +#define __SYSMACROS_DECL_TEMPL(rtype, name, proto) \ + extern rtype gnu_dev_##name proto __THROW __attribute_const__; + +#define __SYSMACROS_IMPL_TEMPL(rtype, name, proto) \ + __extension__ __extern_inline __attribute_const__ rtype \ + __NTH (gnu_dev_##name proto) + +__BEGIN_DECLS + +__SYSMACROS_DECLARE_MAJOR (__SYSMACROS_DECL_TEMPL) +__SYSMACROS_DECLARE_MINOR (__SYSMACROS_DECL_TEMPL) +__SYSMACROS_DECLARE_MAKEDEV (__SYSMACROS_DECL_TEMPL) + |
