diff mbox

[RFA,2/2] : --enable-explicit-exception-frame-registration compatibility option

Message ID 201409220058.s8M0w8K8031866@ignucius.se.axis.com
State New
Headers show

Commit Message

Hans-Peter Nilsson Sept. 22, 2014, 12:58 a.m. UTC
> From: Jeff Law <law@redhat.com>
> Date: Fri, 19 Sep 2014 08:29:16 +0200

> On 09/12/14 11:51, Hans-Peter Nilsson wrote:
> > Ping! <http://gcc.gnu.org/ml/gcc-patches/2014-09/msg00403.html>

> >> 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.
> OK.
> jeff
> 

Thanks!  JFTR, here's the boring rebase needed as per jsm28's
s/EH_FRAME_SECTION_NAME/_LIBGCC_EH_FRAME_SECTION_NAME_/g.
I started a native build on x86_64-linux and
--explicit-exception-frame-registration with this patch and
observed it build the first-stage libstdc++.so and inspected the
result and crtbegin.o as a sanity-check, as I can't trust myself
not to typo. :)

libgcc:
	* crtstuff.c (USE_EH_FRAME_REGISTRY): Let USE_EH_FRAME_REGISTRY_ALWAYS
	override USE_PT_GNU_EH_FRAME.
	[__LIBGCC_EH_FRAME_SECTION_NAME__ && !USE_PT_GNU_EH_FRAME]: Sanity-
	check USE_EH_FRAME_REGISTRY_ALWAYS against
	__LIBGCC_EH_FRAME_SECTION_NAME__, emit error if unsane.
	* 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.
diff mbox

Patch

Index: libgcc/Makefile.in
===================================================================
--- libgcc/Makefile.in	(revision 215439)
+++ 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 \
-  -fbuilding-libgcc -fno-stack-protector \
+  -fbuilding-libgcc -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 215439)
+++ 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 215439)
+++ libgcc/crtstuff.c	(working copy)
@@ -131,7 +131,12 @@  call_ ## FUNC (void)					\
 # define USE_PT_GNU_EH_FRAME
 #endif
 
-#if defined(__LIBGCC_EH_FRAME_SECTION_NAME__) && !defined(USE_PT_GNU_EH_FRAME)
+#ifdef USE_EH_FRAME_REGISTRY_ALWAYS
+# ifndef __LIBGCC_EH_FRAME_SECTION_NAME__
+#  error "Can't use explicit exception-frame-registration without __LIBGCC_EH_FRAME_SECTION_NAME__"
+# endif
+#endif
+#if defined(__LIBGCC_EH_FRAME_SECTION_NAME__) && (!defined(USE_PT_GNU_EH_FRAME) || defined(USE_EH_FRAME_REGISTRY_ALWAYS))
 # define USE_EH_FRAME_REGISTRY
 #endif
 #if defined(__LIBGCC_EH_FRAME_SECTION_NAME__) \