Message ID | 1483966550-21038-1-git-send-email-adhemerval.zanella@linaro.org |
---|---|
State | New |
Headers | show |
On 9 Jan 2017, Adhemerval Zanella stated: > 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 Nice! > diff --git a/sysdeps/unix/sysv/linux/i386/configure.ac b/sysdeps/unix/sysv/linux/i386/configure.ac > index 1a11da6..06ccb7b 100644 > --- a/sysdeps/unix/sysv/linux/i386/configure.ac > +++ b/sysdeps/unix/sysv/linux/i386/configure.ac > @@ -3,5 +3,24 @@ GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory. > > arch_minimum_kernel=2.6.32 > > +# Check if CFLAGS sets -fno-omit-frame-pointer > +AC_CACHE_CHECK(for if compiler flags sets -fno-omit-frame-pointer, Perhaps "for -fno-omit-frame-pointer in CFLAGS" might read better.
On 09/01/2017 17:02, Nix wrote: > On 9 Jan 2017, Adhemerval Zanella stated: > >> 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 > > Nice! > >> diff --git a/sysdeps/unix/sysv/linux/i386/configure.ac b/sysdeps/unix/sysv/linux/i386/configure.ac >> index 1a11da6..06ccb7b 100644 >> --- a/sysdeps/unix/sysv/linux/i386/configure.ac >> +++ b/sysdeps/unix/sysv/linux/i386/configure.ac >> @@ -3,5 +3,24 @@ GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory. >> >> arch_minimum_kernel=2.6.32 >> >> +# Check if CFLAGS sets -fno-omit-frame-pointer >> +AC_CACHE_CHECK(for if compiler flags sets -fno-omit-frame-pointer, > > Perhaps "for -fno-omit-frame-pointer in CFLAGS" might read better. Indeed, I changed it locally.
On 10/01/2017 12:02, Adhemerval Zanella wrote: > > > On 09/01/2017 17:02, Nix wrote: >> On 9 Jan 2017, Adhemerval Zanella stated: >> >>> 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 >> >> Nice! >> >>> diff --git a/sysdeps/unix/sysv/linux/i386/configure.ac b/sysdeps/unix/sysv/linux/i386/configure.ac >>> index 1a11da6..06ccb7b 100644 >>> --- a/sysdeps/unix/sysv/linux/i386/configure.ac >>> +++ b/sysdeps/unix/sysv/linux/i386/configure.ac >>> @@ -3,5 +3,24 @@ GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory. >>> >>> arch_minimum_kernel=2.6.32 >>> >>> +# Check if CFLAGS sets -fno-omit-frame-pointer >>> +AC_CACHE_CHECK(for if compiler flags sets -fno-omit-frame-pointer, >> >> Perhaps "for -fno-omit-frame-pointer in CFLAGS" might read better. > > Indeed, I changed it locally. > Ping.
On 17/01/2017 08:23, Adhemerval Zanella wrote: > > > On 10/01/2017 12:02, Adhemerval Zanella wrote: >> >> >> On 09/01/2017 17:02, Nix wrote: >>> On 9 Jan 2017, Adhemerval Zanella stated: >>> >>>> 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 >>> >>> Nice! >>> >>>> diff --git a/sysdeps/unix/sysv/linux/i386/configure.ac b/sysdeps/unix/sysv/linux/i386/configure.ac >>>> index 1a11da6..06ccb7b 100644 >>>> --- a/sysdeps/unix/sysv/linux/i386/configure.ac >>>> +++ b/sysdeps/unix/sysv/linux/i386/configure.ac >>>> @@ -3,5 +3,24 @@ GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory. >>>> >>>> arch_minimum_kernel=2.6.32 >>>> >>>> +# Check if CFLAGS sets -fno-omit-frame-pointer >>>> +AC_CACHE_CHECK(for if compiler flags sets -fno-omit-frame-pointer, >>> >>> Perhaps "for -fno-omit-frame-pointer in CFLAGS" might read better. >> >> Indeed, I changed it locally. >> > > Ping. > Ping.
Ping. On 24/01/2017 18:14, Adhemerval Zanella wrote: > > > On 17/01/2017 08:23, Adhemerval Zanella wrote: >> >> >> On 10/01/2017 12:02, Adhemerval Zanella wrote: >>> >>> >>> On 09/01/2017 17:02, Nix wrote: >>>> On 9 Jan 2017, Adhemerval Zanella stated: >>>> >>>>> 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 >>>> >>>> Nice! >>>> >>>>> diff --git a/sysdeps/unix/sysv/linux/i386/configure.ac b/sysdeps/unix/sysv/linux/i386/configure.ac >>>>> index 1a11da6..06ccb7b 100644 >>>>> --- a/sysdeps/unix/sysv/linux/i386/configure.ac >>>>> +++ b/sysdeps/unix/sysv/linux/i386/configure.ac >>>>> @@ -3,5 +3,24 @@ GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory. >>>>> >>>>> arch_minimum_kernel=2.6.32 >>>>> >>>>> +# Check if CFLAGS sets -fno-omit-frame-pointer >>>>> +AC_CACHE_CHECK(for if compiler flags sets -fno-omit-frame-pointer, >>>> >>>> Perhaps "for -fno-omit-frame-pointer in CFLAGS" might read better. >>> >>> Indeed, I changed it locally. >>> >> >> Ping. >> > > Ping. >
On Mon, Jan 9, 2017 at 4:55 AM, Adhemerval Zanella <adhemerval.zanella@linaro.org> wrote: > Commit 6b1df8b27f fixed the -OS build issue on i386 (BZ#20729) by > expliciting disabling frame pointer (-fomit-frame-pointer) on the > faulty objects. Although it does fix the issue, it is a subpar > workaround that adds complexity in build process (a rule for each > object to add the required compiler option and pontentially more > rules for objects that call {INLINE,INTERNAL}_SYSCALL) and does not > allow the implementations to get all the possible debug/calltrack > information possible (used mainly in debuggers and performance > measurement tools). > > This patch fixes it by adding an explicit configure check to see > if -fno-omit-frame-pointer is set and to act accordingly (set or > not OPTIMIZE_FOR_GCC_5). The make rules is simplified and only > one is required: to add libc-do-syscall on loader due mmap > (which will be empty anyway for default build with > -fomit-frame-pointer). > > Checked on i386-linux-gnu with GCC 6.2.1 with CFLAGS sets as > '-Os', '-O2 -fno-omit-frame-pointer', and '-O2 -fomit-frame-pointer'. > For '-Os' the testsuite issues described by BZ#19463 and BZ#15105 > still applied. > > It fixes BZ #21029, although it is marked as duplicated of #20729 > (I reopened to track this cleanup). > > [BZ #21029] > * config.h.in [NO_OMIT_FRAME_POINTER]: 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 for > -fno-omit-frame-pointer usage. > * sysdeps/unix/sysv/linux/i386/configure: Regenerate. > * sysdeps/unix/sysv/linux/i386/sysdep.h (OPTIMIZE_FOR_GCC_5): > Set iff NO_OMIT_FRAME_POINTER is not defined. > (check_consistency): Likewise. > --- > ChangeLog | 50 +++++++++++++++++++++++++++++++ > config.h.in | 3 ++ > sysdeps/unix/sysv/linux/i386/Makefile | 39 +----------------------- > sysdeps/unix/sysv/linux/i386/configure | 31 +++++++++++++++++++ > sysdeps/unix/sysv/linux/i386/configure.ac | 19 ++++++++++++ > sysdeps/unix/sysv/linux/i386/sysdep.h | 9 +++--- > 6 files changed, 109 insertions(+), 42 deletions(-) > > diff --git a/config.h.in b/config.h.in > index 7bfe923..50da4ba 100644 > --- a/config.h.in > +++ b/config.h.in > @@ -259,4 +259,7 @@ > /* Build glibc with tunables support. */ > #define HAVE_TUNABLES 0 > > +/* Define if compiler flags sets -fno-omit-frame-pointer. */ > +#undef NO_OMIT_FRAME_POINTER > + > #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..a1381e6 100644 > --- a/sysdeps/unix/sysv/linux/i386/configure > +++ b/sysdeps/unix/sysv/linux/i386/configure > @@ -3,5 +3,36 @@ > > arch_minimum_kernel=2.6.32 > > +# Check if CFLAGS sets -fno-omit-frame-pointer > +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for if compiler flags sets -fno-omit-frame-pointer" >&5 > +$as_echo_n "checking for if compiler flags sets -fno-omit-frame-pointer... " >&6; } > +if ${libc_cv_no_omit_frame_pointer+:} false; then : > + $as_echo_n "(cached) " >&6 > +else > + cat > conftest.c << EOF > + void foo (void) { } > +EOF > + libc_cv_no_omit_frame_pointer=no > + if { ac_try='${CC-cc} $CFLAGS -S conftest.c -o conftest.s 1>&5' > + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 > + (eval $ac_try) 2>&5 > + ac_status=$? > + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 > + test $ac_status = 0; }; }; 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 > + > +fi > +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_no_omit_frame_pointer" >&5 > +$as_echo "$libc_cv_no_omit_frame_pointer" >&6; } > +if test $libc_cv_no_omit_frame_pointer = yes; then > + $as_echo "#define NO_OMIT_FRAME_POINTER 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..06ccb7b 100644 > --- a/sysdeps/unix/sysv/linux/i386/configure.ac > +++ b/sysdeps/unix/sysv/linux/i386/configure.ac > @@ -3,5 +3,24 @@ GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory. > > arch_minimum_kernel=2.6.32 > > +# 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-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? > + > 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..591aaf7 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 && !defined NO_OMIT_FRAME_POINTER > # 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 \ > + && !defined NO_OMIT_FRAME_POINTER > # define check_consistency() \ > ({ int __res; \ > __asm__ __volatile__ \ > -- > 2.7.4 >
diff --git a/config.h.in b/config.h.in index 7bfe923..50da4ba 100644 --- a/config.h.in +++ b/config.h.in @@ -259,4 +259,7 @@ /* Build glibc with tunables support. */ #define HAVE_TUNABLES 0 +/* Define if compiler flags sets -fno-omit-frame-pointer. */ +#undef NO_OMIT_FRAME_POINTER + #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..a1381e6 100644 --- a/sysdeps/unix/sysv/linux/i386/configure +++ b/sysdeps/unix/sysv/linux/i386/configure @@ -3,5 +3,36 @@ arch_minimum_kernel=2.6.32 +# Check if CFLAGS sets -fno-omit-frame-pointer +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for if compiler flags sets -fno-omit-frame-pointer" >&5 +$as_echo_n "checking for if compiler flags sets -fno-omit-frame-pointer... " >&6; } +if ${libc_cv_no_omit_frame_pointer+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat > conftest.c << EOF + void foo (void) { } +EOF + libc_cv_no_omit_frame_pointer=no + if { ac_try='${CC-cc} $CFLAGS -S conftest.c -o conftest.s 1>&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 + (eval $ac_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; 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 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_no_omit_frame_pointer" >&5 +$as_echo "$libc_cv_no_omit_frame_pointer" >&6; } +if test $libc_cv_no_omit_frame_pointer = yes; then + $as_echo "#define NO_OMIT_FRAME_POINTER 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..06ccb7b 100644 --- a/sysdeps/unix/sysv/linux/i386/configure.ac +++ b/sysdeps/unix/sysv/linux/i386/configure.ac @@ -3,5 +3,24 @@ GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory. arch_minimum_kernel=2.6.32 +# 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 + ]) +if test $libc_cv_no_omit_frame_pointer = yes; then + AC_DEFINE(NO_OMIT_FRAME_POINTER) +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..591aaf7 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 && !defined NO_OMIT_FRAME_POINTER # 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 \ + && !defined NO_OMIT_FRAME_POINTER # define check_consistency() \ ({ int __res; \ __asm__ __volatile__ \