Ping! <http://gcc.gnu.org/ml/gcc-patches/2014-09/msg00403.html>

> From: Hans-Peter Nilsson <h...@axis.com>
> Date: Thu, 4 Sep 2014 23:42:28 +0200

> This adds an option to allow programs and libraries built
> *without* inhibit_libc to stay compatible with system libraries
> (really: libgcc_s.so.1) built *with* inhibit_libc, at the cost
> of the registration.  As mentioned, that's a one-way
> compatibility barrier.
> 
> While it's nice to avoid the overhead of a function call at
> DSO/program initialization time, using eh-registry isn't that
> much of overhead until an exception is thrown: most of the
> execution-time overhead will come from the additional
> symbol-table-entries due to the registry calls (typically 2 in
> all libraries and programs, as weak references) and calls to
> thread-locking as the (main) part of its work-load.  Besides the
> symbol-table-entries the footprint size is typically the code for
>   if (__register_frame_info)
>     __register_frame_info (__EH_FRAME_BEGIN__, &object);
> and the corresponding deregistration and the static object
> struct (6 or 7 pointers).  (As mentioned, the library-part of
> the eh-registry support is present either way.)  So, a low-cost
> compatibility path is to always call __register_frame_info,
> despite favorable conditions for phdr usage.  Here's a patch to
> optionally do that, controlled by a configure-time option
> tentatively called --enable-explicit-exception-frame-registration
> (subject to bikeshedding if only for the length).  Note
> that there is a cost when an exception *is* thrown, the dreaded
> sorting of FDE:s.  There seems to be some obvious room for
> improvement though, as the same information is available
> *without* sorting through the PT_GNU_EH_FRAME header entry for
> the same file.
> 
> Tested with no regressions after fixing g++.old-deja/g++.eh/badalloc1.C
> (see <http://gcc.gnu.org/ml/gcc-patches/2014-09/msg00115.html>) for
> native x86_64-linux before compared to with patch/with patch and
> --enable-explicit-exception-frame-registration/.
> 
> Ok to commit?
> 
> libgcc:
>       * crtstuff.c [EH_FRAME_SECTION_NAME && !USE_PT_GNU_EH_FRAME]:
>       Sanity-check USE_EH_FRAME_REGISTRY_ALWAYS against
>       EH_FRAME_SECTION_NAME, emit error if unsane.
>       (USE_EH_FRAME_REGISTRY): Let USE_EH_FRAME_REGISTRY_ALWAYS
>       override USE_PT_GNU_EH_FRAME.
>       * Makefile.in (FORCE_EXPLICIT_EH_REGISTRY): New
>       variable for substituted force_explicit_eh_registry.
>       (CRTSTUFF_CFLAGS): Add FORCE_EXPLICIT_EH_REGISTRY.
>       * configure.ac (explicit-exception-frame-registration):
>       New AC_ARG_ENABLE.
>       * configure: Regenerate.
> 
> Index: libgcc/Makefile.in
> ===================================================================
> --- libgcc/Makefile.in        (revision 214759)
> +++ libgcc/Makefile.in        (working copy)
> @@ -50,6 +50,8 @@ target_noncanonical = @target_noncanonic
>  # The rules for compiling them should be in the t-* file for the machine.
>  EXTRA_PARTS = @extra_parts@
>  
> +FORCE_EXPLICIT_EH_REGISTRY = @force_explicit_eh_registry@
> +
>  extra-parts = libgcc-extra-parts
>  
>  # Multilib support variables.
> @@ -283,7 +285,7 @@ INTERNAL_CFLAGS = $(CFLAGS) $(LIBGCC2_CF
>  CRTSTUFF_CFLAGS = -O2 $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -g0 \
>    -finhibit-size-directive -fno-inline -fno-exceptions \
>    -fno-zero-initialized-in-bss -fno-toplevel-reorder -fno-tree-vectorize \
> -  -fno-stack-protector \
> +  -fno-stack-protector $(FORCE_EXPLICIT_EH_REGISTRY) \
>    $(INHIBIT_LIBC_CFLAGS)
>  
>  # Extra flags to use when compiling crt{begin,end}.o.
> Index: libgcc/configure.ac
> ===================================================================
> --- libgcc/configure.ac       (revision 214759)
> +++ libgcc/configure.ac       (working copy)
> @@ -262,6 +262,22 @@ no)
>    ;;
>  esac
>  
> +AC_ARG_ENABLE([explicit-exception-frame-registration],
> +  [AC_HELP_STRING([--enable-explicit-exception-frame-registration],
> +     [register exception tables explicitly at module start, for use
> +      e.g. for compatibility with installations without PT_GNU_EH_FRAME 
> support])],
> +[
> +force_explicit_eh_registry=
> +if test "$enable_explicit_exception_frame_registration" = yes; then
> +  if test "$enable_sjlj_exceptions" = yes; then
> +    AC_MSG_ERROR([Can't enable both of --enable-sjlj-exceptions
> +                  and --enable-explicit-exception-frame-registration])
> +  fi
> +  force_explicit_eh_registry=-DUSE_EH_FRAME_REGISTRY_ALWAYS
> +fi
> +])
> +AC_SUBST([force_explicit_eh_registry])
> +
>  AC_LIB_PROG_LD_GNU
>  
>  AC_MSG_CHECKING([for thread model used by GCC])
> Index: libgcc/crtstuff.c
> ===================================================================
> --- libgcc/crtstuff.c (revision 214709)
> +++ libgcc/crtstuff.c (working copy)
> @@ -131,7 +131,12 @@ call_ ## FUNC (void)                                     
> \
>  # define USE_PT_GNU_EH_FRAME
>  #endif
>  
> -#if defined(EH_FRAME_SECTION_NAME) && !defined(USE_PT_GNU_EH_FRAME)
> +#ifdef USE_EH_FRAME_REGISTRY_ALWAYS
> +# ifndef EH_FRAME_SECTION_NAME
> +#  error "Can't use explicit exception-frame-registration without 
> EH_FRAME_SECTION_NAME"
> +# endif
> +#endif
> +#if defined(EH_FRAME_SECTION_NAME) && (!defined(USE_PT_GNU_EH_FRAME) || 
> defined(USE_EH_FRAME_REGISTRY_ALWAYS))
>  # define USE_EH_FRAME_REGISTRY
>  #endif
>  #if defined(EH_FRAME_SECTION_NAME) && EH_TABLES_CAN_BE_READ_ONLY
> 
> brgds, H-P
> 

Reply via email to