From patchwork Mon Jun 19 22:26:29 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joseph Myers X-Patchwork-Id: 21124 Received: (qmail 14595 invoked by alias); 19 Jun 2017 22:26:36 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 14583 invoked by uid 89); 19 Jun 2017 22:26:36 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.4 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_PASS, URIBL_RED autolearn=ham version=3.3.2 spammy=filler, xrs, fqu X-HELO: relay1.mentorg.com Date: Mon, 19 Jun 2017 22:26:29 +0000 From: Joseph Myers To: Subject: Miscellaneous sys/ucontext.h namespace fixes (bug 21457) Message-ID: User-Agent: Alpine 2.20 (DEB 67 2015-01-07) MIME-Version: 1.0 X-ClientProxiedBy: svr-ies-mbx-01.mgc.mentorg.com (139.181.222.1) To svr-ies-mbx-01.mgc.mentorg.com (139.181.222.1) This patch fixes various miscellaneous namespace issues in sys/ucontext.h headers. Some struct tags are removed where the structs also have *_t typedef names, while other struct tags without such names are renamed to start __; the changes are noted in NEWS as they can affect C++ name mangling (although there seems to be little if any external use of these types, at least based on checking codesearch.debian.net). For powerpc, pointers to struct pt_regs (not defined in this header) are changed to point to struct __ctx(pt_regs), so in the __USE_MISC case those struct fields continue to point to the existing struct pt_regs type for maximum compatibility, while when that's a namespace issue they point to a struct __pt_regs type which is always an incomplete struct. Various such changes and others are made to the SPARC header, which was excluded from some previous patches because of its complexity. Tested for affected architectures with build-many-glibcs.py. 2017-06-19 Joseph Myers [BZ #21457] * sysdeps/unix/sysv/linux/m68k/sys/ucontext.h (fpregset_t): Remove struct tag. * sysdeps/unix/sysv/linux/mips/sys/ucontext.h (fpregset_t): Likewise. * sysdeps/unix/sysv/linux/nios2/sys/ucontext.h (mcontext_t): Likewise. * sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h (pt_regs): Declare struct type with __ctx. [__WORDSIZE != 32] (mcontext_t): Use __ctx with pt_regs struct tag. (ucontext_t) [__WORDSIZE == 32]: Use __ctx with pt_regs struct tag and regs field name. * 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 f81d02f..c9a364b 100644 --- a/NEWS +++ b/NEWS @@ -84,6 +84,15 @@ Version 2.26 * The stack_t type no longer has the name struct sigaltstack. This changes the C++ name mangling for interfaces involving this type. +* 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. 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 the spin lock's memory location. This ensures correct synchronization diff --git a/sysdeps/unix/sysv/linux/m68k/sys/ucontext.h b/sysdeps/unix/sysv/linux/m68k/sys/ucontext.h index e6ecbe6..f2353f6 100644 --- a/sysdeps/unix/sysv/linux/m68k/sys/ucontext.h +++ b/sysdeps/unix/sysv/linux/m68k/sys/ucontext.h @@ -91,7 +91,7 @@ enum #endif /* Structure to describe FPU registers. */ -typedef struct fpregset +typedef struct { int __ctx(f_pcr); int __ctx(f_psr); diff --git a/sysdeps/unix/sysv/linux/mips/sys/ucontext.h b/sysdeps/unix/sysv/linux/mips/sys/ucontext.h index 048e9a4..0e98482 100644 --- a/sysdeps/unix/sysv/linux/mips/sys/ucontext.h +++ b/sysdeps/unix/sysv/linux/mips/sys/ucontext.h @@ -50,7 +50,7 @@ typedef greg_t gregset_t[__NGREG]; #endif /* Container for all FPU registers. */ -typedef struct fpregset { +typedef struct { union { double __ctx(fp_dregs)[__NFPREG]; struct { diff --git a/sysdeps/unix/sysv/linux/nios2/sys/ucontext.h b/sysdeps/unix/sysv/linux/nios2/sys/ucontext.h index af8d75c..faa3aca 100644 --- a/sysdeps/unix/sysv/linux/nios2/sys/ucontext.h +++ b/sysdeps/unix/sysv/linux/nios2/sys/ucontext.h @@ -41,7 +41,7 @@ #endif /* Context to describe whole processor state. */ -typedef struct mcontext +typedef struct { int __ctx(version); unsigned long __ctx(regs)[32]; diff --git a/sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h b/sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h index b460f23..7d25fb8 100644 --- a/sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h +++ b/sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h @@ -31,6 +31,8 @@ # define __ctx(fld) __ ## fld #endif +struct __ctx(pt_regs); + #if __WORDSIZE == 32 /* Number of general registers. */ @@ -117,7 +119,7 @@ typedef struct { int __pad0; unsigned long __ctx(handler); unsigned long __ctx(oldmask); - struct pt_regs *__ctx(regs); + struct __ctx(pt_regs) *__ctx(regs); gregset_t __ctx(gp_regs); fpregset_t __ctx(fp_regs); /* @@ -145,8 +147,6 @@ typedef struct { #endif -#undef __ctx - /* Userlevel context. */ typedef struct ucontext { @@ -179,7 +179,7 @@ typedef struct ucontext */ int uc_pad[7]; union uc_regs_ptr { - struct pt_regs *regs; + struct __ctx(pt_regs) *__ctx(regs); mcontext_t *uc_regs; } uc_mcontext; sigset_t uc_sigmask; @@ -190,4 +190,6 @@ typedef struct ucontext #endif } ucontext_t; +#undef __ctx + #endif /* sys/ucontext.h */ 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 7ce5f2b..4c3d29b 100644 --- a/sysdeps/unix/sysv/linux/sparc/sys/ucontext.h +++ b/sysdeps/unix/sysv/linux/sparc/sys/ucontext.h @@ -27,59 +27,69 @@ #include +#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 { @@ -97,25 +107,27 @@ typedef struct ucontext { * 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 { #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;