Message ID | 0e80c379-4c5b-9d00-7331-6c4035fac5e2@linaro.org |
---|---|
State | New |
Headers | show |
On Fri, Feb 17, 2017 at 6:47 AM, Adhemerval Zanella <adhemerval.zanella@linaro.org> wrote: > > > On 16/02/2017 17:24, H.J. Lu wrote: >> On Mon, Jan 9, 2017 at 4:55 AM, Adhemerval Zanella >>> +# Check if CFLAGS sets -fno-omit-frame-pointer >>> +AC_CACHE_CHECK(for if compiler flags sets -fno-omit-frame-pointer, >>> + libc_cv_no_omit_frame_pointer, >>> + [cat > conftest.c << EOF >>> + void foo (void) { } >>> +EOF >>> + libc_cv_no_omit_frame_pointer=no >>> + if AC_TRY_COMMAND(${CC-cc} $CFLAGS -S conftest.c -o conftest.s 1>&AS_MESSAGE_LOG_FD); then >>> + if grep 'push.*%ebp' conftest.s >/dev/null && >>> + grep 'pop.*%ebp' conftest.s >/dev/null; then >>> + libc_cv_no_omit_frame_pointer=yes >>> + fi >>> + fi >>> + rm -f conftest.c conftest.s >>> + ]) >> >> I prefer something like >> >> [hjl@gnu-fer something like >> >> [hjl@gnu-6 tmp]$ cat ebp.c >> void >> foo (int i) >> { >> register int reg asm ("ebp") = i; >> asm ("# %0" : : "r" (reg)); >> } >> [hjl@gnu-6 tmp]$ gcc -S -m32 -Os ebp.c >> ebp.c: In function ‘foo’: >> ebp.c:6:1: error: bp cannot be used in asm here >> } >> ^ >> [hjl@gnu-6 tmp]$ gcc -S -m32 -O2 ebp.c >> [hjl@gnu-6 tmp]$ >> >>> +if test $libc_cv_no_omit_frame_pointer = yes; then >>> + AC_DEFINE(NO_OMIT_FRAME_POINTER) >>> +fi >> >> How about something like CAN_USE_REGISTER_ASM_EBP? > > I implemented both your suggestions in this version: > > [BZ #21029] > * config.h.in [CAN_USE_REGISTER_ASM_EBP]: New define. > * sysdeps/unix/sysv/linux/i386/Makefile > [$(subdir) = elf] (sysdep-dl-routines): Add libc-do-syscall. > (uses-6-syscall-arguments): Remove. > [$(subdir) = misc] (CFLAGS-epoll_pwait.o): Likewise. > [$(subdir) = misc] (CFLAGS-epoll_pwait.os): Likewise. > [$(subdir) = misc] (CFLAGS-mmap.o): Likewise. > [$(subdir) = misc] (CFLAGS-mmap.os): Likewise. > [$(subdir) = misc] (CFLAGS-mmap64.o): Likewise. > [$(subdir) = misc] (CFLAGS-mmap64.os): Likewise. > [$(subdir) = misc] (CFLAGS-pselect.o): Likewise. > [$(subdir) = misc] (cflags-pselect.o): Likewise. > [$(subdir) = misc] (cflags-pselect.os): Likewise. > [$(subdir) = misc] (cflags-rtld-mmap.os): Likewise. > [$(subdir) = sysvipc] (cflags-semtimedop.o): Likewise. > [$(subdir) = sysvipc] (cflags-semtimedop.os): Likewise. > [$(subdir) = io] (CFLAGS-posix_fadvise64.o): Likewise. > [$(subdir) = io] (CFLAGS-posix_fadvise64.os): Likewise. > [$(subdir) = io] (CFLAGS-posix_fallocate.o): Likewise. > [$(subdir) = io] (CFLAGS-posix_fallocate.os): Likewise. > [$(subdir) = io] (CFLAGS-posix_fallocate64.o): Likewise. > [$(subdir) = io] (CFLAGS-posix_fallocate64.os): Likewise. > [$(subdir) = io] (CFLAGS-sync_file_range.o): Likewise. > [$(subdir) = io] (CFLAGS-sync_file_range.os): Likewise. > [$(subdir) = io] (CFLAGS-fallocate.o): Likewise. > [$(subdir) = io] (CFLAGS-fallocate.os): Likewise. > [$(subdir) = io] (CFLAGS-fallocate64.o): Likewise. > [$(subdir) = io] (CFLAGS-fallocate64.os): Likewise. > [$(subdir) = nptl] (CFLAGS-pthread_rwlock_timedrdlock.o): > Likewise. > [$(subdir) = nptl] (CFLAGS-pthread_rwlock_timedrdlock.os): > Likewise. > [$(subdir) = nptl] (CFLAGS-pthread_rwlock_timedrwlock.o): > Likewise. > [$(subdir) = nptl] (CFLAGS-pthread_rwlock_timedrwlock.os): > Likewise. > [$(subdir) = nptl] (CFLAGS-sem_wait.o): Likewise. > [$(subdir) = nptl] (CFLAGS-sem_wait.os): Likewise. > [$(subdir) = nptl] (CFLAGS-sem_timedwait.o): Likewise. > [$(subdir) = nptl] (CFLAGS-sem_timedwait.os): Likewise. > * sysdeps/unix/sysv/linux/i386/configure.ac: Add check if compiler allows > ebp on inline assembly. > * sysdeps/unix/sysv/linux/i386/configure: Regenerate. > * sysdeps/unix/sysv/linux/i386/sysdep.h (OPTIMIZE_FOR_GCC_5): > Set if CAN_USE_REGISTER_ASM_EBP is set. > (check_consistency): Likewise. > --- > > diff --git a/config.h.in b/config.h.in > index 7bfe923..fb2cc51 100644 > --- a/config.h.in > +++ b/config.h.in > @@ -259,4 +259,8 @@ > /* Build glibc with tunables support. */ > #define HAVE_TUNABLES 0 > > +/* Some compiler options may now allow to use ebp in __asm__ (used mainly > + in i386 6 argument syscall issue). */ > +#define CAN_USE_REGISTER_ASM_EBP 0 > + > #endif > diff --git a/sysdeps/unix/sysv/linux/i386/Makefile b/sysdeps/unix/sysv/linux/i386/Makefile > index 9609752..6aac0df 100644 > --- a/sysdeps/unix/sysv/linux/i386/Makefile > +++ b/sysdeps/unix/sysv/linux/i386/Makefile > @@ -1,47 +1,18 @@ > # The default ABI is 32. > default-abi := 32 > > -# %ebp is used to pass the 6th argument to system calls, so these > -# system calls are incompatible with a frame pointer. > -uses-6-syscall-arguments = -fomit-frame-pointer > - > ifeq ($(subdir),misc) > sysdep_routines += ioperm iopl vm86 > -CFLAGS-epoll_pwait.o += $(uses-6-syscall-arguments) > -CFLAGS-epoll_pwait.os += $(uses-6-syscall-arguments) > -CFLAGS-mmap.o += $(uses-6-syscall-arguments) > -CFLAGS-mmap.os += $(uses-6-syscall-arguments) > -CFLAGS-mmap64.o += $(uses-6-syscall-arguments) > -CFLAGS-mmap64.os += $(uses-6-syscall-arguments) > -CFLAGS-pselect.o += $(uses-6-syscall-arguments) > -CFLAGS-pselect.os += $(uses-6-syscall-arguments) > -CFLAGS-rtld-mmap.os += $(uses-6-syscall-arguments) > -endif > - > -ifeq ($(subdir),sysvipc) > -CFLAGS-semtimedop.o += $(uses-6-syscall-arguments) > -CFLAGS-semtimedop.os += $(uses-6-syscall-arguments) > endif > > ifeq ($(subdir),elf) > +sysdep-dl-routines += libc-do-syscall > sysdep-others += lddlibc4 > install-bin += lddlibc4 > endif > > ifeq ($(subdir),io) > sysdep_routines += libc-do-syscall > -CFLAGS-posix_fadvise64.o += $(uses-6-syscall-arguments) > -CFLAGS-posix_fadvise64.os += $(uses-6-syscall-arguments) > -CFLAGS-posix_fallocate.o += $(uses-6-syscall-arguments) > -CFLAGS-posix_fallocate.os += $(uses-6-syscall-arguments) > -CFLAGS-posix_fallocate64.o += $(uses-6-syscall-arguments) > -CFLAGS-posix_fallocate64.os += $(uses-6-syscall-arguments) > -CFLAGS-sync_file_range.o += $(uses-6-syscall-arguments) > -CFLAGS-sync_file_range.os += $(uses-6-syscall-arguments) > -CFLAGS-fallocate.o += $(uses-6-syscall-arguments) > -CFLAGS-fallocate.os += $(uses-6-syscall-arguments) > -CFLAGS-fallocate64.o += $(uses-6-syscall-arguments) > -CFLAGS-fallocate64.os += $(uses-6-syscall-arguments) > endif > > ifeq ($(subdir),nptl) > @@ -61,14 +32,6 @@ ifeq ($(subdir),nptl) > # pull in __syscall_error routine > libpthread-routines += sysdep > libpthread-shared-only-routines += sysdep > -CFLAGS-pthread_rwlock_timedrdlock.o += $(uses-6-syscall-arguments) > -CFLAGS-pthread_rwlock_timedrdlock.os += $(uses-6-syscall-arguments) > -CFLAGS-pthread_rwlock_timedwrlock.o += $(uses-6-syscall-arguments) > -CFLAGS-pthread_rwlock_timedwrlock.os += $(uses-6-syscall-arguments) > -CFLAGS-sem_wait.o += $(uses-6-syscall-arguments) > -CFLAGS-sem_wait.os += $(uses-6-syscall-arguments) > -CFLAGS-sem_timedwait.o += $(uses-6-syscall-arguments) > -CFLAGS-sem_timedwait.os += $(uses-6-syscall-arguments) > endif > > ifeq ($(subdir),rt) > diff --git a/sysdeps/unix/sysv/linux/i386/configure b/sysdeps/unix/sysv/linux/i386/configure > index eb72659..ae2c356 100644 > --- a/sysdeps/unix/sysv/linux/i386/configure > +++ b/sysdeps/unix/sysv/linux/i386/configure > @@ -3,5 +3,44 @@ > > arch_minimum_kernel=2.6.32 > > +# Check if CFLAGS allows compiler to use ebp register in inline assembly. > + > +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler flags allows ebp in inline assembly" >&5 > +$as_echo_n "checking if compiler flags allows ebp in inline assembly... " >&6; } > +if ${libc_cv_can_use_register_asm_ebp+:} false; then : > + $as_echo_n "(cached) " >&6 > +else > + > +cat confdefs.h - <<_ACEOF >conftest.$ac_ext > +/* end confdefs.h. */ > + > + void foo (int i) > + { > + register int reg asm ("ebp") = i; > + asm ("# %0" : : "r" (reg)); > + } > +int > +main () > +{ > + > + ; > + return 0; > +} > +_ACEOF > +if ac_fn_c_try_compile "$LINENO"; then : > + libc_cv_can_use_register_asm_ebp=yes > +else > + libc_cv_can_use_register_asm_ebp=no > +fi > +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext > + > +fi > +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_can_use_register_asm_ebp" >&5 > +$as_echo "$libc_cv_can_use_register_asm_ebp" >&6; } > +if test $libc_cv_can_use_register_asm_ebp = yes; then > + $as_echo "#define CAN_USE_REGISTER_ASM_EBP 1" >>confdefs.h > + > +fi > + > libc_cv_gcc_unwind_find_fde=yes > ldd_rewrite_script=sysdeps/unix/sysv/linux/ldd-rewrite.sed > diff --git a/sysdeps/unix/sysv/linux/i386/configure.ac b/sysdeps/unix/sysv/linux/i386/configure.ac > index 1a11da6..1cd632e 100644 > --- a/sysdeps/unix/sysv/linux/i386/configure.ac > +++ b/sysdeps/unix/sysv/linux/i386/configure.ac > @@ -3,5 +3,22 @@ GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory. > > arch_minimum_kernel=2.6.32 > > +# Check if CFLAGS allows compiler to use ebp register in inline assembly. > +AC_CACHE_CHECK([if compiler flags allows ebp in inline assembly], > + libc_cv_can_use_register_asm_ebp, [ > +AC_COMPILE_IFELSE( > + [AC_LANG_PROGRAM([ > + void foo (int i) > + { > + register int reg asm ("ebp") = i; > + asm ("# %0" : : "r" (reg)); > + }])], > + [libc_cv_can_use_register_asm_ebp=yes], > + [libc_cv_can_use_register_asm_ebp=no]) > +]) > +if test $libc_cv_can_use_register_asm_ebp = yes; then > + AC_DEFINE(CAN_USE_REGISTER_ASM_EBP) > +fi > + > libc_cv_gcc_unwind_find_fde=yes > ldd_rewrite_script=sysdeps/unix/sysv/linux/ldd-rewrite.sed > diff --git a/sysdeps/unix/sysv/linux/i386/sysdep.h b/sysdeps/unix/sysv/linux/i386/sysdep.h > index baf4642..c40db59 100644 > --- a/sysdeps/unix/sysv/linux/i386/sysdep.h > +++ b/sysdeps/unix/sysv/linux/i386/sysdep.h > @@ -44,9 +44,9 @@ > /* 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 since asm ("ebp") can't be used to put the 6th argument > - in %ebp for syscall. */ > -#if __GNUC_PREREQ (5,0) && !defined PROF > + 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 Should it be "defined CAN_USE_REGISTER_ASM_EBP" since CAN_USE_REGISTER_ASM_EBP may not be defined. > # define OPTIMIZE_FOR_GCC_5 > #endif > > @@ -611,7 +611,8 @@ struct libc_do_syscall_args > #endif > > /* Consistency check for position-independent code. */ > -#if defined __PIC__ && !defined OPTIMIZE_FOR_GCC_5 > +#if defined __PIC__ && !defined OPTIMIZE_FOR_GCC_5 \ > + && !CAN_USE_REGISTER_ASM_EBP No need for this. If CAN_USE_REGISTER_ASM_EBP isn't defined, OPTIMIZE_FOR_GCC_5 won't be defined. > # define check_consistency() \ > ({ int __res; \ > __asm__ __volatile__ \ > -- > 2.7.4 >
>> -#if __GNUC_PREREQ (5,0) && !defined PROF >> + 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 > > Should it be "defined CAN_USE_REGISTER_ASM_EBP" > since CAN_USE_REGISTER_ASM_EBP may not be defined. In fact since it is defined in config.h.in as default being 0, it will always be defined (also I check with -O2 and -Os without --disable-werror to confirm it. > >> # define OPTIMIZE_FOR_GCC_5 >> #endif >> >> @@ -611,7 +611,8 @@ struct libc_do_syscall_args >> #endif >> >> /* Consistency check for position-independent code. */ >> -#if defined __PIC__ && !defined OPTIMIZE_FOR_GCC_5 >> +#if defined __PIC__ && !defined OPTIMIZE_FOR_GCC_5 \ >> + && !CAN_USE_REGISTER_ASM_EBP > > No need for this. If CAN_USE_REGISTER_ASM_EBP > isn't defined, OPTIMIZE_FOR_GCC_5 won't be defined. > >> # define check_consistency() \ >> ({ int __res; \ >> __asm__ __volatile__ \ >> -- >> 2.7.4 >> Right, I will remove it. I presume with this fix it is ok to commit.
On Fri, Feb 17, 2017 at 9:08 AM, Adhemerval Zanella <adhemerval.zanella@linaro.org> wrote: > >>> -#if __GNUC_PREREQ (5,0) && !defined PROF >>> + 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 >> >> Should it be "defined CAN_USE_REGISTER_ASM_EBP" >> since CAN_USE_REGISTER_ASM_EBP may not be defined. > > In fact since it is defined in config.h.in as default being 0, it will > always be defined (also I check with -O2 and -Os without --disable-werror > to confirm it. > >> >>> # define OPTIMIZE_FOR_GCC_5 >>> #endif >>> >>> @@ -611,7 +611,8 @@ struct libc_do_syscall_args >>> #endif >>> >>> /* Consistency check for position-independent code. */ >>> -#if defined __PIC__ && !defined OPTIMIZE_FOR_GCC_5 >>> +#if defined __PIC__ && !defined OPTIMIZE_FOR_GCC_5 \ >>> + && !CAN_USE_REGISTER_ASM_EBP >> >> No need for this. If CAN_USE_REGISTER_ASM_EBP >> isn't defined, OPTIMIZE_FOR_GCC_5 won't be defined. >> >>> # define check_consistency() \ >>> ({ int __res; \ >>> __asm__ __volatile__ \ >>> -- >>> 2.7.4 >>> > > Right, I will remove it. I presume with this fix it is ok to commit. Yes, it is OK with this change. Thanks for working on this.
diff --git a/config.h.in b/config.h.in index 7bfe923..fb2cc51 100644 --- a/config.h.in +++ b/config.h.in @@ -259,4 +259,8 @@ /* Build glibc with tunables support. */ #define HAVE_TUNABLES 0 +/* Some compiler options may now allow to use ebp in __asm__ (used mainly + in i386 6 argument syscall issue). */ +#define CAN_USE_REGISTER_ASM_EBP 0 + #endif diff --git a/sysdeps/unix/sysv/linux/i386/Makefile b/sysdeps/unix/sysv/linux/i386/Makefile index 9609752..6aac0df 100644 --- a/sysdeps/unix/sysv/linux/i386/Makefile +++ b/sysdeps/unix/sysv/linux/i386/Makefile @@ -1,47 +1,18 @@ # The default ABI is 32. default-abi := 32 -# %ebp is used to pass the 6th argument to system calls, so these -# system calls are incompatible with a frame pointer. -uses-6-syscall-arguments = -fomit-frame-pointer - ifeq ($(subdir),misc) sysdep_routines += ioperm iopl vm86 -CFLAGS-epoll_pwait.o += $(uses-6-syscall-arguments) -CFLAGS-epoll_pwait.os += $(uses-6-syscall-arguments) -CFLAGS-mmap.o += $(uses-6-syscall-arguments) -CFLAGS-mmap.os += $(uses-6-syscall-arguments) -CFLAGS-mmap64.o += $(uses-6-syscall-arguments) -CFLAGS-mmap64.os += $(uses-6-syscall-arguments) -CFLAGS-pselect.o += $(uses-6-syscall-arguments) -CFLAGS-pselect.os += $(uses-6-syscall-arguments) -CFLAGS-rtld-mmap.os += $(uses-6-syscall-arguments) -endif - -ifeq ($(subdir),sysvipc) -CFLAGS-semtimedop.o += $(uses-6-syscall-arguments) -CFLAGS-semtimedop.os += $(uses-6-syscall-arguments) endif ifeq ($(subdir),elf) +sysdep-dl-routines += libc-do-syscall sysdep-others += lddlibc4 install-bin += lddlibc4 endif ifeq ($(subdir),io) sysdep_routines += libc-do-syscall -CFLAGS-posix_fadvise64.o += $(uses-6-syscall-arguments) -CFLAGS-posix_fadvise64.os += $(uses-6-syscall-arguments) -CFLAGS-posix_fallocate.o += $(uses-6-syscall-arguments) -CFLAGS-posix_fallocate.os += $(uses-6-syscall-arguments) -CFLAGS-posix_fallocate64.o += $(uses-6-syscall-arguments) -CFLAGS-posix_fallocate64.os += $(uses-6-syscall-arguments) -CFLAGS-sync_file_range.o += $(uses-6-syscall-arguments) -CFLAGS-sync_file_range.os += $(uses-6-syscall-arguments) -CFLAGS-fallocate.o += $(uses-6-syscall-arguments) -CFLAGS-fallocate.os += $(uses-6-syscall-arguments) -CFLAGS-fallocate64.o += $(uses-6-syscall-arguments) -CFLAGS-fallocate64.os += $(uses-6-syscall-arguments) endif ifeq ($(subdir),nptl) @@ -61,14 +32,6 @@ ifeq ($(subdir),nptl) # pull in __syscall_error routine libpthread-routines += sysdep libpthread-shared-only-routines += sysdep -CFLAGS-pthread_rwlock_timedrdlock.o += $(uses-6-syscall-arguments) -CFLAGS-pthread_rwlock_timedrdlock.os += $(uses-6-syscall-arguments) -CFLAGS-pthread_rwlock_timedwrlock.o += $(uses-6-syscall-arguments) -CFLAGS-pthread_rwlock_timedwrlock.os += $(uses-6-syscall-arguments) -CFLAGS-sem_wait.o += $(uses-6-syscall-arguments) -CFLAGS-sem_wait.os += $(uses-6-syscall-arguments) -CFLAGS-sem_timedwait.o += $(uses-6-syscall-arguments) -CFLAGS-sem_timedwait.os += $(uses-6-syscall-arguments) endif ifeq ($(subdir),rt) diff --git a/sysdeps/unix/sysv/linux/i386/configure b/sysdeps/unix/sysv/linux/i386/configure index eb72659..ae2c356 100644 --- a/sysdeps/unix/sysv/linux/i386/configure +++ b/sysdeps/unix/sysv/linux/i386/configure @@ -3,5 +3,44 @@ arch_minimum_kernel=2.6.32 +# Check if CFLAGS allows compiler to use ebp register in inline assembly. + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler flags allows ebp in inline assembly" >&5 +$as_echo_n "checking if compiler flags allows ebp in inline assembly... " >&6; } +if ${libc_cv_can_use_register_asm_ebp+:} false; then : + $as_echo_n "(cached) " >&6 +else + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + void foo (int i) + { + register int reg asm ("ebp") = i; + asm ("# %0" : : "r" (reg)); + } +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + libc_cv_can_use_register_asm_ebp=yes +else + libc_cv_can_use_register_asm_ebp=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_can_use_register_asm_ebp" >&5 +$as_echo "$libc_cv_can_use_register_asm_ebp" >&6; } +if test $libc_cv_can_use_register_asm_ebp = yes; then + $as_echo "#define CAN_USE_REGISTER_ASM_EBP 1" >>confdefs.h + +fi + libc_cv_gcc_unwind_find_fde=yes ldd_rewrite_script=sysdeps/unix/sysv/linux/ldd-rewrite.sed diff --git a/sysdeps/unix/sysv/linux/i386/configure.ac b/sysdeps/unix/sysv/linux/i386/configure.ac index 1a11da6..1cd632e 100644 --- a/sysdeps/unix/sysv/linux/i386/configure.ac +++ b/sysdeps/unix/sysv/linux/i386/configure.ac @@ -3,5 +3,22 @@ GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory. arch_minimum_kernel=2.6.32 +# Check if CFLAGS allows compiler to use ebp register in inline assembly. +AC_CACHE_CHECK([if compiler flags allows ebp in inline assembly], + libc_cv_can_use_register_asm_ebp, [ +AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([ + void foo (int i) + { + register int reg asm ("ebp") = i; + asm ("# %0" : : "r" (reg)); + }])], + [libc_cv_can_use_register_asm_ebp=yes], + [libc_cv_can_use_register_asm_ebp=no]) +]) +if test $libc_cv_can_use_register_asm_ebp = yes; then + AC_DEFINE(CAN_USE_REGISTER_ASM_EBP) +fi + libc_cv_gcc_unwind_find_fde=yes ldd_rewrite_script=sysdeps/unix/sysv/linux/ldd-rewrite.sed diff --git a/sysdeps/unix/sysv/linux/i386/sysdep.h b/sysdeps/unix/sysv/linux/i386/sysdep.h index baf4642..c40db59 100644 --- a/sysdeps/unix/sysv/linux/i386/sysdep.h +++ b/sysdeps/unix/sysv/linux/i386/sysdep.h @@ -44,9 +44,9 @@ /* 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 since asm ("ebp") can't be used to put the 6th argument - in %ebp for syscall. */ -#if __GNUC_PREREQ (5,0) && !defined PROF + 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 @@ -611,7 +611,8 @@ struct libc_do_syscall_args #endif /* Consistency check for position-independent code. */ -#if defined __PIC__ && !defined OPTIMIZE_FOR_GCC_5 +#if defined __PIC__ && !defined OPTIMIZE_FOR_GCC_5 \ + && !CAN_USE_REGISTER_ASM_EBP # define check_consistency() \ ({ int __res; \ __asm__ __volatile__ \