This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: Use single bits/sem.h for all architectures
On 15/10/2018 08:15, Joseph Myers wrote:
> Here is a corrected version of this patch that properly uses
> __syscall_ulong_t for the padding around time fields as intended.
>
> Use single bits/sem.h for all architectures.
>
> The bits/sem.h headers for architectures using the Linux kernel vary
> in a few ways:
>
> * x32 uses __syscall_ulong_t instead of unsigned long int.
>
> * The x86 header uses padding after time fields unconditionally
> (including for both x86_64 ABIs), not just for 32-bit time (unlike
> in msqid_ds where there is only padding for 32-bit time). Because
> this padding is present for x32, and is __syscall_ulong_t there, it
> does have to be __syscall_ulong_t, not unsigned long int.
>
> * The MIPS header never uses padding around time fields, even when
> 32-bit (unlike in msqid_ds where it has endian-dependent padding for
> 32-bit time).
>
> * Some older 32-bit big-endian architectures have padding before
> rather than after time fields, although the preferred generic
> approach is padding after the time fields independent of endianness.
>
> (There are also insubstantial differences such as use of unsigned int
> for padding instead of unsigned long int, which makes no difference to
> layout since the padding fields using unsigned int are only present on
> 32-bit architectures.)
>
> For the first, __syscall_ulong_t can be used in the generic version as
> it's the same as unsigned long int everywhere except x32. For the
> other differences, this patch adds macros __SEM_PAD_BEFORE_TIME and
> __SEM_PAD_AFTER_TIME in a new bits/sem-pad.h header, so that header is
> the only one needing to be provided on architectures with differences
> in this area, and everything else can go in a single common bits/sem.h
> header.
>
> Tested for x86_64 and x86, and with build-many-glibcs.py.
>
> 2018-10-15 Joseph Myers <joseph@codesourcery.com>
>
> * sysdeps/unix/sysv/linux/Makefile (sysdep_headers): Add
> bits/sem-pad.h.
> * sysdeps/unix/sysv/linux/bits/sem.h: Include <bits/sem-pad.h>
> instead of <bits/wordsize.h>.
> (__SEM_PAD_TIME): New macro, depending on [__SEM_PAD_BEFORE_TIME]
> and [__SEM_PAD_AFTER_TIME].
> (struct semid_ds): Define time fields using __SEM_PAD_TIME. Use
> __syscall_ulong_t instead of unsigned long int.
> * sysdeps/unix/sysv/linux/bits/sem-pad.h: New file.
> * sysdeps/unix/sysv/linux/hppa/bits/sem-pad.h: Likewise.
> * sysdeps/unix/sysv/linux/mips/bits/sem-pad.h: Likewise.
> * sysdeps/unix/sysv/linux/powerpc/bits/sem-pad.h: Likewise.
> * sysdeps/unix/sysv/linux/sparc/bits/sem-pad.h: Likewise.
> * sysdeps/unix/sysv/linux/x86/bits/sem-pad.h: Likewise.
> * sysdeps/unix/sysv/linux/hppa/bits/sem.h: Remove.
> * sysdeps/unix/sysv/linux/mips/bits/sem.h: Likewise.
> * sysdeps/unix/sysv/linux/powerpc/bits/sem.h: Likewise.
> * sysdeps/unix/sysv/linux/sparc/bits/sem.h: Likewise.
> * sysdeps/unix/sysv/linux/x86/bits/sem.h: Likewise.
>
> diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
> index ff4535cdca..edb1d29bf3 100644
> --- a/sysdeps/unix/sysv/linux/Makefile
> +++ b/sysdeps/unix/sysv/linux/Makefile
> @@ -43,7 +43,7 @@ sysdep_headers += sys/mount.h sys/acct.h sys/sysctl.h \
> bits/siginfo-arch.h bits/siginfo-consts-arch.h \
> bits/procfs.h bits/procfs-id.h bits/procfs-extra.h \
> bits/procfs-prregset.h bits/mman-map-flags-generic.h \
> - bits/msq-pad.h
> + bits/msq-pad.h bits/sem-pad.h
>
> tests += tst-clone tst-clone2 tst-clone3 tst-fanotify tst-personality \
> tst-quota tst-sync_file_range tst-sysconf-iov_max tst-ttyname \
Ok.
> diff --git a/sysdeps/unix/sysv/linux/bits/sem-pad.h b/sysdeps/unix/sysv/linux/bits/sem-pad.h
> new file mode 100644
> index 0000000000..77979976bd
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/bits/sem-pad.h
> @@ -0,0 +1,31 @@
> +/* Define where padding goes in struct semid_ds. Generic version.
> + Copyright (C) 2018 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_SEM_H
> +# error "Never use <bits/sem-pad.h> directly; include <sys/sem.h> instead."
> +#endif
> +
> +#include <bits/wordsize.h>
> +
> +/* On most architectures, padding goes after time fields for 32-bit
> + systems and is omitted for 64-bit systems. Some architectures pad
> + before time fields instead, or omit padding despite being 32-bit,
> + or include it despite being 64-bit. */
> +
> +#define __SEM_PAD_AFTER_TIME (__WORDSIZE == 32)
> +#define __SEM_PAD_BEFORE_TIME 0
Since we currently we pass the user-defined semid_ds directly to kernel on
semctl, I think it is worth to add generic Linux UAPI expects news ports to
follow kernel semid64_ds layout:
- 64 bit architectures uses 64-bit __kernel_time_t (so no padding)
- 32 bit architectures have a pair of unsigned long values and on big-endian
system the padding is on wrong place dure historic reasons.
> diff --git a/sysdeps/unix/sysv/linux/bits/sem.h b/sysdeps/unix/sysv/linux/bits/sem.h
> index bf6d797080..d6e879ea0f 100644
> --- a/sysdeps/unix/sysv/linux/bits/sem.h
> +++ b/sysdeps/unix/sysv/linux/bits/sem.h
> @@ -20,7 +20,7 @@
> #endif
>
> #include <sys/types.h>
> -#include <bits/wordsize.h>
> +#include <bits/sem-pad.h>
>
> /* Flags for `semop'. */
> #define SEM_UNDO 0x1000 /* undo the operation on exit */
> @@ -35,21 +35,26 @@
> #define SETALL 17 /* set all semval's */
>
>
> +#if __SEM_PAD_BEFORE_TIME
> +# define __SEM_PAD_TIME(NAME, RES) \
> + __syscall_ulong_t __glibc_reserved ## RES; __time_t NAME
> +#elif __SEM_PAD_AFTER_TIME
> +# define __SEM_PAD_TIME(NAME, RES) \
> + __time_t NAME; __syscall_ulong_t __glibc_reserved ## RES
> +#else
> +# define __SEM_PAD_TIME(NAME, RES) \
> + __time_t NAME
> +#endif
> +
I think also we should comment that if ABI uses a different type than
unsigned long for __syscall_ulong_t it should re-define semid_ds.
> /* Data structure describing a set of semaphores. */
> struct semid_ds
> {
> struct ipc_perm sem_perm; /* operation permission struct */
> - __time_t sem_otime; /* last semop() time */
> -#if __WORDSIZE == 32
> - unsigned long int __glibc_reserved1;
> -#endif
> - __time_t sem_ctime; /* last time changed by semctl() */
> -#if __WORDSIZE == 32
> - unsigned long int __glibc_reserved2;
> -#endif
> - unsigned long int sem_nsems; /* number of semaphores in set */
> - unsigned long int __glibc_reserved3;
> - unsigned long int __glibc_reserved4;
> + __SEM_PAD_TIME (sem_otime, 1); /* last semop() time */
> + __SEM_PAD_TIME (sem_ctime, 2); /* last time changed by semctl() */
> + __syscall_ulong_t sem_nsems; /* number of semaphores in set */
> + __syscall_ulong_t __glibc_reserved3;
> + __syscall_ulong_t __glibc_reserved4;
> };
>
> /* The user should define a union like the following to use it for arguments
> diff --git a/sysdeps/unix/sysv/linux/hppa/bits/sem-pad.h b/sysdeps/unix/sysv/linux/hppa/bits/sem-pad.h
> new file mode 100644
> index 0000000000..a938c2c92b
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/hppa/bits/sem-pad.h
> @@ -0,0 +1,26 @@
> +/* Define where padding goes in struct semid_ds. HPPA version.
> + Copyright (C) 2018 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_SEM_H
> +# error "Never use <bits/sem-pad.h> directly; include <sys/sem.h> instead."
> +#endif
> +
> +#include <bits/wordsize.h>
> +
> +#define __SEM_PAD_AFTER_TIME 0
> +#define __SEM_PAD_BEFORE_TIME (__WORDSIZE == 32)
Ok.
> diff --git a/sysdeps/unix/sysv/linux/hppa/bits/sem.h b/sysdeps/unix/sysv/linux/hppa/bits/sem.h
> deleted file mode 100644
> index 12b849ae79..0000000000
> --- a/sysdeps/unix/sysv/linux/hppa/bits/sem.h
> +++ /dev/null
> @@ -1,92 +0,0 @@
> -/* Copyright (C) 1995-2018 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_SEM_H
> -# error "Never include <bits/sem.h> directly; use <sys/sem.h> instead."
> -#endif
> -
> -#include <sys/types.h>
> -#include <bits/wordsize.h>
> -
> -/* Flags for `semop'. */
> -#define SEM_UNDO 0x1000 /* undo the operation on exit */
> -
> -/* Commands for `semctl'. */
> -#define GETPID 11 /* get sempid */
> -#define GETVAL 12 /* get semval */
> -#define GETALL 13 /* get all semval's */
> -#define GETNCNT 14 /* get semncnt */
> -#define GETZCNT 15 /* get semzcnt */
> -#define SETVAL 16 /* set semval */
> -#define SETALL 17 /* set all semval's */
> -
> -
> -/* Data structure describing a set of semaphores. */
> -struct semid_ds
> -{
> - struct ipc_perm sem_perm; /* operation permission struct */
> -#if __WORDSIZE == 32
> - unsigned int __pad1;
> -#endif
> - __time_t sem_otime; /* last semop() time */
> -#if __WORDSIZE == 32
> - unsigned int __pad2;
> -#endif
> - __time_t sem_ctime; /* last time changed by semctl() */
> - unsigned long int sem_nsems; /* number of semaphores in set */
> - unsigned long int __glibc_reserved1;
> - unsigned long int __glibc_reserved2;
> -};
> -
> -/* The user should define a union like the following to use it for arguments
> - for `semctl'.
> -
> - union semun
> - {
> - int val; <= value for SETVAL
> - struct semid_ds *buf; <= buffer for IPC_STAT & IPC_SET
> - unsigned short int *array; <= array for GETALL & SETALL
> - struct seminfo *__buf; <= buffer for IPC_INFO
> - };
> -
> - Previous versions of this file used to define this union but this is
> - incorrect. One can test the macro _SEM_SEMUN_UNDEFINED to see whether
> - one must define the union or not. */
> -#define _SEM_SEMUN_UNDEFINED 1
> -
> -#ifdef __USE_MISC
> -
> -/* ipcs ctl cmds */
> -# define SEM_STAT 18
> -# define SEM_INFO 19
> -# define SEM_STAT_ANY 20
> -
> -struct seminfo
> -{
> - int semmap;
> - int semmni;
> - int semmns;
> - int semmnu;
> - int semmsl;
> - int semopm;
> - int semume;
> - int semusz;
> - int semvmx;
> - int semaem;
> -};
> -
> -#endif /* __USE_MISC */
Ok.
> diff --git a/sysdeps/unix/sysv/linux/mips/bits/sem-pad.h b/sysdeps/unix/sysv/linux/mips/bits/sem-pad.h
> new file mode 100644
> index 0000000000..61f27cbc8f
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/mips/bits/sem-pad.h
> @@ -0,0 +1,24 @@
> +/* Define where padding goes in struct semid_ds. MIPS version.
> + Copyright (C) 2018 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_SEM_H
> +# error "Never use <bits/sem-pad.h> directly; include <sys/sem.h> instead."
> +#endif
> +
> +#define __SEM_PAD_AFTER_TIME 0
> +#define __SEM_PAD_BEFORE_TIME 0
Ok.
> diff --git a/sysdeps/unix/sysv/linux/mips/bits/sem.h b/sysdeps/unix/sysv/linux/mips/bits/sem.h
> deleted file mode 100644
> index d218cf4f92..0000000000
> --- a/sysdeps/unix/sysv/linux/mips/bits/sem.h
> +++ /dev/null
> @@ -1,85 +0,0 @@
> -/* Copyright (C) 1995-2018 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_SEM_H
> -# error "Never include <bits/sem.h> directly; use <sys/sem.h> instead."
> -#endif
> -
> -#include <sys/types.h>
> -
> -/* Flags for `semop'. */
> -#define SEM_UNDO 0x1000 /* undo the operation on exit */
> -
> -/* Commands for `semctl'. */
> -#define GETPID 11 /* get sempid */
> -#define GETVAL 12 /* get semval */
> -#define GETALL 13 /* get all semval's */
> -#define GETNCNT 14 /* get semncnt */
> -#define GETZCNT 15 /* get semzcnt */
> -#define SETVAL 16 /* set semval */
> -#define SETALL 17 /* set all semval's */
> -
> -
> -/* Data structure describing a set of semaphores. */
> -struct semid_ds
> -{
> - struct ipc_perm sem_perm; /* operation permission struct */
> - __time_t sem_otime; /* last semop() time */
> - __time_t sem_ctime; /* last time changed by semctl() */
> - unsigned long int sem_nsems; /* number of semaphores in set */
> - unsigned long int __glibc_reserved1;
> - unsigned long int __glibc_reserved2;
> -};
> -
> -/* The user should define a union like the following to use it for arguments
> - for `semctl'.
> -
> - union semun
> - {
> - int val; <= value for SETVAL
> - struct semid_ds *buf; <= buffer for IPC_STAT & IPC_SET
> - unsigned short int *array; <= array for GETALL & SETALL
> - struct seminfo *__buf; <= buffer for IPC_INFO
> - };
> -
> - Previous versions of this file used to define this union but this is
> - incorrect. One can test the macro _SEM_SEMUN_UNDEFINED to see whether
> - one must define the union or not. */
> -#define _SEM_SEMUN_UNDEFINED 1
> -
> -#ifdef __USE_MISC
> -
> -/* ipcs ctl cmds */
> -# define SEM_STAT 18
> -# define SEM_INFO 19
> -# define SEM_STAT_ANY 20
> -
> -struct seminfo
> -{
> - int semmap;
> - int semmni;
> - int semmns;
> - int semmnu;
> - int semmsl;
> - int semopm;
> - int semume;
> - int semusz;
> - int semvmx;
> - int semaem;
> -};
> -
> -#endif /* __USE_MISC */
Ok.
> diff --git a/sysdeps/unix/sysv/linux/powerpc/bits/sem-pad.h b/sysdeps/unix/sysv/linux/powerpc/bits/sem-pad.h
> new file mode 100644
> index 0000000000..d4c9a93956
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/powerpc/bits/sem-pad.h
> @@ -0,0 +1,26 @@
> +/* Define where padding goes in struct semid_ds. PowerPC version.
> + Copyright (C) 2018 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_SEM_H
> +# error "Never use <bits/sem-pad.h> directly; include <sys/sem.h> instead."
> +#endif
> +
> +#include <bits/wordsize.h>
> +
> +#define __SEM_PAD_AFTER_TIME 0
> +#define __SEM_PAD_BEFORE_TIME (__WORDSIZE == 32)
Ok.
> diff --git a/sysdeps/unix/sysv/linux/powerpc/bits/sem.h b/sysdeps/unix/sysv/linux/powerpc/bits/sem.h
> deleted file mode 100644
> index 27b026cf61..0000000000
> --- a/sysdeps/unix/sysv/linux/powerpc/bits/sem.h
> +++ /dev/null
> @@ -1,91 +0,0 @@
> -/* Copyright (C) 1995-2018 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_SEM_H
> -# error "Never include <bits/sem.h> directly; use <sys/sem.h> instead."
> -#endif
> -
> -#include <sys/types.h>
> -
> -/* Flags for `semop'. */
> -#define SEM_UNDO 0x1000 /* undo the operation on exit */
> -
> -/* Commands for `semctl'. */
> -#define GETPID 11 /* get sempid */
> -#define GETVAL 12 /* get semval */
> -#define GETALL 13 /* get all semval's */
> -#define GETNCNT 14 /* get semncnt */
> -#define GETZCNT 15 /* get semzcnt */
> -#define SETVAL 16 /* set semval */
> -#define SETALL 17 /* set all semval's */
> -
> -
> -/* Data structure describing a set of semaphores. */
> -struct semid_ds
> -{
> - struct ipc_perm sem_perm; /* operation permission struct */
> -#if __WORDSIZE == 32
> - unsigned int __glibc_reserved1;
> -#endif
> - __time_t sem_otime; /* last semop() time */
> -#if __WORDSIZE == 32
> - unsigned int __glibc_reserved2;
> -#endif
> - __time_t sem_ctime; /* last time changed by semctl() */
> - unsigned long int sem_nsems; /* number of semaphores in set */
> - unsigned long __glibc_reserved3;
> - unsigned long __glibc_reserved4;
> -};
> -
> -/* The user should define a union like the following to use it for arguments
> - for `semctl'.
> -
> - union semun
> - {
> - int val; <= value for SETVAL
> - struct semid_ds *buf; <= buffer for IPC_STAT & IPC_SET
> - unsigned short int *array; <= array for GETALL & SETALL
> - struct seminfo *__buf; <= buffer for IPC_INFO
> - };
> -
> - Previous versions of this file used to define this union but this is
> - incorrect. One can test the macro _SEM_SEMUN_UNDEFINED to see whether
> - one must define the union or not. */
> -#define _SEM_SEMUN_UNDEFINED 1
> -
> -#ifdef __USE_MISC
> -
> -/* ipcs ctl cmds */
> -# define SEM_STAT 18
> -# define SEM_INFO 19
> -# define SEM_STAT_ANY 20
> -
> -struct seminfo
> -{
> - int semmap;
> - int semmni;
> - int semmns;
> - int semmnu;
> - int semmsl;
> - int semopm;
> - int semume;
> - int semusz;
> - int semvmx;
> - int semaem;
> -};
> -
> -#endif /* __USE_MISC */
Ok.
> diff --git a/sysdeps/unix/sysv/linux/sparc/bits/sem-pad.h b/sysdeps/unix/sysv/linux/sparc/bits/sem-pad.h
> new file mode 100644
> index 0000000000..b85f6b70a2
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/sparc/bits/sem-pad.h
> @@ -0,0 +1,26 @@
> +/* Define where padding goes in struct semid_ds. SPARC version.
> + Copyright (C) 2018 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_SEM_H
> +# error "Never use <bits/sem-pad.h> directly; include <sys/sem.h> instead."
> +#endif
> +
> +#include <bits/wordsize.h>
> +
> +#define __SEM_PAD_AFTER_TIME 0
> +#define __SEM_PAD_BEFORE_TIME (__WORDSIZE == 32)
Ok.
> diff --git a/sysdeps/unix/sysv/linux/sparc/bits/sem.h b/sysdeps/unix/sysv/linux/sparc/bits/sem.h
> deleted file mode 100644
> index f5b2654eec..0000000000
> --- a/sysdeps/unix/sysv/linux/sparc/bits/sem.h
> +++ /dev/null
> @@ -1,92 +0,0 @@
> -/* Copyright (C) 1995-2018 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_SEM_H
> -# error "Never include <bits/sem.h> directly; use <sys/sem.h> instead."
> -#endif
> -
> -#include <sys/types.h>
> -#include <bits/wordsize.h>
> -
> -/* Flags for `semop'. */
> -#define SEM_UNDO 0x1000 /* undo the operation on exit */
> -
> -/* Commands for `semctl'. */
> -#define GETPID 11 /* get sempid */
> -#define GETVAL 12 /* get semval */
> -#define GETALL 13 /* get all semval's */
> -#define GETNCNT 14 /* get semncnt */
> -#define GETZCNT 15 /* get semzcnt */
> -#define SETVAL 16 /* set semval */
> -#define SETALL 17 /* set all semval's */
> -
> -
> -/* Data structure describing a set of semaphores. */
> -struct semid_ds
> -{
> - struct ipc_perm sem_perm; /* operation permission struct */
> -#if __WORDSIZE == 32
> - unsigned int __pad1;
> -#endif
> - __time_t sem_otime; /* last semop() time */
> -#if __WORDSIZE == 32
> - unsigned int __pad2;
> -#endif
> - __time_t sem_ctime; /* last time changed by semctl() */
> - unsigned long int sem_nsems; /* number of semaphores in set */
> - unsigned long int __glibc_reserved1;
> - unsigned long int __glibc_reserved2;
> -};
> -
> -/* The user should define a union like the following to use it for arguments
> - for `semctl'.
> -
> - union semun
> - {
> - int val; <= value for SETVAL
> - struct semid_ds *buf; <= buffer for IPC_STAT & IPC_SET
> - unsigned short int *array; <= array for GETALL & SETALL
> - struct seminfo *__buf; <= buffer for IPC_INFO
> - };
> -
> - Previous versions of this file used to define this union but this is
> - incorrect. One can test the macro _SEM_SEMUN_UNDEFINED to see whether
> - one must define the union or not. */
> -#define _SEM_SEMUN_UNDEFINED 1
> -
> -#ifdef __USE_MISC
> -
> -/* ipcs ctl cmds */
> -# define SEM_STAT 18
> -# define SEM_INFO 19
> -# define SEM_STAT_ANY 20
> -
> -struct seminfo
> -{
> - int semmap;
> - int semmni;
> - int semmns;
> - int semmnu;
> - int semmsl;
> - int semopm;
> - int semume;
> - int semusz;
> - int semvmx;
> - int semaem;
> -};
> -
> -#endif /* __USE_MISC */
Ok.
> diff --git a/sysdeps/unix/sysv/linux/x86/bits/sem-pad.h b/sysdeps/unix/sysv/linux/x86/bits/sem-pad.h
> new file mode 100644
> index 0000000000..625f8ed21e
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/x86/bits/sem-pad.h
> @@ -0,0 +1,24 @@
> +/* Define where padding goes in struct semid_ds. x86 version.
> + Copyright (C) 2018 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_SEM_H
> +# error "Never use <bits/sem-pad.h> directly; include <sys/sem.h> instead."
> +#endif
> +
> +#define __SEM_PAD_AFTER_TIME 1
> +#define __SEM_PAD_BEFORE_TIME 0
Ok.
> diff --git a/sysdeps/unix/sysv/linux/x86/bits/sem.h b/sysdeps/unix/sysv/linux/x86/bits/sem.h
> deleted file mode 100644
> index 6771966a06..0000000000
> --- a/sysdeps/unix/sysv/linux/x86/bits/sem.h
> +++ /dev/null
> @@ -1,87 +0,0 @@
> -/* Copyright (C) 2002-2018 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_SEM_H
> -# error "Never include <bits/sem.h> directly; use <sys/sem.h> instead."
> -#endif
> -
> -#include <sys/types.h>
> -
> -/* Flags for `semop'. */
> -#define SEM_UNDO 0x1000 /* undo the operation on exit */
> -
> -/* Commands for `semctl'. */
> -#define GETPID 11 /* get sempid */
> -#define GETVAL 12 /* get semval */
> -#define GETALL 13 /* get all semval's */
> -#define GETNCNT 14 /* get semncnt */
> -#define GETZCNT 15 /* get semzcnt */
> -#define SETVAL 16 /* set semval */
> -#define SETALL 17 /* set all semval's */
> -
> -
> -/* Data structure describing a set of semaphores. */
> -struct semid_ds
> -{
> - struct ipc_perm sem_perm; /* operation permission struct */
> - __time_t sem_otime; /* last semop() time */
> - __syscall_ulong_t __glibc_reserved1;
> - __time_t sem_ctime; /* last time changed by semctl() */
> - __syscall_ulong_t __glibc_reserved2;
> - __syscall_ulong_t sem_nsems; /* number of semaphores in set */
> - __syscall_ulong_t __glibc_reserved3;
> - __syscall_ulong_t __glibc_reserved4;
> -};
> -
> -/* The user should define a union like the following to use it for arguments
> - for `semctl'.
> -
> - union semun
> - {
> - int val; <= value for SETVAL
> - struct semid_ds *buf; <= buffer for IPC_STAT & IPC_SET
> - unsigned short int *array; <= array for GETALL & SETALL
> - struct seminfo *__buf; <= buffer for IPC_INFO
> - };
> -
> - Previous versions of this file used to define this union but this is
> - incorrect. One can test the macro _SEM_SEMUN_UNDEFINED to see whether
> - one must define the union or not. */
> -#define _SEM_SEMUN_UNDEFINED 1
> -
> -#ifdef __USE_MISC
> -
> -/* ipcs ctl cmds */
> -# define SEM_STAT 18
> -# define SEM_INFO 19
> -# define SEM_STAT_ANY 20
> -
> -struct seminfo
> -{
> - int semmap;
> - int semmni;
> - int semmns;
> - int semmnu;
> - int semmsl;
> - int semopm;
> - int semume;
> - int semusz;
> - int semvmx;
> - int semaem;
> -};
> -
> -#endif /* __USE_MISC */
>
Ok.