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