]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Disable GCC 5 optimization when PROF is defined
authorH.J. Lu <hjl.tools@gmail.com>
Wed, 21 Oct 2015 16:07:46 +0000 (09:07 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Wed, 21 Oct 2015 16:07:46 +0000 (09:07 -0700)
Since asm ("ebp") can't be used to put the 6th argument in %ebp for
syscall when compiling for profiling, we disable GCC 5 optimization
when PROF is defined.

* sysdeps/unix/sysv/linux/i386/sysdep.h (OPTIMIZE_FOR_GCC_5):
New.  Defined for GCC 5 and above when not compiling for
profiling.
Replace __GNUC_PREREQ (5,0) with OPTIMIZE_FOR_GCC_5.

ChangeLog
sysdeps/unix/sysv/linux/i386/sysdep.h

index 358e2053bac964e44c32422b1c2895467968e8ca..deab22fa822dd1acc8f849cf031fdc6ead84e3ca 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2015-10-21  H.J. Lu  <hongjiu.lu@intel.com>
 
+       * sysdeps/unix/sysv/linux/i386/sysdep.h (OPTIMIZE_FOR_GCC_5):
+       New.  Defined for GCC 5 and above when not compiling for
+       profiling.
+       Replace __GNUC_PREREQ (5,0) with OPTIMIZE_FOR_GCC_5.
+
        * sysdeps/unix/sysv/linux/i386/Makefile (CFLAGS-epoll_pwait.c):
        Renamed to ...
        (CFLAGS-epoll_pwait.o): This.
index 76db7b8ab956982cfbb91209ac3892913c20f5a0..58305447d4caae58676b36fb3d0ce3c8c2c7857d 100644 (file)
@@ -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__                                                    \