From patchwork Wed Jun 28 10:37:45 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joseph Myers X-Patchwork-Id: 21314 Received: (qmail 21208 invoked by alias); 28 Jun 2017 10:38:00 -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 21187 invoked by uid 89); 28 Jun 2017 10:37:59 -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=singles, POSSIBLE, fqu X-HELO: relay1.mentorg.com Date: Wed, 28 Jun 2017 10:37:45 +0000 From: Joseph Myers To: Zack Weinberg CC: , Subject: Re: Miscellaneous sys/ucontext.h namespace fixes (bug 21457) In-Reply-To: Message-ID: References: <7c4d9fb3-9ed3-810e-89b0-03564e716262@panix.com> 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) 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 > .... 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 [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 +#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;