This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Miscellaneous sys/ucontext.h namespace fixes (bug 21457)


On Mon, 26 Jun 2017, Joseph Myers wrote:

> On Mon, 26 Jun 2017, Zack Weinberg wrote:
> 
> > > 	* sysdeps/unix/sysv/linux/sparc/
> > The SPARC changes are complicated enough that I think they need to be
> > reviewed by an architecture maintainer.
> 
> Architecture maintainer ping for the SPARC parts of 
> <https://sourceware.org/ml/libc-alpha/2017-06/msg00875.html>....

I've now committed the non-SPARC changes.  Here again are the SPARC 
changes (which correspond closely to changes made for other architectures 
in several recent patches).


SPARC sys/ucontext.h namespace fixes (bug 21457).

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.

2017-06-19  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.

diff --git a/NEWS b/NEWS
index 22c43f5..0f70ee7 100644
--- 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
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym b/sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym
index 544030c..8a7cb5a 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym
@@ -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))
diff --git a/sysdeps/unix/sysv/linux/sparc/sys/ucontext.h b/sysdeps/unix/sysv/linux/sparc/sys/ucontext.h
index dc0d316..9932ed4 100644
--- a/sysdeps/unix/sysv/linux/sparc/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/sparc/sys/ucontext.h
@@ -27,59 +27,69 @@
 #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;
 
 

-- 
Joseph S. Myers
joseph@codesourcery.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]