V2 [PATCH] i386: Remove build support for GCC older than GCC 6
H.J. Lu
hjl.tools@gmail.com
Tue Apr 7 13:51:32 GMT 2020
On Tue, Apr 7, 2020 at 6:41 AM Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
>
>
>
> On 06/04/2020 15:39, H.J. Lu wrote:
> > On Mon, Apr 6, 2020 at 10:38 AM Adhemerval Zanella via Libc-alpha
> > <libc-alpha@sourceware.org> wrote:
> >>
> >>
> >>
> >> On 06/04/2020 11:49, H.J. Lu via Libc-alpha wrote:
> >>
> >>> diff --git a/sysdeps/unix/sysv/linux/i386/sysdep.h b/sysdeps/unix/sysv/linux/i386/sysdep.h
> >>> index 6671afe65e..cfa562ecb0 100644
> >>> --- a/sysdeps/unix/sysv/linux/i386/sysdep.h
> >>> +++ b/sysdeps/unix/sysv/linux/i386/sysdep.h
> >>> @@ -43,15 +43,6 @@
> >>> # endif
> >>> #endif
> >>>
> >>> -/* Since GCC 5 and above can properly spill %ebx with PIC when needed,
> >>> - we can inline syscalls with 6 arguments if GCC 5 or above is used
> >>> - to compile glibc. Disable GCC 5 optimization when compiling for
> >>> - profiling or when -fno-omit-frame-pointer is used since asm ("ebp")
> >>> - can't be used to put the 6th argument in %ebp for syscall. */
> >>> -#if __GNUC_PREREQ (5,0) && !defined PROF && CAN_USE_REGISTER_ASM_EBP
> >>> -# define OPTIMIZE_FOR_GCC_5
> >>> -#endif
> >>> -
> >>
> >> Unfortunately we can't remove the alternate syscall mechanism that is
> >> usd for GCC older than 5, since it is used for -Os and
> >> -fno-omit-frame-pointer (CAN_USE_REGISTER_ASM_EBP).
> >
> > Here is the updated patch to remove __GNUC_PREREQ (5,0).
> >
>
> LGTM, thanks.
>
> Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> > diff --git a/sysdeps/i386/sysdep.h b/sysdeps/i386/sysdep.h
> > index 6094af8fec..2f786a251b 100644
> > --- a/sysdeps/i386/sysdep.h
> > +++ b/sysdeps/i386/sysdep.h
> > @@ -18,8 +18,6 @@
> >
> > #include <sysdeps/x86/sysdep.h>
> >
> > -#include <features.h> /* For __GNUC_PREREQ. */
> > -
> > /* It is desirable that the names of PIC thunks match those used by
> > GCC so that multiple copies are eliminated by the linker. Because
> > GCC 4.6 and earlier use __i686 in the names, it is necessary to
>
> Ok.
>
> > diff --git a/sysdeps/i386/tls-macros.h b/sysdeps/i386/tls-macros.h
> > index 053cba05d1..9c1303dc45 100644
> > --- a/sysdeps/i386/tls-macros.h
> > +++ b/sysdeps/i386/tls-macros.h
> > @@ -1,5 +1,3 @@
> > -#include <features.h> /* For __GNUC_PREREQ. */
> > -
> > #define TLS_LE(x) \
> > ({ int *__l; \
> > asm ("movl %%gs:0,%0\n\t" \
> > @@ -7,15 +5,7 @@
> > : "=r" (__l)); \
> > __l; })
> >
> > -#if defined PIC && !__GNUC_PREREQ (5,0)
> > -# define TLS_IE(x) \
> > - ({ int *__l; \
> > - asm ("movl %%gs:0,%0\n\t" \
> > - "subl " #x "@gottpoff(%%ebx),%0" \
> > - : "=r" (__l)); \
> > - __l; })
> > -#else
> > -# define TLS_IE(x) \
> > +#define TLS_IE(x) \
> > ({ int *__l, __b; \
> > asm ("call 1f\n\t" \
> > ".subsection 1\n" \
> > @@ -27,18 +17,8 @@
> > "subl " #x "@gottpoff(%%ebx),%0" \
> > : "=r" (__l), "=&b" (__b)); \
> > __l; })
> > -#endif
> >
> > -#if defined PIC && !__GNUC_PREREQ (5,0)
> > -# define TLS_LD(x) \
> > - ({ int *__l, __c, __d; \
> > - asm ("leal " #x "@tlsldm(%%ebx),%%eax\n\t" \
> > - "call ___tls_get_addr@plt\n\t" \
> > - "leal " #x "@dtpoff(%%eax), %%eax" \
> > - : "=a" (__l), "=&c" (__c), "=&d" (__d)); \
> > - __l; })
> > -#else
> > -# define TLS_LD(x) \
> > +#define TLS_LD(x) \
> > ({ int *__l, __b, __c, __d; \
> > asm ("call 1f\n\t" \
> > ".subsection 1\n" \
> > @@ -51,18 +31,8 @@
> > "leal " #x "@dtpoff(%%eax), %%eax" \
> > : "=a" (__l), "=&b" (__b), "=&c" (__c), "=&d" (__d)); \
> > __l; })
> > -#endif
> >
> > -#if defined PIC && !__GNUC_PREREQ (5,0)
> > -# define TLS_GD(x) \
> > - ({ int *__l, __c, __d; \
> > - asm ("leal " #x "@tlsgd(%%ebx),%%eax\n\t" \
> > - "call ___tls_get_addr@plt\n\t" \
> > - "nop" \
> > - : "=a" (__l), "=&c" (__c), "=&d" (__d)); \
> > - __l; })
> > -#else
> > -# define TLS_GD(x) \
> > +#define TLS_GD(x) \
> > ({ int *__l, __b, __c, __d; \
> > asm ("call 1f\n\t" \
> > ".subsection 1\n" \
> > @@ -75,4 +45,3 @@
> > "nop" \
> > : "=a" (__l), "=&b" (__b), "=&c" (__c), "=&d" (__d)); \
> > __l; })
> > -#endif
>
> Ok.
>
> > diff --git a/sysdeps/unix/sysv/linux/i386/sysdep.h b/sysdeps/unix/sysv/linux/i386/sysdep.h
> > index 6671afe65e..f6847a67e3 100644
> > --- a/sysdeps/unix/sysv/linux/i386/sysdep.h
> > +++ b/sysdeps/unix/sysv/linux/i386/sysdep.h
> > @@ -48,7 +48,7 @@
> > to compile glibc. Disable GCC 5 optimization when compiling for
> > profiling or when -fno-omit-frame-pointer is used since asm ("ebp")
> > can't be used to put the 6th argument in %ebp for syscall. */
> > -#if __GNUC_PREREQ (5,0) && !defined PROF && CAN_USE_REGISTER_ASM_EBP
> > +#if !defined PROF && CAN_USE_REGISTER_ASM_EBP
> > # define OPTIMIZE_FOR_GCC_5
> > #endif
> >
>
> Should we use CAN_USE_REGISTER_ASM_EBP instead of OPTIMIZE_FOR_GCC_5 to
> describe better what the multiple syscall mechanism are doing?
There is also !defined PROF.
> > @@ -580,21 +580,6 @@ struct libc_do_syscall_args
> > # define EXTRAVAR_5
> > #endif
> >
> > -/* Consistency check for position-independent code. Disabled for GCC 5
> > - and above since there is no fixed PIC register in GCC 5 and above. */
> > -#if defined __PIC__ && !__GNUC_PREREQ (5,0)
> > -# define check_consistency() \
> > - ({ int __res; \
> > - __asm__ __volatile__ \
> > - (LOAD_PIC_REG_STR (cx) ";" \
> > - "subl %%ebx, %%ecx;" \
> > - "je 1f;" \
> > - "ud2;" \
> > - "1:\n" \
> > - : "=c" (__res)); \
> > - __res; })
> > -#endif
> > -
> > #endif /* __ASSEMBLER__ */
> >
>
> Ok. For gcc version where -Os / -fno-omit-frame-pointer still sets
> CAN_USE_REGISTER_ASM_EBP, is this check still worth?
>
No. GCC 6 or above don't use EBX as the fixed PIC register.
--
H.J.
More information about the Libc-alpha
mailing list