diff options
| author | Joseph Myers <joseph@codesourcery.com> | 2017-08-30 22:02:04 +0000 |
|---|---|---|
| committer | Joseph Myers <joseph@codesourcery.com> | 2017-08-30 22:02:04 +0000 |
| commit | 4fa9b3bfe6759c82beb4b043a54a3598ca467289 (patch) | |
| tree | 0ea79808d3ccd29e28b254e6b6cfcd0c01b835cb | |
| parent | 5898f4548efdcd7c0fd437a74eeb80facc51a117 (diff) | |
| download | glibc-4fa9b3bfe6759c82beb4b043a54a3598ca467289.tar.xz glibc-4fa9b3bfe6759c82beb4b043a54a3598ca467289.zip | |
Fix mcontext_t sigcontext namespace (bug 21457).
This patch completes the ucontext.h namespace fixes by fixing issues
related to the use of struct sigcontext as mcontext_t, and inclusion
of <bits/sigcontext.h> even when struct sigcontext is not so used.
Inclusion of <bits/sigcontext.h> by <sys/ucontext.h> is removed; the
way to get the sigcontext structure is by including <signal.h> (in a
context where __USE_MISC is defined); the sysdeps/generic version of
sys/ucontext.h keeps the inclusion by necessity, with a comment about
how this is not namespace-clean, but the only configuration that used
it, MicroBlaze, gets its own version of the header in this patch.
Where mcontext_t was typedefed to struct sigcontext, the contents of
struct sigcontext are inserted (with appropriate namespace handling to
prefix fields with __ when __USE_MISC is not defined); review should
check that this has been done correctly in each case, whether the
definition of struct sigcontext comes from glibc headers or from the
Linux kernel. This changes C++ name mangling on affected
architectures (which do not include x86_64/x86).
Tested for x86_64, and with build-many-glibcs.py.
2017-08-14 Joseph Myers <joseph@codesourcery.com>
[BZ #21457]
* sysdeps/arm/sys/ucontext.h: Do not include <bits/sigcontext.h>.
* sysdeps/generic/sys/ucontext.h: Add comment about use of struct
sigcontext and namespace requirements.
* sysdeps/i386/sys/ucontext.h: Do not include <bits/sigcontext.h>.
* sysdeps/m68k/sys/ucontext.h: Likewise.
* sysdeps/mips/sys/ucontext.h: Likewise. Include <bits/types.h>.
* sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h: Do not include
<bits/sigcontext.h>.
(__ctx): Define earlier.
(mcontext_t): Define structure contents rather than using struct
sigcontext.
* sysdeps/unix/sysv/linux/aarch64/ucontext_i.sym (oEXTENSION): Use
__glibc_reserved1 instead of __reserved.
* sysdeps/unix/sysv/linux/alpha/sys/ucontext.h: Do not include
<bits/sigcontext.h>.
(__ctx): Define earlier.
(mcontext_t): Define structure contents rather than using struct
sigcontext.
* sysdeps/unix/sysv/linux/alpha/ucontext-offsets.sym: Use
mcontext_t instead of struct sigcontext.
* sysdeps/unix/sysv/linux/arm/sys/ucontext.h: Do not include
<bits/sigcontext.h>.
(__ctx): Define earlier.
(mcontext_t): Define structure contents rather than using struct
sigcontext.
* sysdeps/unix/sysv/linux/hppa/sys/ucontext.h: Do not include
<bits/sigcontext.h>.
(__ctx): Define earlier.
(mcontext_t): Define structure contents rather than using struct
sigcontext.
* sysdeps/unix/sysv/linux/ia64/makecontext.c (__makecontext): Use
mcontext_t instead of struct sigcontext.
* sysdeps/unix/sysv/linux/ia64/sigcontext-offsets.sym: Use
mcontext_t instead of struct sigcontext.
* sysdeps/unix/sysv/linux/ia64/sys/ucontext.h: Do not include
<bits/sigcontext.h>.
(__ctx): New macro.
(struct __ia64_fpreg_mcontext): New type.
(mcontext_t): Define structure contents rather than using struct
sigcontext.
(_SC_GR0_OFFSET): Use mcontext_t instead of struct sigcontext.
(uc_sigmask): Define using __ctx.
(uc_stack): Likewise.
* sysdeps/unix/sysv/linux/ia64/sys/procfs.h: Include
<bits/sigcontext.h>.
* sysdeps/unix/sysv/linux/ia64/sys/ptrace.h: Likewise.
* sysdeps/unix/sysv/linux/m68k/sys/ucontext.h: Do not include
<bits/sigcontext.h>.
* sysdeps/unix/sysv/linux/microblaze/sys/ucontext.h: New file.
* sysdeps/unix/sysv/linux/mips/sys/ucontext.h: Do not include
<bits/sigcontext.h>.
* sysdeps/unix/sysv/linux/nios2/sys/ucontext.h: Do not include
<bits/sigcontext.h>.
* sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h: Do not include
<bits/sigcontext.h>.
* sysdeps/unix/sysv/linux/s390/sys/ucontext.h: Do not include
<bits/sigcontext.h>.
* sysdeps/unix/sysv/linux/sh/sys/ucontext.h: Do not include
<bits/sigcontext.h>.
* sysdeps/unix/sysv/linux/sparc/sys/ucontext.h: Do not include
<bits/sigcontext.h>.
* sysdeps/unix/sysv/linux/tile/sys/ucontext.h: Do not include
<bits/sigcontext.h>.
(__ctx): Define earlier.
(mcontext_t): Define structure contents rather than using struct
sigcontext.
* sysdeps/unix/sysv/linux/x86/sys/ucontext.h: Do not include
<bits/sigcontext.h>. Include <bits/types.h>.
* conform/Makefile (test-xfail-XPG42/signal.h/conform): Remove.
(test-xfail-XPG42/sys/wait.h/conform): Likewise.
(test-xfail-XPG42/ucontext.h/conform): Likewise.
(test-xfail-UNIX98/signal.h/conform): Likewise.
(test-xfail-UNIX98/sys/wait.h/conform): Likewise.
(test-xfail-UNIX98/ucontext.h/conform): Likewise.
(test-xfail-XOPEN2K/signal.h/conform): Likewise.
(test-xfail-XOPEN2K/sys/wait.h/conform): Likewise.
(test-xfail-XOPEN2K/ucontext.h/conform): Likewise.
(test-xfail-POSIX2008/signal.h/conform): Likewise.
(test-xfail-POSIX2008/sys/wait.h/conform): Likewise.
(test-xfail-XOPEN2K8/signal.h/conform): Likewise.
(test-xfail-XOPEN2K8/sys/wait.h/conform): Likewise.
29 files changed, 369 insertions, 96 deletions
@@ -1,3 +1,88 @@ +2017-08-30 Joseph Myers <joseph@codesourcery.com> + + [BZ #21457] + * sysdeps/arm/sys/ucontext.h: Do not include <bits/sigcontext.h>. + * sysdeps/generic/sys/ucontext.h: Add comment about use of struct + sigcontext and namespace requirements. + * sysdeps/i386/sys/ucontext.h: Do not include <bits/sigcontext.h>. + * sysdeps/m68k/sys/ucontext.h: Likewise. + * sysdeps/mips/sys/ucontext.h: Likewise. Include <bits/types.h>. + * sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h: Do not include + <bits/sigcontext.h>. + (__ctx): Define earlier. + (mcontext_t): Define structure contents rather than using struct + sigcontext. + * sysdeps/unix/sysv/linux/aarch64/ucontext_i.sym (oEXTENSION): Use + __glibc_reserved1 instead of __reserved. + * sysdeps/unix/sysv/linux/alpha/sys/ucontext.h: Do not include + <bits/sigcontext.h>. + (__ctx): Define earlier. + (mcontext_t): Define structure contents rather than using struct + sigcontext. + * sysdeps/unix/sysv/linux/alpha/ucontext-offsets.sym: Use + mcontext_t instead of struct sigcontext. + * sysdeps/unix/sysv/linux/arm/sys/ucontext.h: Do not include + <bits/sigcontext.h>. + (__ctx): Define earlier. + (mcontext_t): Define structure contents rather than using struct + sigcontext. + * sysdeps/unix/sysv/linux/hppa/sys/ucontext.h: Do not include + <bits/sigcontext.h>. + (__ctx): Define earlier. + (mcontext_t): Define structure contents rather than using struct + sigcontext. + * sysdeps/unix/sysv/linux/ia64/makecontext.c (__makecontext): Use + mcontext_t instead of struct sigcontext. + * sysdeps/unix/sysv/linux/ia64/sigcontext-offsets.sym: Use + mcontext_t instead of struct sigcontext. + * sysdeps/unix/sysv/linux/ia64/sys/ucontext.h: Do not include + <bits/sigcontext.h>. + (__ctx): New macro. + (struct __ia64_fpreg_mcontext): New type. + (mcontext_t): Define structure contents rather than using struct + sigcontext. + (_SC_GR0_OFFSET): Use mcontext_t instead of struct sigcontext. + (uc_sigmask): Define using __ctx. + (uc_stack): Likewise. + * sysdeps/unix/sysv/linux/ia64/sys/procfs.h: Include + <bits/sigcontext.h>. + * sysdeps/unix/sysv/linux/ia64/sys/ptrace.h: Likewise. + * sysdeps/unix/sysv/linux/m68k/sys/ucontext.h: Do not include + <bits/sigcontext.h>. + * sysdeps/unix/sysv/linux/microblaze/sys/ucontext.h: New file. + * sysdeps/unix/sysv/linux/mips/sys/ucontext.h: Do not include + <bits/sigcontext.h>. + * sysdeps/unix/sysv/linux/nios2/sys/ucontext.h: Do not include + <bits/sigcontext.h>. + * sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h: Do not include + <bits/sigcontext.h>. + * sysdeps/unix/sysv/linux/s390/sys/ucontext.h: Do not include + <bits/sigcontext.h>. + * sysdeps/unix/sysv/linux/sh/sys/ucontext.h: Do not include + <bits/sigcontext.h>. + * sysdeps/unix/sysv/linux/sparc/sys/ucontext.h: Do not include + <bits/sigcontext.h>. + * sysdeps/unix/sysv/linux/tile/sys/ucontext.h: Do not include + <bits/sigcontext.h>. + (__ctx): Define earlier. + (mcontext_t): Define structure contents rather than using struct + sigcontext. + * sysdeps/unix/sysv/linux/x86/sys/ucontext.h: Do not include + <bits/sigcontext.h>. Include <bits/types.h>. + * conform/Makefile (test-xfail-XPG42/signal.h/conform): Remove. + (test-xfail-XPG42/sys/wait.h/conform): Likewise. + (test-xfail-XPG42/ucontext.h/conform): Likewise. + (test-xfail-UNIX98/signal.h/conform): Likewise. + (test-xfail-UNIX98/sys/wait.h/conform): Likewise. + (test-xfail-UNIX98/ucontext.h/conform): Likewise. + (test-xfail-XOPEN2K/signal.h/conform): Likewise. + (test-xfail-XOPEN2K/sys/wait.h/conform): Likewise. + (test-xfail-XOPEN2K/ucontext.h/conform): Likewise. + (test-xfail-POSIX2008/signal.h/conform): Likewise. + (test-xfail-POSIX2008/sys/wait.h/conform): Likewise. + (test-xfail-XOPEN2K8/signal.h/conform): Likewise. + (test-xfail-XOPEN2K8/sys/wait.h/conform): Likewise. + 2017-08-30 Florian Weimer <fweimer@redhat.com> * malloc/dynarray_emplace_enlarge.c @@ -33,6 +33,10 @@ Deprecated and removed features, and other changes affecting compatibility: exception, or the macros X_TLOSS, DOMAIN, SING, OVERFLOW, UNDERFLOW, TLOSS, PLOSS and HUGE. +* The mcontext_t type is no longer the same as struct sigcontext. On + platforms where it was previously the same, this changes the C++ name + mangling for interfaces involving this type. + Changes to build and runtime requirements: [Add changes to build and runtime requirements here] diff --git a/conform/Makefile b/conform/Makefile index 9ec41c7244..3883a4bcf2 100644 --- a/conform/Makefile +++ b/conform/Makefile @@ -160,21 +160,6 @@ test-xfail-UNIX98/ndbm.h/conform = yes test-xfail-XOPEN2K/ndbm.h/conform = yes test-xfail-XOPEN2K8/ndbm.h/conform = yes -# Unsorted expected failures. -test-xfail-XPG42/signal.h/conform = yes -test-xfail-XPG42/sys/wait.h/conform = yes -test-xfail-XPG42/ucontext.h/conform = yes -test-xfail-UNIX98/signal.h/conform = yes -test-xfail-UNIX98/sys/wait.h/conform = yes -test-xfail-UNIX98/ucontext.h/conform = yes -test-xfail-XOPEN2K/signal.h/conform = yes -test-xfail-XOPEN2K/sys/wait.h/conform = yes -test-xfail-XOPEN2K/ucontext.h/conform = yes -test-xfail-POSIX2008/signal.h/conform = yes -test-xfail-POSIX2008/sys/wait.h/conform = yes -test-xfail-XOPEN2K8/signal.h/conform = yes -test-xfail-XOPEN2K8/sys/wait.h/conform = yes - conformtest-cc-flags = -I../include $(+sysdep-includes) $(sysincludes) -I.. # conformtest-xfail-conds may be set by a sysdeps Makefile fragment to # a list of conditions that are considered to be true when encountered diff --git a/sysdeps/arm/sys/ucontext.h b/sysdeps/arm/sys/ucontext.h index da749a96da..512d51fa7a 100644 --- a/sysdeps/arm/sys/ucontext.h +++ b/sysdeps/arm/sys/ucontext.h @@ -23,7 +23,6 @@ #include <features.h> #include <bits/types/sigset_t.h> -#include <bits/sigcontext.h> #include <bits/types/stack_t.h> diff --git a/sysdeps/generic/sys/ucontext.h b/sysdeps/generic/sys/ucontext.h index ec5ab943cc..d497297e2e 100644 --- a/sysdeps/generic/sys/ucontext.h +++ b/sysdeps/generic/sys/ucontext.h @@ -17,7 +17,9 @@ <http://www.gnu.org/licenses/>. */ /* This file's definitions suffice for any platform where all - the machine-specific state is described in `struct sigcontext'. */ + the machine-specific state is described in `struct sigcontext', but + use of struct sigcontext does not conform to POSIX namespace + requirements. */ #ifndef _SYS_UCONTEXT_H #define _SYS_UCONTEXT_H 1 diff --git a/sysdeps/i386/sys/ucontext.h b/sysdeps/i386/sys/ucontext.h index 27f5e48559..440075cb99 100644 --- a/sysdeps/i386/sys/ucontext.h +++ b/sysdeps/i386/sys/ucontext.h @@ -23,7 +23,6 @@ #include <features.h> #include <bits/types/sigset_t.h> -#include <bits/sigcontext.h> #include <bits/types/stack_t.h> diff --git a/sysdeps/m68k/sys/ucontext.h b/sysdeps/m68k/sys/ucontext.h index 9d2b2c6c2c..0dbdca6dca 100644 --- a/sysdeps/m68k/sys/ucontext.h +++ b/sysdeps/m68k/sys/ucontext.h @@ -23,7 +23,6 @@ #include <features.h> #include <bits/types/sigset_t.h> -#include <bits/sigcontext.h> #include <bits/types/stack_t.h> diff --git a/sysdeps/mips/sys/ucontext.h b/sysdeps/mips/sys/ucontext.h index 8248f5935d..d2a7ae3354 100644 --- a/sysdeps/mips/sys/ucontext.h +++ b/sysdeps/mips/sys/ucontext.h @@ -22,8 +22,8 @@ #include <features.h> +#include <bits/types.h> #include <bits/types/sigset_t.h> -#include <bits/sigcontext.h> #include <bits/types/stack_t.h> #include <sgidefs.h> diff --git a/sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h b/sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h index 62ba382f0d..3de801133a 100644 --- a/sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h +++ b/sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h @@ -24,10 +24,15 @@ #include <features.h> #include <bits/types/sigset_t.h> -#include <bits/sigcontext.h> #include <bits/types/stack_t.h> #ifdef __USE_MISC +# define __ctx(fld) fld +#else +# define __ctx(fld) __ ## fld +#endif + +#ifdef __USE_MISC # include <sys/procfs.h> @@ -44,13 +49,15 @@ typedef elf_fpregset_t fpregset_t; the core registers; coprocessor registers get saved elsewhere (e.g. in uc_regspace, or somewhere unspecified on the stack during non-RT signal handlers). */ -typedef struct sigcontext mcontext_t; - -#ifdef __USE_MISC -# define __ctx(fld) fld -#else -# define __ctx(fld) __ ## fld -#endif +typedef struct + { + unsigned long long int __ctx(fault_address); + unsigned long long int __ctx(regs)[31]; + unsigned long long int __ctx(sp); + unsigned long long int __ctx(pc); + unsigned long long int __ctx(pstate); + unsigned char __glibc_reserved1[4096] __attribute__ ((__aligned__ (16))); + } mcontext_t; /* Userlevel context. */ typedef struct ucontext_t diff --git a/sysdeps/unix/sysv/linux/aarch64/ucontext_i.sym b/sysdeps/unix/sysv/linux/aarch64/ucontext_i.sym index ab3930c173..479bdda5c6 100644 --- a/sysdeps/unix/sysv/linux/aarch64/ucontext_i.sym +++ b/sysdeps/unix/sysv/linux/aarch64/ucontext_i.sym @@ -38,7 +38,7 @@ oX0 mcontext (regs) oSP mcontext (sp) oPC mcontext (pc) oPSTATE mcontext (pstate) -oEXTENSION mcontext (__reserved) +oEXTENSION mcontext (__glibc_reserved1) #define fpsimd_context(member) offsetof (struct fpsimd_context, member) diff --git a/sysdeps/unix/sysv/linux/alpha/sys/ucontext.h b/sysdeps/unix/sysv/linux/alpha/sys/ucontext.h index af20177556..a51d9b2d5e 100644 --- a/sysdeps/unix/sysv/linux/alpha/sys/ucontext.h +++ b/sysdeps/unix/sysv/linux/alpha/sys/ucontext.h @@ -21,10 +21,15 @@ #include <features.h> #include <bits/types/sigset_t.h> -#include <bits/sigcontext.h> #include <bits/types/stack_t.h> +#ifdef __USE_MISC +# define __ctx(fld) fld +#else +# define __ctx(fld) __ ## fld +#endif + /* Type for general register. */ typedef long int greg_t; @@ -51,13 +56,27 @@ typedef fpreg_t fpregset_t[__NFPREG]; /* A machine context is exactly a sigcontext. */ -typedef struct sigcontext mcontext_t; - -#ifdef __USE_MISC -# define __ctx(fld) fld -#else -# define __ctx(fld) __ ## fld -#endif +typedef struct + { + long int __ctx(sc_onstack); + long int __ctx(sc_mask); + long int __ctx(sc_pc); + long int __ctx(sc_ps); + long int __ctx(sc_regs)[32]; + long int __ctx(sc_ownedfp); + long int __ctx(sc_fpregs)[32]; + unsigned long int __ctx(sc_fpcr); + unsigned long int __ctx(sc_fp_control); + unsigned long int __glibc_reserved1, __glibc_reserved2; + unsigned long int __ctx(sc_ssize); + char *__ctx(sc_sbase); + unsigned long int __ctx(sc_traparg_a0); + unsigned long int __ctx(sc_traparg_a1); + unsigned long int __ctx(sc_traparg_a2); + unsigned long int __ctx(sc_fp_trap_pc); + unsigned long int __ctx(sc_fp_trigger_sum); + unsigned long int __ctx(sc_fp_trigger_inst); + } mcontext_t; /* Userlevel context. */ typedef struct ucontext_t diff --git a/sysdeps/unix/sysv/linux/alpha/ucontext-offsets.sym b/sysdeps/unix/sysv/linux/alpha/ucontext-offsets.sym index f95ff75636..9e86f8a7ca 100644 --- a/sysdeps/unix/sysv/linux/alpha/ucontext-offsets.sym +++ b/sysdeps/unix/sysv/linux/alpha/ucontext-offsets.sym @@ -7,12 +7,12 @@ UC_OSF_SIGMASK offsetof (ucontext_t, __uc_osf_sigmask) UC_STACK offsetof (ucontext_t, uc_stack) UC_SIGCTX offsetof (ucontext_t, uc_mcontext) UC_SIGMASK offsetof (ucontext_t, uc_sigmask) -SC_REGS offsetof (struct sigcontext, sc_regs) -SC_FPREGS offsetof (struct sigcontext, sc_fpregs) -SC_PC offsetof (struct sigcontext, sc_pc) -SC_PS offsetof (struct sigcontext, sc_ps) -SC_FPCRS offsetof (struct sigcontext, sc_fpcr) -SC_MASK offsetof (struct sigcontext, sc_mask) -SC_FPCR offsetof (struct sigcontext, sc_fpcr) +SC_REGS offsetof (mcontext_t, sc_regs) +SC_FPREGS offsetof (mcontext_t, sc_fpregs) +SC_PC offsetof (mcontext_t, sc_pc) +SC_PS offsetof (mcontext_t, sc_ps) +SC_FPCRS offsetof (mcontext_t, sc_fpcr) +SC_MASK offsetof (mcontext_t, sc_mask) +SC_FPCR offsetof (mcontext_t, sc_fpcr) SS_SP offsetof (stack_t, ss_sp) SS_SIZE offsetof (stack_t, ss_size) diff --git a/sysdeps/unix/sysv/linux/arm/sys/ucontext.h b/sysdeps/unix/sysv/linux/arm/sys/ucontext.h index 2abceef2a4..192d1bdeac 100644 --- a/sysdeps/unix/sysv/linux/arm/sys/ucontext.h +++ b/sysdeps/unix/sysv/linux/arm/sys/ucontext.h @@ -23,11 +23,16 @@ < |
