Patchwork [5/6] Optimize i386 syscall inlining

login
register
mail settings
Submitter H.J. Lu
Date Oct. 21, 2015, 3:17 p.m.
Message ID <CAMe9rOrDR7MDbxgS7yHA4Q3=gVhQ-5PGjGsjZy01VgdHwSd3XA@mail.gmail.com>
Download mbox | patch
Permalink /patch/9292/
State New
Headers show

Comments

H.J. Lu - Oct. 21, 2015, 3:17 p.m.
On Wed, Oct 21, 2015 at 8:01 AM, Andreas Schwab <schwab@suse.de> wrote:
> "H.J. Lu" <hjl.tools@gmail.com> writes:
>
>> Which GCC are you using?
>
> https://build.opensuse.org/package/show/openSUSE:Factory/gcc5
>
> Andreas.

I am testing this patch and will check it in if it passes check.
Joseph Myers - Oct. 21, 2015, 4:39 p.m.
On Wed, 21 Oct 2015, H.J. Lu wrote:

> On Wed, Oct 21, 2015 at 8:01 AM, Andreas Schwab <schwab@suse.de> wrote:
> > "H.J. Lu" <hjl.tools@gmail.com> writes:
> >
> >> Which GCC are you using?
> >
> > https://build.opensuse.org/package/show/openSUSE:Factory/gcc5
> >
> > Andreas.
> 
> I am testing this patch and will check it in if it passes check.

Do you also need to change libc-do-syscall.S to build __libc_do_syscall 
for the profiling libc?

Patch

diff --git a/sysdeps/unix/sysv/linux/i386/sysdep.h
b/sysdeps/unix/sysv/linux/i386/sysdep.h
index 76db7b8..5830544 100644
--- a/sysdeps/unix/sysv/linux/i386/sysdep.h
+++ b/sysdeps/unix/sysv/linux/i386/sysdep.h
@@ -229,9 +229,15 @@  extern int __syscall_error (int)

 /* 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.  */
+   to compile glibc.  Disable GCC 5 optimization when compiling for
+   profiling since asm ("ebp") can't be used to put the 6th argument
+   in %ebp for syscall.  */

-#if !__GNUC_PREREQ (5,0)
+#if __GNUC_PREREQ (5,0) && !defined PROF
+# define OPTIMIZE_FOR_GCC_5
+#endif
+
+#ifndef OPTIMIZE_FOR_GCC_5
 /* We need some help from the assembler to generate optimal code.  We
    define some macros here which later will be used.  */
 asm (".L__X'%ebx = 1\n\t"
@@ -328,7 +334,7 @@  struct libc_do_syscall_args
     INTERNAL_SYSCALL_MAIN_INLINE(name, err, 5, args)
 /* Each object using 6-argument inline syscalls must include a
    definition of __libc_do_syscall.  */
-#if __GNUC_PREREQ (5,0)
+#ifdef OPTIMIZE_FOR_GCC_5
 # define INTERNAL_SYSCALL_MAIN_6(name, err, args...) \
     INTERNAL_SYSCALL_MAIN_INLINE(name, err, 6, args)
 #else /* GCC 5  */
@@ -353,7 +359,7 @@  struct libc_do_syscall_args
     INTERNAL_SYSCALL_MAIN_##nr (name, err, args);      \
     (int) resultvar; })
 #ifdef I386_USE_SYSENTER
-# if __GNUC_PREREQ (5,0)
+# ifdef OPTIMIZE_FOR_GCC_5
 #  ifdef SHARED
 #   define INTERNAL_SYSCALL_MAIN_INLINE(name, err, nr, args...) \
     LOADREGS_##nr(args) \
@@ -437,7 +443,7 @@  struct libc_do_syscall_args
 #  endif
 # endif /* GCC 5  */
 #else
-# if __GNUC_PREREQ (5,0)
+# ifdef OPTIMIZE_FOR_GCC_5
 #  define INTERNAL_SYSCALL_MAIN_INLINE(name, err, nr, args...) \
     LOADREGS_##nr(args) \
     asm volatile ( \
@@ -539,7 +545,7 @@  struct libc_do_syscall_args
 # define RESTOREARGS_5
 #endif

-#if __GNUC_PREREQ (5,0)
+#ifdef OPTIMIZE_FOR_GCC_5
 # define LOADREGS_0()
 # define ASMARGS_0()
 # define LOADREGS_1(arg1) \
@@ -606,7 +612,7 @@  struct libc_do_syscall_args
 #endif

 /* Consistency check for position-independent code.  */
-#if defined __PIC__ && !__GNUC_PREREQ (5,0)
+#if defined __PIC__ && !defined OPTIMIZE_FOR_GCC_5
 # define check_consistency()      \
   ({ int __res;      \
      __asm__ __volatile__