]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
SPARC sys/ucontext.h namespace fixes (bug 21457).
authorJoseph Myers <joseph@codesourcery.com>
Thu, 29 Jun 2017 19:44:43 +0000 (19:44 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Thu, 29 Jun 2017 19:44:43 +0000 (19:44 +0000)
This patch fixes various miscellaneous namespace issues in the SPARC
sys/ucontext.h header.  These are similar to changes made previous to
other sys/ucontext.h headers, where the SPARC header was excluded from
those previous patches because of its complexity.

Tested for SPARC with build-many-glibcs.py.

[BZ #21457]
* sysdeps/unix/sysv/linux/sparc/sys/ucontext.h (__ctx): New macro.
[__WORDSIZE == 64] (MC_TSTATE): Define only for [__USE_MISC].
[__WORDSIZE == 64] (MC_PC): Likewise.
[__WORDSIZE == 64] (MC_NPC): Likewise.
[__WORDSIZE == 64] (MC_Y): Likewise.
[__WORDSIZE == 64] (MC_G1): Likewise.
[__WORDSIZE == 64] (MC_G2): Likewise.
[__WORDSIZE == 64] (MC_G3): Likewise.
[__WORDSIZE == 64] (MC_G4): Likewise.
[__WORDSIZE == 64] (MC_G5): Likewise.
[__WORDSIZE == 64] (MC_G6): Likewise.
[__WORDSIZE == 64] (MC_G7): Likewise.
[__WORDSIZE == 64] (MC_O0): Likewise.
[__WORDSIZE == 64] (MC_O1): Likewise.
[__WORDSIZE == 64] (MC_O2): Likewise.
[__WORDSIZE == 64] (MC_O3): Likewise.
[__WORDSIZE == 64] (MC_O4): Likewise.
[__WORDSIZE == 64] (MC_O5): Likewise.
[__WORDSIZE == 64] (MC_O6): Likewise.
[__WORDSIZE == 64] (MC_O7): Likewise.
[__WORDSIZE == 64] (MC_NGREG): Rename to __MC_NGREG and define to
__MC_NGREG if [__USE_MISC].
[__WORDSIZE == 64] (MC_MAXFPQ): Define only for [__USE_MISC].
[__WORDSIZE == 64] (mc_gregset_t): Define using __MC_NGREG.
[__WORDSIZE == 64] (struct mc_fq): Rename to struct __mc_fq.
Define fields using __ctx.
[__WORDSIZE == 64] (mc_fpu_t): Remove struct tag.  Define fields
using __ctx.
[__WORDSIZE == 64] (mcontext_t): Define fields using __ctx.
(REG_PSR): Define only for [__USE_MISC].
(REG_PC): Likewise.
(REG_nPC): Likewise.
(REG_Y): Likewise.
(REG_G1): Likewise.
(REG_G2): Likewise.
(REG_G3): Likewise.
(REG_G4): Likewise.
(REG_G5): Likewise.
(REG_G6): Likewise.
(REG_G7): Likewise.
(REG_O0): Likewise.
(REG_O1): Likewise.
(REG_O2): Likewise.
(REG_O3): Likewise.
(REG_O4): Likewise.
(REG_O5): Likewise.
(REG_O6): Likewise.
(REG_O7): Likewise.
[__WORDSIZE == 64] (REG_ASI): Define only for [__USE_MISC].
[__WORDSIZE == 64] (REG_FPRS): Likewise.
(NGREG): Rename to __NGREG and define to __NGREG if [__USE_MISC].
(gregset_t): Define using __NGREG.
(SPARC_MAXREGWINDOW): Rename to __SPARC_MAXREGWINDOW and define to
__SPARC_MAXREGWINDOW if [__USE_MISC].
(struct rwindow): Rename to struct __rwindow.  Define fields using
__ctx.
(rw_fp): Define only for [__USE_MISC].
(rw_rtn): Likewise.
(gwindows_t): Remove struct tag.  Define fields using __ctx and
__SPARC_MAXREGWINDOW.
(MAXFPQ): Define only for [__USE_MISC].
(struct fpq): Rename to struct __fpq.  Define fields using __ctx.
(struct fq): Rename to struct __fq.  Define fields using __ctx.
(FPU_REGS_TYPE): Define only for [__USE_MISC].
(FPU_DREGS_TYPE): Likewise.
(V7_FPU_FSR_TYPE): Likewise.
(V9_FPU_FSR_TYPE): Likewise.
(V9_FPU_FPRS_TYPE): Likewise.
[__WORDSIZE == 64] (fpregset_t): Remove struct tag.  Define fields
using __ctx.
[__WORDSIZE != 64] (fpregset_t): Likewise.
[__WORDSIZE != 64] (xrs_t): Define fields using __ctx.
[__WORDSIZE != 64] (XRS_ID): Define only for [__USE_MISC].
[__WORDSIZE != 64] (mcontext_t): Define fields using __ctx.
Rename field filler to __glibc_reserved1.
* sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym
(MC_FILLER): Remove.

ChangeLog
NEWS
sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym
sysdeps/unix/sysv/linux/sparc/sys/ucontext.h

index 147dcaaab89ce064051391060ac07749fd8ae633..dd61ff0490c5e217035ed36764c08070cb3c0b4e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,84 @@
+2017-06-29  Joseph Myers  <joseph@codesourcery.com>
+
+       [BZ #21457]
+       * sysdeps/unix/sysv/linux/sparc/sys/ucontext.h (__ctx): New macro.
+       [__WORDSIZE == 64] (MC_TSTATE): Define only for [__USE_MISC].
+       [__WORDSIZE == 64] (MC_PC): Likewise.
+       [__WORDSIZE == 64] (MC_NPC): Likewise.
+       [__WORDSIZE == 64] (MC_Y): Likewise.
+       [__WORDSIZE == 64] (MC_G1): Likewise.
+       [__WORDSIZE == 64] (MC_G2): Likewise.
+       [__WORDSIZE == 64] (MC_G3): Likewise.
+       [__WORDSIZE == 64] (MC_G4): Likewise.
+       [__WORDSIZE == 64] (MC_G5): Likewise.
+       [__WORDSIZE == 64] (MC_G6): Likewise.
+       [__WORDSIZE == 64] (MC_G7): Likewise.
+       [__WORDSIZE == 64] (MC_O0): Likewise.
+       [__WORDSIZE == 64] (MC_O1): Likewise.
+       [__WORDSIZE == 64] (MC_O2): Likewise.
+       [__WORDSIZE == 64] (MC_O3): Likewise.
+       [__WORDSIZE == 64] (MC_O4): Likewise.
+       [__WORDSIZE == 64] (MC_O5): Likewise.
+       [__WORDSIZE == 64] (MC_O6): Likewise.
+       [__WORDSIZE == 64] (MC_O7): Likewise.
+       [__WORDSIZE == 64] (MC_NGREG): Rename to __MC_NGREG and define to
+       __MC_NGREG if [__USE_MISC].
+       [__WORDSIZE == 64] (MC_MAXFPQ): Define only for [__USE_MISC].
+       [__WORDSIZE == 64] (mc_gregset_t): Define using __MC_NGREG.
+       [__WORDSIZE == 64] (struct mc_fq): Rename to struct __mc_fq.
+       Define fields using __ctx.
+       [__WORDSIZE == 64] (mc_fpu_t): Remove struct tag.  Define fields
+       using __ctx.
+       [__WORDSIZE == 64] (mcontext_t): Define fields using __ctx.
+       (REG_PSR): Define only for [__USE_MISC].
+       (REG_PC): Likewise.
+       (REG_nPC): Likewise.
+       (REG_Y): Likewise.
+       (REG_G1): Likewise.
+       (REG_G2): Likewise.
+       (REG_G3): Likewise.
+       (REG_G4): Likewise.
+       (REG_G5): Likewise.
+       (REG_G6): Likewise.
+       (REG_G7): Likewise.
+       (REG_O0): Likewise.
+       (REG_O1): Likewise.
+       (REG_O2): Likewise.
+       (REG_O3): Likewise.
+       (REG_O4): Likewise.
+       (REG_O5): Likewise.
+       (REG_O6): Likewise.
+       (REG_O7): Likewise.
+       [__WORDSIZE == 64] (REG_ASI): Define only for [__USE_MISC].
+       [__WORDSIZE == 64] (REG_FPRS): Likewise.
+       (NGREG): Rename to __NGREG and define to __NGREG if [__USE_MISC].
+       (gregset_t): Define using __NGREG.
+       (SPARC_MAXREGWINDOW): Rename to __SPARC_MAXREGWINDOW and define to
+       __SPARC_MAXREGWINDOW if [__USE_MISC].
+       (struct rwindow): Rename to struct __rwindow.  Define fields using
+       __ctx.
+       (rw_fp): Define only for [__USE_MISC].
+       (rw_rtn): Likewise.
+       (gwindows_t): Remove struct tag.  Define fields using __ctx and
+       __SPARC_MAXREGWINDOW.
+       (MAXFPQ): Define only for [__USE_MISC].
+       (struct fpq): Rename to struct __fpq.  Define fields using __ctx.
+       (struct fq): Rename to struct __fq.  Define fields using __ctx.
+       (FPU_REGS_TYPE): Define only for [__USE_MISC].
+       (FPU_DREGS_TYPE): Likewise.
+       (V7_FPU_FSR_TYPE): Likewise.
+       (V9_FPU_FSR_TYPE): Likewise.
+       (V9_FPU_FPRS_TYPE): Likewise.
+       [__WORDSIZE == 64] (fpregset_t): Remove struct tag.  Define fields
+       using __ctx.
+       [__WORDSIZE != 64] (fpregset_t): Likewise.
+       [__WORDSIZE != 64] (xrs_t): Define fields using __ctx.
+       [__WORDSIZE != 64] (XRS_ID): Define only for [__USE_MISC].
+       [__WORDSIZE != 64] (mcontext_t): Define fields using __ctx.
+       Rename field filler to __glibc_reserved1.
+       * sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym
+       (MC_FILLER): Remove.
+
 2017-06-29  Florian Weimer  <fweimer@redhat.com>
 
        * stdio-common/tst-vfprintf-user-type.c (my_printf_function):
diff --git a/NEWS b/NEWS
index 84c69bf0569737e1474ab546fcaecb17347f559f..711b2d9f2919f3adb897b3f129c6fb097a73c32e 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -99,8 +99,12 @@ Version 2.26
 
 * On M68k GNU/Linux and MIPS GNU/Linux, the fpregset_t type no longer has
   the name struct fpregset.  On Nios II GNU/Linux, the mcontext_t type no
-  longer has the name struct mcontext.  This changes the C++ name mangling
-  for interfaces involving those types.
+  longer has the name struct mcontext.  On SPARC GNU/Linux, the struct
+  mc_fq, struct rwindow, struct fpq and struct fq types are no longer
+  defined in sys/ucontext.h, the mc_fpu_t type no longer has the name struct
+  mc_fpu, the gwindows_t type no longer has the name struct gwindows and the
+  fpregset_t type no longer has the name struct fpu.  This changes the C++
+  name mangling for interfaces involving those types.
 
 * The synchronization that pthread_spin_unlock performs has been changed
   to now be equivalent to a C11 atomic store with release memory order to
index 544030ce8b6c523f610b2d430802dad6c7798330..8a7cb5ab84eb7aa805909d04193a9761af971c1d 100644 (file)
@@ -16,7 +16,6 @@ MC_GREGS      offsetof (mcontext_t, gregs)
 MC_GWINS       offsetof (mcontext_t, gwins)
 MC_FPREGS      offsetof (mcontext_t, fpregs)
 MC_XRS         offsetof (mcontext_t, xrs)
-MC_FILLER      offsetof (mcontext_t, filler)
 GREG_PSR       (REG_PSR * sizeof(greg_t))
 GREG_PC                (REG_PC * sizeof(greg_t))
 GREG_NPC       (REG_nPC * sizeof(greg_t))
index dc0d3169b5d4b85ae3d17a1834bd5b76919643cf..9932ed4cac2049c54e66be8e6b439675fd0c9535 100644 (file)
 #include <bits/wordsize.h>
 
 
+#ifdef __USE_MISC
+# define __ctx(fld) fld
+#else
+# define __ctx(fld) __ ## fld
+#endif
+
 #if __WORDSIZE == 64
 
-#define MC_TSTATE      0
-#define MC_PC          1
-#define MC_NPC         2
-#define MC_Y           3
-#define MC_G1          4
-#define MC_G2          5
-#define MC_G3          6
-#define MC_G4          7
-#define MC_G5          8
-#define MC_G6          9
-#define MC_G7          10
-#define MC_O0          11
-#define MC_O1          12
-#define MC_O2          13
-#define MC_O3          14
-#define MC_O4          15
-#define MC_O5          16
-#define MC_O6          17
-#define MC_O7          18
-#define MC_NGREG       19
+#define __MC_NGREG     19
+#ifdef __USE_MISC
+# define MC_TSTATE     0
+# define MC_PC         1
+# define MC_NPC                2
+# define MC_Y          3
+# define MC_G1         4
+# define MC_G2         5
+# define MC_G3         6
+# define MC_G4         7
+# define MC_G5         8
+# define MC_G6         9
+# define MC_G7         10
+# define MC_O0         11
+# define MC_O1         12
+# define MC_O2         13
+# define MC_O3         14
+# define MC_O4         15
+# define MC_O5         16
+# define MC_O6         17
+# define MC_O7         18
+# define MC_NGREG      __MC_NGREG
+#endif
 
 typedef unsigned long mc_greg_t;
-typedef mc_greg_t mc_gregset_t[MC_NGREG];
-
-#define MC_MAXFPQ      16
-struct mc_fq {
-       unsigned long   *mcfq_addr;
-       unsigned int    mcfq_insn;
+typedef mc_greg_t mc_gregset_t[__MC_NGREG];
+
+#ifdef __USE_MISC
+# define MC_MAXFPQ     16
+#endif
+struct __mc_fq {
+       unsigned long   *__ctx(mcfq_addr);
+       unsigned int    __ctx(mcfq_insn);
 };
 
-struct mc_fpu {
+typedef struct {
        union {
-               unsigned int    sregs[32];
-               unsigned long   dregs[32];
-               long double     qregs[16];
-       } mcfpu_fregs;
-       unsigned long   mcfpu_fsr;
-       unsigned long   mcfpu_fprs;
-       unsigned long   mcfpu_gsr;
-       struct mc_fq    *mcfpu_fq;
-       unsigned char   mcfpu_qcnt;
-       unsigned char   mcfpu_qentsz;
-       unsigned char   mcfpu_enab;
-};
-typedef struct mc_fpu mc_fpu_t;
+               unsigned int    __ctx(sregs)[32];
+               unsigned long   __ctx(dregs)[32];
+               long double     __ctx(qregs)[16];
+       } __ctx(mcfpu_fregs);
+       unsigned long   __ctx(mcfpu_fsr);
+       unsigned long   __ctx(mcfpu_fprs);
+       unsigned long   __ctx(mcfpu_gsr);
+       struct __mc_fq  *__ctx(mcfpu_fq);
+       unsigned char   __ctx(mcfpu_qcnt);
+       unsigned char   __ctx(mcfpu_qentsz);
+       unsigned char   __ctx(mcfpu_enab);
+} mc_fpu_t;
 
 typedef struct {
-       mc_gregset_t    mc_gregs;
-       mc_greg_t       mc_fp;
-       mc_greg_t       mc_i7;
-       mc_fpu_t        mc_fpregs;
+       mc_gregset_t    __ctx(mc_gregs);
+       mc_greg_t       __ctx(mc_fp);
+       mc_greg_t       __ctx(mc_i7);
+       mc_fpu_t        __ctx(mc_fpregs);
 } mcontext_t;
 
 typedef struct ucontext_t {
@@ -97,25 +107,27 @@ typedef struct ucontext_t {
  * Location of the users' stored registers relative to R0.
  * Usage is as an index into a gregset_t array or as u.u_ar0[XX].
  */
-#define REG_PSR (0)
-#define REG_PC  (1)
-#define REG_nPC (2)
-#define REG_Y   (3)
-#define REG_G1  (4)
-#define REG_G2  (5)
-#define REG_G3  (6)
-#define REG_G4  (7)
-#define REG_G5  (8)
-#define REG_G6  (9)
-#define REG_G7  (10)
-#define REG_O0  (11)
-#define REG_O1  (12)
-#define REG_O2  (13)
-#define REG_O3  (14)
-#define REG_O4  (15)
-#define REG_O5  (16)
-#define REG_O6  (17)
-#define REG_O7  (18)
+#ifdef __USE_MISC
+# define REG_PSR (0)
+# define REG_PC  (1)
+# define REG_nPC (2)
+# define REG_Y   (3)
+# define REG_G1  (4)
+# define REG_G2  (5)
+# define REG_G3  (6)
+# define REG_G4  (7)
+# define REG_G5  (8)
+# define REG_G6  (9)
+# define REG_G7  (10)
+# define REG_O0  (11)
+# define REG_O1  (12)
+# define REG_O2  (13)
+# define REG_O3  (14)
+# define REG_O4  (15)
+# define REG_O5  (16)
+# define REG_O6  (17)
+# define REG_O7  (18)
+#endif
 
 /*
  * A gregset_t is defined as an array type for compatibility with the reference
@@ -128,20 +140,26 @@ typedef struct ucontext_t {
 
 #if __WORDSIZE == 64
 
-#define REG_ASI        (19)
-#define REG_FPRS (20)
+# define __NGREG   21
+# ifdef __USE_MISC
+#  define REG_ASI      (19)
+#  define REG_FPRS (20)
 
-#define NGREG   21
+#  define NGREG   __NGREG
+# endif
 typedef long greg_t;
 
 #else /* __WORDSIZE == 32 */
 
-#define NGREG   19
+# define __NGREG   19
+# ifdef __USE_MISC
+#  define NGREG   __NGREG
+# endif
 typedef int greg_t;
 
 #endif /* __WORDSIZE == 32 */
 
-typedef greg_t  gregset_t[NGREG];
+typedef greg_t  gregset_t[__NGREG];
 
 /*
  * The following structures define how a register window can appear on the
@@ -150,28 +168,35 @@ typedef greg_t  gregset_t[NGREG];
  * maximum number of outstanding regiters window defined in the SPARC
  * architecture (*not* implementation).
  */
-#define SPARC_MAXREGWINDOW     31      /* max windows in SPARC arch. */
-struct  rwindow
+# define __SPARC_MAXREGWINDOW  31      /* max windows in SPARC arch. */
+#ifdef __USE_MISC
+# define SPARC_MAXREGWINDOW    __SPARC_MAXREGWINDOW
+#endif
+struct  __rwindow
   {
-    greg_t rw_local[8];                        /* locals */
-    greg_t rw_in[8];                   /* ins */
+    greg_t __ctx(rw_local)[8];                 /* locals */
+    greg_t __ctx(rw_in)[8];                    /* ins */
   };
 
-#define rw_fp   rw_in[6]               /* frame pointer */
-#define rw_rtn  rw_in[7]               /* return address */
+#ifdef __USE_MISC
+# define rw_fp   __ctx(rw_in)[6]               /* frame pointer */
+# define rw_rtn  __ctx(rw_in)[7]               /* return address */
+#endif
 
-typedef struct gwindows
+typedef struct
   {
-    int            wbcnt;
-    int           *spbuf[SPARC_MAXREGWINDOW];
-    struct rwindow wbuf[SPARC_MAXREGWINDOW];
+    int            __ctx(wbcnt);
+    int           *__ctx(spbuf)[__SPARC_MAXREGWINDOW];
+    struct __rwindow __ctx(wbuf)[__SPARC_MAXREGWINDOW];
   } gwindows_t;
 
 /*
  * Floating point definitions.
  */
 
-#define MAXFPQ 16      /* max # of fpu queue entries currently supported */
+#ifdef __USE_MISC
+# define MAXFPQ        16      /* max # of fpu queue entries currently supported */
+#endif
 
 /*
  * struct fq defines the minimal format of a floating point instruction queue
@@ -180,56 +205,58 @@ typedef struct gwindows
  * conformant system implementation. Any additional fields provided by an
  * implementation should not be used applications designed to be ABI conformant. */
 
-struct fpq
+struct __fpq
   {
-    unsigned long *fpq_addr;           /* address */
-    unsigned long fpq_instr;           /* instruction */
+    unsigned long *__ctx(fpq_addr);            /* address */
+    unsigned long __ctx(fpq_instr);            /* instruction */
   };
 
-struct fq
+struct __fq
   {
     union                              /* FPU inst/addr queue */
       {
-        double whole;
-        struct fpq fpq;
-      } FQu;
+        double __ctx(whole);
+        struct __fpq __ctx(fpq);
+      } __ctx(FQu);
   };
 
-#define FPU_REGS_TYPE           unsigned
-#define FPU_DREGS_TYPE          unsigned long long
-#define V7_FPU_FSR_TYPE         unsigned
-#define V9_FPU_FSR_TYPE         unsigned long long
-#define V9_FPU_FPRS_TYPE        unsigned
+#ifdef __USE_MISC
+# define FPU_REGS_TYPE           unsigned
+# define FPU_DREGS_TYPE          unsigned long long
+# define V7_FPU_FSR_TYPE         unsigned
+# define V9_FPU_FSR_TYPE         unsigned long long
+# define V9_FPU_FPRS_TYPE        unsigned
+#endif
 
 #if __WORDSIZE == 64
 
-typedef struct fpu
+typedef struct
   {
     union {                            /* FPU floating point regs */
-      unsigned         fpu_regs[32];   /* 32 singles */
-      double            fpu_dregs[32]; /* 32 doubles */
-      long double      fpu_qregs[16];  /* 16 quads */
-    } fpu_fr;
-    struct fq       *fpu_q;            /* ptr to array of FQ entries */
-    unsigned long   fpu_fsr;           /* FPU status register */
-    unsigned char   fpu_qcnt;          /* # of entries in saved FQ */
-    unsigned char   fpu_q_entrysize;   /* # of bytes per FQ entry */
-    unsigned char   fpu_en;            /* flag signifying fpu in use */
+      unsigned         __ctx(fpu_regs)[32];    /* 32 singles */
+      double            __ctx(fpu_dregs)[32];  /* 32 doubles */
+      long double      __ctx(fpu_qregs)[16];  /* 16 quads */
+    } __ctx(fpu_fr);
+    struct __fq     *__ctx(fpu_q);             /* ptr to array of FQ entries */
+    unsigned long   __ctx(fpu_fsr);            /* FPU status register */
+    unsigned char   __ctx(fpu_qcnt);           /* # of entries in saved FQ */
+    unsigned char   __ctx(fpu_q_entrysize);    /* # of bytes per FQ entry */
+    unsigned char   __ctx(fpu_en);             /* flag signifying fpu in use */
   } fpregset_t;
 
 #else /* __WORDSIZE == 32 */
 
-typedef struct fpu
+typedef struct
   {
     union {                            /* FPU floating point regs */
-      __extension__ unsigned long long fpu_regs[32];   /* 32 singles */
-      double             fpu_dregs[16];        /* 16 doubles */
-    } fpu_fr;
-    struct fq       *fpu_q;            /* ptr to array of FQ entries */
-    unsigned        fpu_fsr;           /* FPU status register */
-    unsigned char   fpu_qcnt;          /* # of entries in saved FQ */
-    unsigned char   fpu_q_entrysize;   /* # of bytes per FQ entry */
-    unsigned char   fpu_en;            /* flag signifying fpu in use */
+      __extension__ unsigned long long __ctx(fpu_regs)[32];    /* 32 singles */
+      double             __ctx(fpu_dregs)[16]; /* 16 doubles */
+    } __ctx(fpu_fr);
+    struct __fq     *__ctx(fpu_q);             /* ptr to array of FQ entries */
+    unsigned        __ctx(fpu_fsr);            /* FPU status register */
+    unsigned char   __ctx(fpu_qcnt);           /* # of entries in saved FQ */
+    unsigned char   __ctx(fpu_q_entrysize);    /* # of bytes per FQ entry */
+    unsigned char   __ctx(fpu_en);             /* flag signifying fpu in use */
   } fpregset_t;
 
 /*
@@ -244,19 +271,23 @@ typedef struct fpu
  */
 typedef struct
   {
-    unsigned int xrs_id;               /* indicates xrs_ptr validity */
-    void *       xrs_ptr;              /* ptr to extra reg state */
+    unsigned int __ctx(xrs_id);                /* indicates xrs_ptr validity */
+    void *       __ctx(xrs_ptr);               /* ptr to extra reg state */
   } xrs_t;
 
-#define XRS_ID 0x78727300              /* the string "xrs" */
+#ifdef __USE_MISC
+# define XRS_ID        0x78727300              /* the string "xrs" */
+#endif
 
 typedef struct
   {
-    gregset_t   gregs;         /* general register set */
-    gwindows_t  *gwins;                /* POSSIBLE pointer to register windows */
-    fpregset_t  fpregs;                /* floating point register set */
-    xrs_t       xrs;           /* POSSIBLE extra register state association */
-    long        filler[19];
+    gregset_t   __ctx(gregs);          /* general register set */
+    gwindows_t  *__ctx(gwins);         /* POSSIBLE pointer to register
+                                          windows */
+    fpregset_t  __ctx(fpregs);         /* floating point register set */
+    xrs_t       __ctx(xrs);            /* POSSIBLE extra register state
+                                          association */
+    long        __glibc_reserved1[19];
   } mcontext_t;