diff mbox

Fix more namespace issues in sys/ucontext.h (bug 21457)

Message ID alpine.DEB.2.20.1705161742240.14609@digraph.polyomino.org.uk
State New
Headers show

Commit Message

Joseph Myers May 16, 2017, 5:42 p.m. UTC
Continuing the fixes for namespace issues in sys/ucontext.h, this
patch moves various symbols into the implementation namespace in the
absence of __USE_MISC.  As with previous changes, it is nonexhaustive,
just covering more straightforward cases.

Structure fields are generally changed to have a prefix __ in the
absence of __USE_MISC, via a macro __ctx (used without a space before
the open parenthesis, since the result is a single identifier).
Various macros such as NGREG also have leading __ added.  No changes
are made to structure tags (and thus to C++ name mangling), except
that in the (unused) file sysdeps/i386/sys/ucontext.h, structures
defined inside other structures as the type for a field have their
tags removed in the non-__USE_MISC case (those structure tags would
not in any case have been visible in C++, because in C++ the scope of
such a tag is limited to the containing structure).  No changes are
made to the contents of bits/sigcontext.h, or to whether it is
included.  Because of remaining namespace issues, this patch does not
yet fix the bug or allow any XFAILs to be removed.

Tested for x86_64 and x86, and with build-many-glibcs.py.

2017-05-16  Joseph Myers  <joseph@codesourcery.com>

	[BZ #21457]
	* sysdeps/arm/sys/ucontext.h (NGREG): Rename to __NGREG and define
	NGREG to __NGREG if [__USE_MISC].
	(gregset_t): Define using __NGREG.
	(__ctx): New macro.
	(mcontext_t): Use __ctx in defining fields.
	* sysdeps/i386/sys/ucontext.h (NGREG): Rename to __NGREG and
	define NGREG to __NGREG if [__USE_MISC].
	(gregset_t): Define using __NGREG.
	(__ctx): New macro.
	(__ctxt): Likewise.
	(fpregset_t): Use __ctx and __ctxt in defining fields.
	(mcontext_t): Likewise.
	* sysdeps/m68k/sys/ucontext.h (NGREG): Rename to __NGREG and
	define NGREG to __NGREG if [__USE_MISC].
	(gregset_t): Define using __NGREG.
	(__ctx): New macro.
	(mcontext_t): Use __ctx in defining fields.
	* sysdeps/mips/sys/ucontext.h (NGREG): Rename to __NGREG and
	define NGREG to __NGREG if [__USE_MISC].
	(gregset_t): Define using __NGREG.
	(__ctx): New macro.
	(fpregset_t): Use __ctx in defining fields.
	(mcontext_t): Likewise.
	* sysdeps/unix/sysv/linux/alpha/sys/ucontext.h (NGREG): Rename to
	__NGREG and define NGREG to __NGREG if [__USE_MISC].
	(gregset_t): Define using __NGREG.
	(NFPREG): Rename to __NFPREG and define NFPREG to __NFPREG if
	[__USE_MISC].
	(fpregset_t): Define using __NFPREG.
	* sysdeps/unix/sysv/linux/m68k/sys/ucontext.h (NGREG): Rename to
	__NGREG and define NGREG to __NGREG if [__USE_MISC].
	(gregset_t): Define using __NGREG.
	(__ctx): New macro.
	(fpregset_t): Use __ctx in defining fields.
	(mcontext_t): Likewise.
	* sysdeps/unix/sysv/linux/mips/sys/ucontext.h (NGREG): Rename to
	__NGREG and define NGREG to __NGREG if [__USE_MISC].
	(NFPREG): Rename to __NFPREG and define NFPREG to __NFPREG if
	[__USE_MISC].
	(gregset_t): Define using __NGREG.
	(__ctx): New macro.
	(fpregset_t): Use __ctx in defining fields.
	(mcontext_t): Likewise.
	* sysdeps/unix/sysv/linux/nios2/sys/ucontext.h (__ctx): New macro.
	(mcontext_t): Use __ctx in defining fields.
	* sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h (__ctx): New
	macro.
	[__WORDSIZE == 32] (NGREG): Rename to __NGREG and define NGREG to
	__NGREG if [__USE_MISC].
	[__WORDSIZE == 32] (gregset_t): Define using __NGREG.
	[__WORDSIZE == 32] (fpregset_t): Use __ctx in defining fields.
	(mcontext_t): Likewise.
	[__WORDSIZE != 32] (NGREG): Rename to __NGREG and define NGREG to
	__NGREG if [__USE_MISC].
	[__WORDSIZE != 32] (NFPREG): Rename to __NFPREG and define NFPREG
	to __NFPREG if [__USE_MISC].
	[__WORDSIZE != 32] (NVRREG): Rename to __NVRREG and define NVRREG
	to __NVRREG if [__USE_MISC].
	[__WORDSIZE != 32] (gregset_t): Define using __NGREG.
	[__WORDSIZE != 32] (fpregset_t): Define using __NFPREG.
	[__WORDSIZE != 32] (vscr_t): Use __ctx in defining fields.
	[__WORDSIZE != 32] (vrregset_t): Likewise.
	[__WORDSIZE != 32] (mcontext_t): Likewise.
	* sysdeps/unix/sysv/linux/s390/sys/ucontext.h (__ctx): New macro.
	(__psw_t): Use __ctx in defining fields.
	(NGREG): Rename to __NGREG and define NGREG to __NGREG if
	[__USE_MISC].
	(gregset_t): Define using __NGREG.
	(fpreg_t): Use __ctx in defining fields.
	(fpregset_t): Likewise.
	(mcontext_t): Likewise.
	* sysdeps/unix/sysv/linux/sh/sys/ucontext.h (NGREG): Rename to
	__NGREG and define NGREG to __NGREG if [__USE_MISC].
	(gregset_t): Define using __NGREG.
	(NFPREG): Rename to __NFPREG and define NFPREG to __NFPREG if
	[__USE_MISC].
	(fpregset_t): Define using __NFPREG.
	(__ctx): New macro.
	(mcontext_t): Use __ctx in defining fields.
	* sysdeps/unix/sysv/linux/x86/sys/ucontext.h (__ctx): New macro.
	[__x86_64__] (NGREG): Rename to __NGREG and define NGREG to
	__NGREG if [__USE_MISC].
	[__x86_64__] (gregset_t): Define using __NGREG.
	[__x86_64__] (struct _libc_fpxreg): Use __ctx in defining fields.
	[__x86_64__] (struct _libc_fpstate): Likewise.
	[__x86_64__] (mcontext_t): Likewise.
	[!__x86_64__] (NGREG): Rename to __NGREG and define NGREG to
	__NGREG if [__USE_MISC].
	[!__x86_64__] (gregset_t): Define using __NGREG.
	[!__x86_64__] (struct _libc_fpreg): Use __ctx in defining fields.
	[!__x86_64__] (struct _libc_fpstate): Likewise.
	[!__x86_64__] (mcontext_t): Likewise.

Comments

Joseph Myers May 22, 2017, 11:32 a.m. UTC | #1
Ping.  This patch 
<https://sourceware.org/ml/libc-alpha/2017-05/msg00484.html> is pending 
review.
Zack Weinberg May 22, 2017, 10:54 p.m. UTC | #2
On Mon, May 22, 2017 at 7:32 AM, Joseph Myers <joseph@codesourcery.com> wrote:
> Ping.  This patch
> <https://sourceware.org/ml/libc-alpha/2017-05/msg00484.html> is pending
> review.

So I'm OK with __ versions of NGREG, NFPREG, etc, but is it really
necessary to mangle structure field names?  Is it just to defend
against user definitions of those identifiers as preprocessor macros,
or is there a more likely-to-happen-in-real-code reason, given the
general tendency to avoid object-like macros nowadays?

zw
Florian Weimer May 23, 2017, 6:30 a.m. UTC | #3
On 05/23/2017 12:54 AM, Zack Weinberg wrote:
> So I'm OK with __ versions of NGREG, NFPREG, etc, but is it really
> necessary to mangle structure field names?  Is it just to defend
> against user definitions of those identifiers as preprocessor macros,

I think this is sufficient reason to do it, unfortunately.

> or is there a more likely-to-happen-in-real-code reason, given the
> general tendency to avoid object-like macros nowadays?

I don't think that tendency exists.  Maybe for some projects, but not
for glibc's upstreams (standards).

Thanks,
Florian
Joseph Myers May 23, 2017, 11:53 a.m. UTC | #4
On Mon, 22 May 2017, Zack Weinberg wrote:

> On Mon, May 22, 2017 at 7:32 AM, Joseph Myers <joseph@codesourcery.com> wrote:
> > Ping.  This patch
> > <https://sourceware.org/ml/libc-alpha/2017-05/msg00484.html> is pending
> > review.
> 
> So I'm OK with __ versions of NGREG, NFPREG, etc, but is it really
> necessary to mangle structure field names?  Is it just to defend
> against user definitions of those identifiers as preprocessor macros,

Yes.  These names (many of them very generic, such as "state" or 
"version") are not reserved as macro names.
Joseph Myers June 1, 2017, 11:36 a.m. UTC | #5
Ping^2.  This patch 
<https://sourceware.org/ml/libc-alpha/2017-05/msg00484.html> is still 
pending review.
Adhemerval Zanella June 1, 2017, 12:20 p.m. UTC | #6
On 01/06/2017 08:36, Joseph Myers wrote:
> Ping^2.  This patch 
> <https://sourceware.org/ml/libc-alpha/2017-05/msg00484.html> is still 
> pending review.
> 

LGTM, thanks.
diff mbox

Patch

diff --git a/sysdeps/arm/sys/ucontext.h b/sysdeps/arm/sys/ucontext.h
index 09fe418..a0b1194 100644
--- a/sysdeps/arm/sys/ucontext.h
+++ b/sysdeps/arm/sys/ucontext.h
@@ -32,10 +32,13 @@ 
 typedef int greg_t;
 
 /* Number of general registers.  */
-#define NGREG	16
+#define __NGREG	16
+#ifdef __USE_MISC
+# define NGREG	__NGREG
+#endif
 
 /* Container for all general registers.  */
-typedef greg_t gregset_t[NGREG];
+typedef greg_t gregset_t[__NGREG];
 
 #ifdef __USE_MISC
 /* Number of each register is the `gregset_t' array.  */
@@ -76,6 +79,12 @@  enum
 };
 #endif
 
+#ifdef __USE_MISC
+# define __ctx(fld) fld
+#else
+# define __ctx(fld) __ ## fld
+#endif
+
 /* Structure to describe FPU registers.  */
 typedef struct fpregset
   {
@@ -84,10 +93,12 @@  typedef struct fpregset
 /* Context to describe whole processor state.  */
 typedef struct
   {
-    gregset_t gregs;
-    fpregset_t fpregs;
+    gregset_t __ctx(gregs);
+    fpregset_t __ctx(fpregs);
   } mcontext_t;
 
+#undef __ctx
+
 /* Userlevel context.  */
 typedef struct ucontext
   {
diff --git a/sysdeps/i386/sys/ucontext.h b/sysdeps/i386/sys/ucontext.h
index c632e50..443dcf7 100644
--- a/sysdeps/i386/sys/ucontext.h
+++ b/sysdeps/i386/sys/ucontext.h
@@ -33,10 +33,13 @@ 
 typedef int greg_t;
 
 /* Number of general registers.  */
-#define NGREG	19
+#define __NGREG	19
+#ifdef __USE_MISC
+# define NGREG	__NGREG
+#endif
 
 /* Container for all general registers.  */
-typedef greg_t gregset_t[NGREG];
+typedef greg_t gregset_t[__NGREG];
 
 #ifdef __USE_MISC
 /* Number of each register is the `gregset_t' array.  */
@@ -83,36 +86,47 @@  enum
 };
 #endif
 
+#ifdef __USE_MISC
+# define __ctx(fld) fld
+# define __ctxt(tag) tag
+#else
+# define __ctx(fld) __ ## fld
+# define __ctxt(tag) /* Empty.  */
+#endif
+
 /* Structure to describe FPU registers.  */
 typedef struct fpregset
   {
     union
       {
-	struct fpchip_state
+	struct __ctxt(fpchip_state)
 	  {
-	    int state[27];
-	    int status;
-	  } fpchip_state;
+	    int __ctx(state)[27];
+	    int __ctx(status);
+	  } __ctx(fpchip_state);
 
-	struct fp_emul_space
+	struct __ctxt(fp_emul_space)
 	  {
-	    char fp_emul[246];
-	    char fp_epad[2];
-	  } fp_emul_space;
+	    char __ctx(fp_emul)[246];
+	    char __ctx(fp_epad)[2];
+	  } __ctx(fp_emul_space);
 
-	int f_fpregs[62];
-      } fp_reg_set;
+	int __ctx(f_fpregs)[62];
+      } __ctx(fp_reg_set);
 
-    long int f_wregs[33];
+    long int __ctx(f_wregs)[33];
   } fpregset_t;
 
 /* Context to describe whole processor state.  */
 typedef struct
   {
-    gregset_t gregs;
-    fpregset_t fpregs;
+    gregset_t __ctx(gregs);
+    fpregset_t __ctx(fpregs);
   } mcontext_t;
 
+#undef __ctx
+#undef __ctxt
+
 /* Userlevel context.  */
 typedef struct ucontext
   {
diff --git a/sysdeps/m68k/sys/ucontext.h b/sysdeps/m68k/sys/ucontext.h
index cbec1db..6b6dc53 100644
--- a/sysdeps/m68k/sys/ucontext.h
+++ b/sysdeps/m68k/sys/ucontext.h
@@ -33,10 +33,13 @@ 
 typedef int greg_t;
 
 /* Number of general registers.  */
-#define NGREG	18
+#define __NGREG	18
+#ifdef __USE_MISC
+# define NGREG	__NGREG
+#endif
 
 /* Container for all general registers.  */
-typedef greg_t gregset_t[NGREG];
+typedef greg_t gregset_t[__NGREG];
 
 #ifdef __USE_MISC
 /* Number of each register is the `gregset_t' array.  */
@@ -92,13 +95,21 @@  typedef struct fpregset
 } fpregset_t;
 #endif
 
+#ifdef __USE_MISC
+# define __ctx(fld) fld
+#else
+# define __ctx(fld) __ ## fld
+#endif
+
 /* Context to describe whole processor state.  */
 typedef struct
 {
-  int version;
-  gregset_t gregs;
+  int __ctx(version);
+  gregset_t __ctx(gregs);
 } mcontext_t;
 
+#undef __ctx
+
 #ifdef __USE_MISC
 # define MCONTEXT_VERSION 1
 #endif
diff --git a/sysdeps/mips/sys/ucontext.h b/sysdeps/mips/sys/ucontext.h
index 137246f..3a19b53 100644
--- a/sysdeps/mips/sys/ucontext.h
+++ b/sysdeps/mips/sys/ucontext.h
@@ -39,10 +39,13 @@  typedef __uint64_t greg_t;
 #endif
 
 /* Number of general registers.  */
-#define NGREG	36
+#define __NGREG	36
+#ifdef __USE_MISC
+# define NGREG	__NGREG
+#endif
 
 /* Container for all general registers.  */
-typedef greg_t gregset_t[NGREG];
+typedef greg_t gregset_t[__NGREG];
 
 #ifdef __USE_MISC
 /* Number of each register is the `gregset_t' array.  */
@@ -123,32 +126,40 @@  enum
 };
 #endif
 
+#ifdef __USE_MISC
+# define __ctx(fld) fld
+#else
+# define __ctx(fld) __ ## fld
+#endif
+
 /* Structure to describe FPU registers.  */
 typedef struct fpregset
 {
   union
   {
 #if _MIPS_SIM == _ABIO32
-    double fp_dregs[16];
-    float fp_fregs[32];
-    unsigned int fp_regs[32];
+    double __ctx(fp_dregs)[16];
+    float __ctx(fp_fregs)[32];
+    unsigned int __ctx(fp_regs)[32];
 #else
-    double fp_dregs[32];
-    /* float fp_fregs[32]; */
-    __uint64_t fp_regs[32];
+    double __ctx(fp_dregs)[32];
+    /* float __ctx(fp_fregs)[32]; */
+    __uint64_t __ctx(fp_regs)[32];
 #endif
-  } fp_r;
-  unsigned int fp_csr;
-  unsigned int fp_pad;
+  } __ctx(fp_r);
+  unsigned int __ctx(fp_csr);
+  unsigned int __ctx(fp_pad);
 } fpregset_t;
 
 /* Context to describe whole processor state.  */
 typedef struct
 {
-  gregset_t gpregs;
-  fpregset_t fpregs;
+  gregset_t __ctx(gpregs);
+  fpregset_t __ctx(fpregs);
 } mcontext_t;
 
+#undef __ctx
+
 /* Userlevel context.  */
 typedef struct ucontext
 {
diff --git a/sysdeps/unix/sysv/linux/alpha/sys/ucontext.h b/sysdeps/unix/sysv/linux/alpha/sys/ucontext.h
index dc76e49..8f27112 100644
--- a/sysdeps/unix/sysv/linux/alpha/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/alpha/sys/ucontext.h
@@ -31,19 +31,25 @@ 
 typedef long int greg_t;
 
 /* Number of general registers.  */
-#define NGREG	33
+#define __NGREG	33
+#ifdef __USE_MISC
+# define NGREG	__NGREG
+#endif
 
 /* Container for all general registers.  */
-typedef greg_t gregset_t[NGREG];
+typedef greg_t gregset_t[__NGREG];
 
 /* Type for floating-point register.  */
 typedef long int fpreg_t;
 
 /* Number of general registers.  */
-#define NFPREG	32
+#define __NFPREG	32
+#ifdef __USE_MISC
+# define NFPREG	__NFPREG
+#endif
 
 /* Container for all general registers.  */
-typedef fpreg_t fpregset_t[NFPREG];
+typedef fpreg_t fpregset_t[__NFPREG];
 
 
 /* A machine context is exactly a sigcontext.  */
diff --git a/sysdeps/unix/sysv/linux/m68k/sys/ucontext.h b/sysdeps/unix/sysv/linux/m68k/sys/ucontext.h
index 3c5dce5..f28c9a2 100644
--- a/sysdeps/unix/sysv/linux/m68k/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/m68k/sys/ucontext.h
@@ -33,10 +33,13 @@ 
 typedef int greg_t;
 
 /* Number of general registers.  */
-#define NGREG	18
+#define __NGREG	18
+#ifdef __USE_MISC
+# define NGREG	__NGREG
+#endif
 
 /* Container for all general registers.  */
-typedef greg_t gregset_t[NGREG];
+typedef greg_t gregset_t[__NGREG];
 
 #ifdef __USE_MISC
 /* Number of each register is the `gregset_t' array.  */
@@ -83,27 +86,35 @@  enum
 };
 #endif
 
+#ifdef __USE_MISC
+# define __ctx(fld) fld
+#else
+# define __ctx(fld) __ ## fld
+#endif
+
 /* Structure to describe FPU registers.  */
 typedef struct fpregset
 {
-  int f_pcr;
-  int f_psr;
-  int f_fpiaddr;
+  int __ctx(f_pcr);
+  int __ctx(f_psr);
+  int __ctx(f_fpiaddr);
 #ifdef __mcoldfire__
-  int f_fpregs[8][2];
+  int __ctx(f_fpregs)[8][2];
 #else
-  int f_fpregs[8][3];
+  int __ctx(f_fpregs)[8][3];
 #endif
 } fpregset_t;
 
 /* Context to describe whole processor state.  */
 typedef struct
 {
-  int version;
-  gregset_t gregs;
-  fpregset_t fpregs;
+  int __ctx(version);
+  gregset_t __ctx(gregs);
+  fpregset_t __ctx(fpregs);
 } mcontext_t;
 
+#undef __ctx
+
 #ifdef __USE_MISC
 # define MCONTEXT_VERSION 2
 #endif
diff --git a/sysdeps/unix/sysv/linux/mips/sys/ucontext.h b/sysdeps/unix/sysv/linux/mips/sys/ucontext.h
index f766dac..f8d829c 100644
--- a/sysdeps/unix/sysv/linux/mips/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/mips/sys/ucontext.h
@@ -35,21 +35,31 @@ 
 __extension__ typedef unsigned long long int greg_t;
 
 /* Number of general registers.  */
-#define NGREG	32
-#define NFPREG	32
+#define __NGREG	32
+#define __NFPREG	32
+#ifdef __USE_MISC
+# define NGREG	__NGREG
+# define NFPREG	__NFPREG
+#endif
 
 /* Container for all general registers.  */
-typedef greg_t gregset_t[NGREG];
+typedef greg_t gregset_t[__NGREG];
+
+#ifdef __USE_MISC
+# define __ctx(fld) fld
+#else
+# define __ctx(fld) __ ## fld
+#endif
 
 /* Container for all FPU registers.  */
 typedef struct fpregset {
 	union {
-		double	fp_dregs[NFPREG];
+		double	__ctx(fp_dregs)[__NFPREG];
 		struct {
 			float		_fp_fregs;
 			unsigned int	_fp_pad;
-		} fp_fregs[NFPREG];
-	} fp_r;
+		} __ctx(fp_fregs)[__NFPREG];
+	} __ctx(fp_r);
 } fpregset_t;
 
 
@@ -62,46 +72,48 @@  typedef struct fpregset {
    still be rectified.  */
 typedef struct
   {
-    unsigned int regmask;
-    unsigned int status;
-    greg_t pc;
-    gregset_t gregs;
-    fpregset_t fpregs;
-    unsigned int fp_owned;
-    unsigned int fpc_csr;
-    unsigned int fpc_eir;
-    unsigned int used_math;
-    unsigned int dsp;
-    greg_t mdhi;
-    greg_t mdlo;
-    unsigned long hi1;
-    unsigned long lo1;
-    unsigned long hi2;
-    unsigned long lo2;
-    unsigned long hi3;
-    unsigned long lo3;
+    unsigned int __ctx(regmask);
+    unsigned int __ctx(status);
+    greg_t __ctx(pc);
+    gregset_t __ctx(gregs);
+    fpregset_t __ctx(fpregs);
+    unsigned int __ctx(fp_owned);
+    unsigned int __ctx(fpc_csr);
+    unsigned int __ctx(fpc_eir);
+    unsigned int __ctx(used_math);
+    unsigned int __ctx(dsp);
+    greg_t __ctx(mdhi);
+    greg_t __ctx(mdlo);
+    unsigned long __ctx(hi1);
+    unsigned long __ctx(lo1);
+    unsigned long __ctx(hi2);
+    unsigned long __ctx(lo2);
+    unsigned long __ctx(hi3);
+    unsigned long __ctx(lo3);
   } mcontext_t;
 #else
 typedef struct
   {
-    gregset_t gregs;
-    fpregset_t fpregs;
-    greg_t mdhi;
-    greg_t hi1;
-    greg_t hi2;
-    greg_t hi3;
-    greg_t mdlo;
-    greg_t lo1;
-    greg_t lo2;
-    greg_t lo3;
-    greg_t pc;
-    unsigned int fpc_csr;
-    unsigned int used_math;
-    unsigned int dsp;
+    gregset_t __ctx(gregs);
+    fpregset_t __ctx(fpregs);
+    greg_t __ctx(mdhi);
+    greg_t __ctx(hi1);
+    greg_t __ctx(hi2);
+    greg_t __ctx(hi3);
+    greg_t __ctx(mdlo);
+    greg_t __ctx(lo1);
+    greg_t __ctx(lo2);
+    greg_t __ctx(lo3);
+    greg_t __ctx(pc);
+    unsigned int __ctx(fpc_csr);
+    unsigned int __ctx(used_math);
+    unsigned int __ctx(dsp);
     unsigned int __glibc_reserved1;
   } mcontext_t;
 #endif
 
+#undef __ctx
+
 /* Userlevel context.  */
 typedef struct ucontext
   {
diff --git a/sysdeps/unix/sysv/linux/nios2/sys/ucontext.h b/sysdeps/unix/sysv/linux/nios2/sys/ucontext.h
index 3b0a615..01e4d2b 100644
--- a/sysdeps/unix/sysv/linux/nios2/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/nios2/sys/ucontext.h
@@ -36,13 +36,21 @@ 
 # define MCONTEXT_VERSION 2
 #endif
 
+#ifdef __USE_MISC
+# define __ctx(fld) fld
+#else
+# define __ctx(fld) __ ## fld
+#endif
+
 /* Context to describe whole processor state.  */
 typedef struct mcontext
   {
-    int version;
-    unsigned long regs[32];
+    int __ctx(version);
+    unsigned long __ctx(regs)[32];
   } mcontext_t;
 
+#undef __ctx
+
 /* Userlevel context.  */
 typedef struct ucontext
   {
diff --git a/sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h b/sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h
index c3f9622..883974d 100644
--- a/sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h
@@ -28,19 +28,28 @@ 
 #include <bits/sigstack.h>
 
 
+#ifdef __USE_MISC
+# define __ctx(fld) fld
+#else
+# define __ctx(fld) __ ## fld
+#endif
+
 #if __WORDSIZE == 32
 
 /* Number of general registers.  */
-# define NGREG	48
+# define __NGREG	48
+# ifdef __USE_MISC
+#  define NGREG	__NGREG
+# endif
 
 /* Container for all general registers.  */
-typedef unsigned long gregset_t[NGREG];
+typedef unsigned long gregset_t[__NGREG];
 
 /* Container for floating-point registers and status */
 typedef struct _libc_fpstate
 {
-	double fpregs[32];
-	double fpscr;
+	double __ctx(fpregs)[32];
+	double __ctx(fpscr);
 	unsigned int _pad[2];
 } fpregset_t;
 
@@ -48,18 +57,18 @@  typedef struct _libc_fpstate
    Needs to be aligned on a 16-byte boundary. */
 typedef struct _libc_vrstate
 {
-	unsigned int vrregs[32][4];
-	unsigned int vrsave;
+	unsigned int __ctx(vrregs)[32][4];
+	unsigned int __ctx(vrsave);
 	unsigned int _pad[2];
-	unsigned int vscr;
+	unsigned int __ctx(vscr);
 } vrregset_t;
 
 /* Context to describe whole processor state.  */
 typedef struct
 {
-	gregset_t gregs;
-	fpregset_t fpregs;
-	vrregset_t vrregs __attribute__((__aligned__(16)));
+	gregset_t __ctx(gregs);
+	fpregset_t __ctx(fpregs);
+	vrregset_t __ctx(vrregs) __attribute__((__aligned__(16)));
 } mcontext_t;
 
 #else
@@ -73,12 +82,18 @@  typedef struct
  * is set in AT_HWCAP.  */
 
 /* Number of general registers.  */
-# define NGREG	48	/* includes r0-r31, nip, msr, lr, etc.   */
-# define NFPREG	33	/* includes fp0-fp31 &fpscr.  */
-# define NVRREG	34	/* includes v0-v31, vscr, & vrsave in split vectors */
-
-typedef unsigned long gregset_t[NGREG];
-typedef double fpregset_t[NFPREG];
+# define __NGREG	48	/* includes r0-r31, nip, msr, lr, etc.   */
+# define __NFPREG	33	/* includes fp0-fp31 &fpscr.  */
+# define __NVRREG	34	/* includes v0-v31, vscr, & vrsave in
+				   split vectors */
+# ifdef __USE_MISC
+#  define NGREG	__NGREG
+#  define NFPREG	__NFPREG
+#  define NVRREG	__NVRREG
+# endif
+
+typedef unsigned long gregset_t[__NGREG];
+typedef double fpregset_t[__NFPREG];
 
 /* Container for Altivec/VMX Vector Status and Control Register.  Only 32-bits
    but can only be copied to/from a 128-bit vector register.  So we allocated
@@ -86,28 +101,28 @@  typedef double fpregset_t[NFPREG];
 typedef struct _libc_vscr
 {
 	unsigned int __pad[3];
-	unsigned int vscr_word;
+	unsigned int __ctx(vscr_word);
 } vscr_t;
 
 /* Container for Altivec/VMX registers and status.
    Must to be aligned on a 16-byte boundary. */
 typedef struct _libc_vrstate
 {
-	unsigned int	vrregs[32][4];
-	vscr_t		vscr;
-	unsigned int	vrsave;
+	unsigned int	__ctx(vrregs)[32][4];
+	vscr_t		__ctx(vscr);
+	unsigned int	__ctx(vrsave);
 	unsigned int	__pad[3];
 } vrregset_t  __attribute__((__aligned__(16)));
 
 typedef struct {
 	unsigned long	__glibc_reserved[4];
-	int		signal;
+	int		__ctx(signal);
 	int		__pad0;
-	unsigned long	handler;
-	unsigned long	oldmask;
-	struct pt_regs	*regs;
-	gregset_t	gp_regs;
-	fpregset_t	fp_regs;
+	unsigned long	__ctx(handler);
+	unsigned long	__ctx(oldmask);
+	struct pt_regs	*__ctx(regs);
+	gregset_t	__ctx(gp_regs);
+	fpregset_t	__ctx(fp_regs);
 /*
  * To maintain compatibility with current implementations the sigcontext is
  * extended by appending a pointer (v_regs) to a quadword type (elf_vrreg_t)
@@ -127,12 +142,14 @@  typedef struct {
  * The entry with index 33 contains the vrsave as the first word (offset 0)
  * within the quadword.
  */
-	vrregset_t	*v_regs;
-	long		vmx_reserve[NVRREG+NVRREG+1];
+	vrregset_t	*__ctx(v_regs);
+	long		__ctx(vmx_reserve)[__NVRREG+__NVRREG+1];
 } mcontext_t;
 
 #endif
 
+#undef __ctx
+
 /* Userlevel context.  */
 typedef struct ucontext
   {
diff --git a/sysdeps/unix/sysv/linux/s390/sys/ucontext.h b/sysdeps/unix/sysv/linux/s390/sys/ucontext.h
index 9790c0c..eb749f9 100644
--- a/sysdeps/unix/sysv/linux/s390/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/s390/sys/ucontext.h
@@ -28,11 +28,17 @@ 
 #include <bits/sigstack.h>
 
 
+#ifdef __USE_MISC
+# define __ctx(fld) fld
+#else
+# define __ctx(fld) __ ## fld
+#endif
+
 /* Type for a program status word.  */
 typedef struct
 {
-  unsigned long mask;
-  unsigned long addr;
+  unsigned long __ctx(mask);
+  unsigned long __ctx(addr);
 } __attribute__ ((__aligned__(8))) __psw_t;
 
 /* Type for a general-purpose register.  */
@@ -44,35 +50,40 @@  typedef unsigned long greg_t;
    that has the same size as s390_regs.  This is needed for the
    elf_prstatus structure.  */
 #if __WORDSIZE == 64
-# define NGREG 27
+# define __NGREG 27
 #else
-# define NGREG 36
+# define __NGREG 36
+#endif
+#ifdef __USE_MISC
+# define NGREG __NGREG
 #endif
 /* Must match kernels psw_t alignment.  */
-typedef greg_t gregset_t[NGREG] __attribute__ ((__aligned__(8)));
+typedef greg_t gregset_t[__NGREG] __attribute__ ((__aligned__(8)));
 
 typedef union
   {
-    double  d;
-    float   f;
+    double  __ctx(d);
+    float   __ctx(f);
   } fpreg_t;
 
 /* Register set for the floating-point registers.  */
 typedef struct
   {
-    unsigned int fpc;
-    fpreg_t fprs[16];
+    unsigned int __ctx(fpc);
+    fpreg_t __ctx(fprs)[16];
   } fpregset_t;
 
 /* Context to describe whole processor state.  */
 typedef struct
   {
-    __psw_t psw;
-    unsigned long gregs[16];
-    unsigned int aregs[16];
-    fpregset_t fpregs;
+    __psw_t __ctx(psw);
+    unsigned long __ctx(gregs)[16];
+    unsigned int __ctx(aregs)[16];
+    fpregset_t __ctx(fpregs);
   } mcontext_t;
 
+#undef __ctx
+
 /* Userlevel context.  */
 typedef struct ucontext
   {
diff --git a/sysdeps/unix/sysv/linux/sh/sys/ucontext.h b/sysdeps/unix/sysv/linux/sh/sys/ucontext.h
index 5c6a5e4..6d2fa39 100644
--- a/sysdeps/unix/sysv/linux/sh/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/sh/sys/ucontext.h
@@ -32,10 +32,13 @@ 
 typedef int greg_t;
 
 /* Number of general registers.  */
-#define NGREG	16
+#define __NGREG	16
+#ifdef __USE_MISC
+# define NGREG	__NGREG
+#endif
 
 /* Container for all general registers.  */
-typedef greg_t gregset_t[NGREG];
+typedef greg_t gregset_t[__NGREG];
 
 #ifdef __USE_MISC
 /* Number of each register is the `gregset_t' array.  */
@@ -79,29 +82,40 @@  enum
 typedef int freg_t;
 
 /* Number of FPU registers.  */
-#define NFPREG	16
+#define __NFPREG	16
+#ifdef __USE_MISC
+# define NFPREG	__NFPREG
+#endif
 
 /* Structure to describe FPU registers.  */
-typedef freg_t fpregset_t[NFPREG];
+typedef freg_t fpregset_t[__NFPREG];
+
+#ifdef __USE_MISC
+# define __ctx(fld) fld
+#else
+# define __ctx(fld) __ ## fld
+#endif
 
 /* Context to describe whole processor state.  */
 typedef struct
   {
-    unsigned int oldmask;
-    gregset_t gregs;
-    unsigned int pc;
-    unsigned int pr;
-    unsigned int sr;
-    unsigned int gbr;
-    unsigned int mach;
-    unsigned int macl;
-    fpregset_t fpregs;
-    fpregset_t xfpregs;
-    unsigned int fpscr;
-    unsigned int fpul;
-    unsigned int ownedfp;
+    unsigned int __ctx(oldmask);
+    gregset_t __ctx(gregs);
+    unsigned int __ctx(pc);
+    unsigned int __ctx(pr);
+    unsigned int __ctx(sr);
+    unsigned int __ctx(gbr);
+    unsigned int __ctx(mach);
+    unsigned int __ctx(macl);
+    fpregset_t __ctx(fpregs);
+    fpregset_t __ctx(xfpregs);
+    unsigned int __ctx(fpscr);
+    unsigned int __ctx(fpul);
+    unsigned int __ctx(ownedfp);
   } mcontext_t;
 
+#undef __ctx
+
 /* Userlevel context.  */
 typedef struct ucontext
   {
diff --git a/sysdeps/unix/sysv/linux/x86/sys/ucontext.h b/sysdeps/unix/sysv/linux/x86/sys/ucontext.h
index 6dad48f..974d38c 100644
--- a/sysdeps/unix/sysv/linux/x86/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/x86/sys/ucontext.h
@@ -27,16 +27,25 @@ 
 #include <bits/sigstack.h>
 
 
+#ifdef __USE_MISC
+# define __ctx(fld) fld
+#else
+# define __ctx(fld) __ ## fld
+#endif
+
 #ifdef __x86_64__
 
 /* Type for general register.  */
 __extension__ typedef long long int greg_t;
 
 /* Number of general registers.  */
-#define NGREG	23
+#define __NGREG	23
+#ifdef __USE_MISC
+# define NGREG	__NGREG
+#endif
 
 /* Container for all general registers.  */
-typedef greg_t gregset_t[NGREG];
+typedef greg_t gregset_t[__NGREG];
 
 #ifdef __USE_GNU
 /* Number of each register in the `gregset_t' array.  */
@@ -93,8 +102,8 @@  enum
 
 struct _libc_fpxreg
 {
-  unsigned short int significand[4];
-  unsigned short int exponent;
+  unsigned short int __ctx(significand)[4];
+  unsigned short int __ctx(exponent);
   unsigned short int __glibc_reserved1[3];
 };
 
@@ -106,14 +115,14 @@  struct _libc_xmmreg
 struct _libc_fpstate
 {
   /* 64-bit FXSAVE format.  */
-  __uint16_t		cwd;
-  __uint16_t		swd;
-  __uint16_t		ftw;
-  __uint16_t		fop;
-  __uint64_t		rip;
-  __uint64_t		rdp;
-  __uint32_t		mxcsr;
-  __uint32_t		mxcr_mask;
+  __uint16_t		__ctx(cwd);
+  __uint16_t		__ctx(swd);
+  __uint16_t		__ctx(ftw);
+  __uint16_t		__ctx(fop);
+  __uint64_t		__ctx(rip);
+  __uint64_t		__ctx(rdp);
+  __uint32_t		__ctx(mxcsr);
+  __uint32_t		__ctx(mxcr_mask);
   struct _libc_fpxreg	_st[8];
   struct _libc_xmmreg	_xmm[16];
   __uint32_t		__glibc_reserved1[24];
@@ -125,9 +134,9 @@  typedef struct _libc_fpstate *fpregset_t;
 /* Context to describe whole processor state.  */
 typedef struct
   {
-    gregset_t gregs;
+    gregset_t __ctx(gregs);
     /* Note that fpregs is a pointer.  */
-    fpregset_t fpregs;
+    fpregset_t __ctx(fpregs);
     __extension__ unsigned long long __reserved1 [8];
 } mcontext_t;
 
@@ -148,10 +157,13 @@  typedef struct ucontext
 typedef int greg_t;
 
 /* Number of general registers.  */
-#define NGREG	19
+#define __NGREG	19
+#ifdef __USE_MISC
+# define NGREG	__NGREG
+#endif
 
 /* Container for all general registers.  */
-typedef greg_t gregset_t[NGREG];
+typedef greg_t gregset_t[__NGREG];
 
 #ifdef __USE_GNU
 /* Number of each register is the `gregset_t' array.  */
@@ -201,21 +213,21 @@  enum
 /* Definitions taken from the kernel headers.  */
 struct _libc_fpreg
 {
-  unsigned short int significand[4];
-  unsigned short int exponent;
+  unsigned short int __ctx(significand)[4];
+  unsigned short int __ctx(exponent);
 };
 
 struct _libc_fpstate
 {
-  unsigned long int cw;
-  unsigned long int sw;
-  unsigned long int tag;
-  unsigned long int ipoff;
-  unsigned long int cssel;
-  unsigned long int dataoff;
-  unsigned long int datasel;
+  unsigned long int __ctx(cw);
+  unsigned long int __ctx(sw);
+  unsigned long int __ctx(tag);
+  unsigned long int __ctx(ipoff);
+  unsigned long int __ctx(cssel);
+  unsigned long int __ctx(dataoff);
+  unsigned long int __ctx(datasel);
   struct _libc_fpreg _st[8];
-  unsigned long int status;
+  unsigned long int __ctx(status);
 };
 
 /* Structure to describe FPU registers.  */
@@ -224,12 +236,12 @@  typedef struct _libc_fpstate *fpregset_t;
 /* Context to describe whole processor state.  */
 typedef struct
   {
-    gregset_t gregs;
+    gregset_t __ctx(gregs);
     /* Due to Linux's history we have to use a pointer here.  The SysV/i386
        ABI requires a struct with the values.  */
-    fpregset_t fpregs;
-    unsigned long int oldmask;
-    unsigned long int cr2;
+    fpregset_t __ctx(fpregs);
+    unsigned long int __ctx(oldmask);
+    unsigned long int __ctx(cr2);
   } mcontext_t;
 
 /* Userlevel context.  */
@@ -245,4 +257,6 @@  typedef struct ucontext
 
 #endif /* !__x86_64__ */
 
+#undef __ctx
+
 #endif /* sys/ucontext.h */