All of lore.kernel.org
 help / color / mirror / Atom feed
* [pyro][PATCH] glibc_2.25: fix building for x86 with -Os (or -fno-omit-frame-pointer)
@ 2017-11-20 19:40 Andre McCurdy
  2017-11-20 20:02 ` ✗ patchtest: failure for " Patchwork
  2017-11-24 17:02 ` [pyro][PATCH] " akuster808
  0 siblings, 2 replies; 4+ messages in thread
From: Andre McCurdy @ 2017-11-20 19:40 UTC (permalink / raw)
  To: openembedded-core

Glibc 2.25 fails to build for x86 when frame pointers are enabled (ie
when optimised for size or when -fno-omit-frame-pointer is explicitly
included in CFLAGS etc). Backport the upstream fix from glibc 2.26.

  https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=3b33d6ed6096c1d20d05a650b06026d673f7399a

Signed-off-by: Andre McCurdy <armccurdy@gmail.com>
---
 ...rk-fno-omit-frame-pointer-support-on-i386.patch | 268 +++++++++++++++++++++
 meta/recipes-core/glibc/glibc_2.25.bb              |   1 +
 2 files changed, 269 insertions(+)
 create mode 100644 meta/recipes-core/glibc/glibc/0028-Rework-fno-omit-frame-pointer-support-on-i386.patch

diff --git a/meta/recipes-core/glibc/glibc/0028-Rework-fno-omit-frame-pointer-support-on-i386.patch b/meta/recipes-core/glibc/glibc/0028-Rework-fno-omit-frame-pointer-support-on-i386.patch
new file mode 100644
index 0000000..7ed2b90
--- /dev/null
+++ b/meta/recipes-core/glibc/glibc/0028-Rework-fno-omit-frame-pointer-support-on-i386.patch
@@ -0,0 +1,268 @@
+From 1ea003d4fccc4646fd1848a182405a1c7000ab18 Mon Sep 17 00:00:00 2001
+From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
+Date: Sun, 8 Jan 2017 11:38:23 -0200
+Subject: [PATCH 28/28] Rework -fno-omit-frame-pointer support on i386
+
+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 [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.
+
+Upstream-Status: Backport
+
+  https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=3b33d6ed6096c1d20d05a650b06026d673f7399a
+
+Signed-off-by: Andre McCurdy <armccurdy@gmail.com>
+---
+ config.h.in                               |  4 ++++
+ sysdeps/unix/sysv/linux/i386/Makefile     | 39 +------------------------------
+ sysdeps/unix/sysv/linux/i386/configure    | 39 +++++++++++++++++++++++++++++++
+ sysdeps/unix/sysv/linux/i386/configure.ac | 17 ++++++++++++++
+ sysdeps/unix/sysv/linux/i386/sysdep.h     |  6 ++---
+ 5 files changed, 64 insertions(+), 41 deletions(-)
+
+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..449b23e 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
+ 
+-- 
+1.9.1
+
diff --git a/meta/recipes-core/glibc/glibc_2.25.bb b/meta/recipes-core/glibc/glibc_2.25.bb
index cf9c4f7..0f1ec0c 100644
--- a/meta/recipes-core/glibc/glibc_2.25.bb
+++ b/meta/recipes-core/glibc/glibc_2.25.bb
@@ -42,6 +42,7 @@ SRC_URI = "${GLIBC_GIT_URI};branch=${SRCBRANCH};name=glibc \
            file://0025-Define-DUMMY_LOCALE_T-if-not-defined.patch \
            file://0026-elf-dl-deps.c-Make-_dl_build_local_scope-breadth-fir.patch \
            file://0027-locale-fix-hard-coded-reference-to-gcc-E.patch \
+           file://0028-Rework-fno-omit-frame-pointer-support-on-i386.patch \
 "
 
 NATIVESDKFIXES ?= ""
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* ✗ patchtest: failure for glibc_2.25: fix building for x86 with -Os (or -fno-omit-frame-pointer)
  2017-11-20 19:40 [pyro][PATCH] glibc_2.25: fix building for x86 with -Os (or -fno-omit-frame-pointer) Andre McCurdy
@ 2017-11-20 20:02 ` Patchwork
  2017-11-21 19:37   ` Leonardo Sandoval
  2017-11-24 17:02 ` [pyro][PATCH] " akuster808
  1 sibling, 1 reply; 4+ messages in thread
From: Patchwork @ 2017-11-20 20:02 UTC (permalink / raw)
  To: Andre McCurdy; +Cc: openembedded-core

== Series Details ==

Series: glibc_2.25: fix building for x86 with -Os (or -fno-omit-frame-pointer)
Revision: 1
URL   : https://patchwork.openembedded.org/series/9881/
State : failure

== Summary ==


Thank you for submitting this patch series to OpenEmbedded Core. This is
an automated response. Several tests have been executed on the proposed
series by patchtest resulting in the following failures:



* Issue             Series does not apply on top of target branch [test_series_merge_on_head] 
  Suggested fix    Rebase your series on top of targeted branch
  Targeted branch  master (currently at a17f3ec910)



If you believe any of these test results are incorrect, please reply to the
mailing list (openembedded-core@lists.openembedded.org) raising your concerns.
Otherwise we would appreciate you correcting the issues and submitting a new
version of the patchset if applicable. Please ensure you add/increment the
version number when sending the new version (i.e. [PATCH] -> [PATCH v2] ->
[PATCH v3] -> ...).

---
Guidelines:     https://www.openembedded.org/wiki/Commit_Patch_Message_Guidelines
Test framework: http://git.yoctoproject.org/cgit/cgit.cgi/patchtest
Test suite:     http://git.yoctoproject.org/cgit/cgit.cgi/patchtest-oe



^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: ✗ patchtest: failure for glibc_2.25: fix building for x86 with -Os (or -fno-omit-frame-pointer)
  2017-11-20 20:02 ` ✗ patchtest: failure for " Patchwork
@ 2017-11-21 19:37   ` Leonardo Sandoval
  0 siblings, 0 replies; 4+ messages in thread
From: Leonardo Sandoval @ 2017-11-21 19:37 UTC (permalink / raw)
  To: Patchwork; +Cc: openembedded-core

On Mon, 20 Nov 2017 20:02:56 -0000
Patchwork <patchwork@patchwork.openembedded.org> wrote:

> == Series Details ==
> 
> Series: glibc_2.25: fix building for x86 with -Os (or -fno-omit-frame-pointer)
> Revision: 1
> URL   : https://patchwork.openembedded.org/series/9881/
> State : failure
> 
> == Summary ==
> 
> 
> Thank you for submitting this patch series to OpenEmbedded Core. This is
> an automated response. Several tests have been executed on the proposed
> series by patchtest resulting in the following failures:
> 
> 
> 
> * Issue             Series does not apply on top of target branch [test_series_merge_on_head] 
>   Suggested fix    Rebase your series on top of targeted branch
>   Targeted branch  master (currently at a17f3ec910)
> 

please ignore this request. I have fixed the root problem at patchtest-oe (pick up the correct branch from subject)

> 
> 
> If you believe any of these test results are incorrect, please reply to the
> mailing list (openembedded-core@lists.openembedded.org) raising your concerns.
> Otherwise we would appreciate you correcting the issues and submitting a new
> version of the patchset if applicable. Please ensure you add/increment the
> version number when sending the new version (i.e. [PATCH] -> [PATCH v2] ->
> [PATCH v3] -> ...).
> 
> ---
> Guidelines:     https://www.openembedded.org/wiki/Commit_Patch_Message_Guidelines
> Test framework: http://git.yoctoproject.org/cgit/cgit.cgi/patchtest
> Test suite:     http://git.yoctoproject.org/cgit/cgit.cgi/patchtest-oe
> 
> -- 
> _______________________________________________
> Openembedded-core mailing list
> Openembedded-core@lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/openembedded-core


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [pyro][PATCH] glibc_2.25: fix building for x86 with -Os (or -fno-omit-frame-pointer)
  2017-11-20 19:40 [pyro][PATCH] glibc_2.25: fix building for x86 with -Os (or -fno-omit-frame-pointer) Andre McCurdy
  2017-11-20 20:02 ` ✗ patchtest: failure for " Patchwork
@ 2017-11-24 17:02 ` akuster808
  1 sibling, 0 replies; 4+ messages in thread
From: akuster808 @ 2017-11-24 17:02 UTC (permalink / raw)
  To: Andre McCurdy, openembedded-core

in stable/pyro-next


On 11/20/2017 11:40 AM, Andre McCurdy wrote:
> Glibc 2.25 fails to build for x86 when frame pointers are enabled (ie
> when optimised for size or when -fno-omit-frame-pointer is explicitly
> included in CFLAGS etc). Backport the upstream fix from glibc 2.26.
>
>   https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=3b33d6ed6096c1d20d05a650b06026d673f7399a
>
> Signed-off-by: Andre McCurdy <armccurdy@gmail.com>
> ---
>  ...rk-fno-omit-frame-pointer-support-on-i386.patch | 268 +++++++++++++++++++++
>  meta/recipes-core/glibc/glibc_2.25.bb              |   1 +
>  2 files changed, 269 insertions(+)
>  create mode 100644 meta/recipes-core/glibc/glibc/0028-Rework-fno-omit-frame-pointer-support-on-i386.patch
>
> diff --git a/meta/recipes-core/glibc/glibc/0028-Rework-fno-omit-frame-pointer-support-on-i386.patch b/meta/recipes-core/glibc/glibc/0028-Rework-fno-omit-frame-pointer-support-on-i386.patch
> new file mode 100644
> index 0000000..7ed2b90
> --- /dev/null
> +++ b/meta/recipes-core/glibc/glibc/0028-Rework-fno-omit-frame-pointer-support-on-i386.patch
> @@ -0,0 +1,268 @@
> +From 1ea003d4fccc4646fd1848a182405a1c7000ab18 Mon Sep 17 00:00:00 2001
> +From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> +Date: Sun, 8 Jan 2017 11:38:23 -0200
> +Subject: [PATCH 28/28] Rework -fno-omit-frame-pointer support on i386
> +
> +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 [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.
> +
> +Upstream-Status: Backport
> +
> +  https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=3b33d6ed6096c1d20d05a650b06026d673f7399a
> +
> +Signed-off-by: Andre McCurdy <armccurdy@gmail.com>
> +---
> + config.h.in                               |  4 ++++
> + sysdeps/unix/sysv/linux/i386/Makefile     | 39 +------------------------------
> + sysdeps/unix/sysv/linux/i386/configure    | 39 +++++++++++++++++++++++++++++++
> + sysdeps/unix/sysv/linux/i386/configure.ac | 17 ++++++++++++++
> + sysdeps/unix/sysv/linux/i386/sysdep.h     |  6 ++---
> + 5 files changed, 64 insertions(+), 41 deletions(-)
> +
> +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..449b23e 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
> + 
> +-- 
> +1.9.1
> +
> diff --git a/meta/recipes-core/glibc/glibc_2.25.bb b/meta/recipes-core/glibc/glibc_2.25.bb
> index cf9c4f7..0f1ec0c 100644
> --- a/meta/recipes-core/glibc/glibc_2.25.bb
> +++ b/meta/recipes-core/glibc/glibc_2.25.bb
> @@ -42,6 +42,7 @@ SRC_URI = "${GLIBC_GIT_URI};branch=${SRCBRANCH};name=glibc \
>             file://0025-Define-DUMMY_LOCALE_T-if-not-defined.patch \
>             file://0026-elf-dl-deps.c-Make-_dl_build_local_scope-breadth-fir.patch \
>             file://0027-locale-fix-hard-coded-reference-to-gcc-E.patch \
> +           file://0028-Rework-fno-omit-frame-pointer-support-on-i386.patch \
>  "
>  
>  NATIVESDKFIXES ?= ""



^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2017-11-24 17:02 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-11-20 19:40 [pyro][PATCH] glibc_2.25: fix building for x86 with -Os (or -fno-omit-frame-pointer) Andre McCurdy
2017-11-20 20:02 ` ✗ patchtest: failure for " Patchwork
2017-11-21 19:37   ` Leonardo Sandoval
2017-11-24 17:02 ` [pyro][PATCH] " akuster808

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.