On Tue, Jul 21, 2020 at 8:24 PM Maciej W. Rozycki <ma...@wdc.com> wrote:
>
> Complement commit b932f770f70d ("x86_64 frame unwind info"), SVN r46374,
> <https://gcc.gnu.org/ml/gcc-patches/2001-10/msg00860.html>, and replace
> `-fexceptions -fnon-call-exceptions' with `-fasynchronous-unwind-tables'
> in LIB2_DIVMOD_FUNCS compilation flags so as to provide unwind tables
> for the affected functions while not pulling the unwinder proper, which
> is not required here.
>
> Remove the ARM overrides accordingly, retaining the hook infrastructure
> however, and make the ARM test case a generic one.

You're changing arm files only so CCing arm maintainers.

Richard.

> Beyond saving program space it fixes a RISC-V glibc build error due to
> unsatisfied `malloc' and `free' references from the unwinder causing
> link errors with `ld.so' where libgcc has been built at -O0.
> ---
> Hi,
>
>  As discussed: <https://gcc.gnu.org/pipermail/gcc/2020-July/233120.html>.
>
>  This has been regression-tested with all the GCC compiler testsuites with
> the `x86_64-linux' native configuration, which in particular means the
> moved ARM test case scored the UNSUPPORTED result.  I have no access to a
> non-Linux configuration right now, so I cannot verify this test case, but
> in principle I expect it to work across the relevant targets (and the
> irrelevant ones can be excluded as they are discovered).
>
>  OK to apply then?  It may make sense to backport this fix too to the
> active release branches; please let me know if to do so.
>
>  NB the original commit referred appears to contain more than just the
> corresponding mailing list posting; it looks like several patches were
> folded together before comitting, so this is as good as you can get.
>
>   Maciej
> ---
>  gcc/testsuite/gcc.dg/div64-unwinding.c         |   25 
> +++++++++++++++++++++++++
>  gcc/testsuite/gcc.target/arm/div64-unwinding.c |   25 
> -------------------------
>  libgcc/Makefile.in                             |    2 +-
>  libgcc/config/arm/t-bpabi                      |    5 -----
>  libgcc/config/arm/t-netbsd-eabi                |    5 -----
>  5 files changed, 26 insertions(+), 36 deletions(-)
>
> gcc-libgcc-divmod-asynchronous-unwind-tables.diff
> Index: gcc/gcc/testsuite/gcc.dg/div64-unwinding.c
> ===================================================================
> --- /dev/null
> +++ gcc/gcc/testsuite/gcc.dg/div64-unwinding.c
> @@ -0,0 +1,25 @@
> +/* Performing a 64-bit division should not pull in the unwinder.  */
> +
> +/* { dg-do run { target { { ! *-*-linux* } && { ! *-*-uclinux* } } } } */
> +/* { dg-skip-if "load causes weak symbol resolution" { vxworks_kernel } } */
> +/* { dg-options "-O0" } */
> +
> +#include <stdlib.h>
> +
> +long long
> +foo (long long c, long long d)
> +{
> +  return c/d;
> +}
> +
> +long long x = 0;
> +long long y = 1;
> +
> +extern int (*_Unwind_RaiseException) (void *) __attribute__((weak));
> +
> +int main(void)
> +{
> +  if (&_Unwind_RaiseException != NULL)
> +    abort ();;
> +  return foo (x, y);
> +}
> Index: gcc/gcc/testsuite/gcc.target/arm/div64-unwinding.c
> ===================================================================
> --- gcc.orig/gcc/testsuite/gcc.target/arm/div64-unwinding.c
> +++ /dev/null
> @@ -1,25 +0,0 @@
> -/* Performing a 64-bit division should not pull in the unwinder.  */
> -
> -/* { dg-do run { target { { ! *-*-linux* } && { ! *-*-uclinux* } } } } */
> -/* { dg-skip-if "load causes weak symbol resolution" { vxworks_kernel } } */
> -/* { dg-options "-O0" } */
> -
> -#include <stdlib.h>
> -
> -long long
> -foo (long long c, long long d)
> -{
> -  return c/d;
> -}
> -
> -long long x = 0;
> -long long y = 1;
> -
> -extern int (*_Unwind_RaiseException) (void *) __attribute__((weak));
> -
> -int main(void)
> -{
> -  if (&_Unwind_RaiseException != NULL)
> -    abort ();;
> -  return foo (x, y);
> -}
> Index: gcc/libgcc/Makefile.in
> ===================================================================
> --- gcc.orig/libgcc/Makefile.in
> +++ gcc/libgcc/Makefile.in
> @@ -533,7 +533,7 @@ endif
>  ifeq ($(LIB2_DIVMOD_EXCEPTION_FLAGS),)
>  # Provide default flags for compiling divmod functions, if they haven't been
>  # set already by a target-specific Makefile fragment.
> -LIB2_DIVMOD_EXCEPTION_FLAGS := -fexceptions -fnon-call-exceptions
> +LIB2_DIVMOD_EXCEPTION_FLAGS := -fasynchronous-unwind-tables
>  endif
>
>  # Build LIB2_DIVMOD_FUNCS.
> Index: gcc/libgcc/config/arm/t-bpabi
> ===================================================================
> --- gcc.orig/libgcc/config/arm/t-bpabi
> +++ gcc/libgcc/config/arm/t-bpabi
> @@ -13,8 +13,3 @@ LIB2ADDEH = $(srcdir)/config/arm/unwind-
>
>  # Add the BPABI names.
>  SHLIB_MAPFILES += $(srcdir)/config/arm/libgcc-bpabi.ver
> -
> -# On ARM, specifying -fnon-call-exceptions will needlessly pull in
> -# the unwinder in simple programs which use 64-bit division.  Omitting
> -# the option is safe.
> -LIB2_DIVMOD_EXCEPTION_FLAGS := -fexceptions
> Index: gcc/libgcc/config/arm/t-netbsd-eabi
> ===================================================================
> --- gcc.orig/libgcc/config/arm/t-netbsd-eabi
> +++ gcc/libgcc/config/arm/t-netbsd-eabi
> @@ -11,8 +11,3 @@ LIB2ADDEH =
>
>  # Add the BPABI names.
>  SHLIB_MAPFILES += $(srcdir)/config/arm/libgcc-bpabi.ver
> -
> -# On ARM, specifying -fnon-call-exceptions will needlessly pull in
> -# the unwinder in simple programs which use 64-bit division.  Omitting
> -# the option is safe.
> -LIB2_DIVMOD_EXCEPTION_FLAGS := -fexceptions

Reply via email to