unwind-dw2-fde.c (__deregister_frame_info): Stubbify in favour of...
authorRichard Henderson <rth@redhat.com>
Tue, 22 May 2001 23:01:33 +0000 (16:01 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Tue, 22 May 2001 23:01:33 +0000 (16:01 -0700)
        * unwind-dw2-fde.c (__deregister_frame_info): Stubbify in favour of...
        (__deregister_frame_info_bases): New.
        * unwind-dw2-fde.h: Declare it.
        * libgcc-std.ver: Export it.
        * crtstuff.c (__do_global_dtors_aux): Call it if we would have
        called __register_frame_info_bases.

From-SVN: r42473

gcc/ChangeLog
gcc/crtstuff.c
gcc/libgcc-std.ver
gcc/unwind-dw2-fde.c
gcc/unwind-dw2-fde.h

index ff5c32fc8c04a8d5cea2158c1cc5e50bb4613a17..f33c86f404f86c77978103235b4617294c980e5a 100644 (file)
@@ -1,3 +1,12 @@
+2001-05-22  Richard Henderson  <rth@redhat.com>
+
+       * unwind-dw2-fde.c (__deregister_frame_info): Stubbify in favour of...
+       (__deregister_frame_info_bases): New.
+       * unwind-dw2-fde.h: Declare it.
+       * libgcc-std.ver: Export it.
+       * crtstuff.c (__do_global_dtors_aux): Call it if we would have
+       called __register_frame_info_bases.
+
 2001-05-22  Loren J. Rittle  <ljrittle@acm.org>
 
        * config/freebsd.h (FBSD_CPP_PREDEFINES): Use #endif/#if pair
index 1897185f3d1a3bfbfbf1f032686cdbf351053a27..862eeacfc61739dccbfa69b42b4a25d86e5500c0 100644 (file)
@@ -95,6 +95,8 @@ extern void __register_frame_info_bases (void *, struct object *,
                                  TARGET_ATTRIBUTE_WEAK;
 extern void *__deregister_frame_info (void *)
                                     TARGET_ATTRIBUTE_WEAK;
+extern void *__deregister_frame_info_bases (void *)
+                                    TARGET_ATTRIBUTE_WEAK;
 
 #ifndef OBJECT_FORMAT_MACHO
 
@@ -210,9 +212,17 @@ __do_global_dtors_aux (void)
     }
 
 #ifdef EH_FRAME_SECTION_ASM_OP
+#if defined(CRT_GET_RFIB_TEXT) || defined(CRT_GET_RFIB_DATA)
+  /* If we used the new __register_frame_info_bases interface,
+     make sure that we deregister from the same place.  */
+  if (__deregister_frame_info_bases)
+    __deregister_frame_info_bases (__EH_FRAME_BEGIN__);
+#else
   if (__deregister_frame_info)
     __deregister_frame_info (__EH_FRAME_BEGIN__);
 #endif
+#endif
+
   completed = 1;
 }
 
index ae353e51f82c227e4bae86aa0050e92217ea8032..73c9f6fcbbe5da4a5e2f8a3f84a17dd39bec3e09 100644 (file)
@@ -125,6 +125,7 @@ GCC_3.0 {
   _Unwind_SetIP
   __deregister_frame
   __deregister_frame_info
+  __deregister_frame_info_bases
   __register_frame
   __register_frame_info
   __register_frame_info_bases
index 3a42f29a6ce56592c665d4e8f86de527b6e805c0..7b5c7574d9cfbf550d6e68bb5bf2c3077ae6841e 100644 (file)
@@ -140,9 +140,19 @@ __register_frame_table (void *begin)
 }
 
 /* Called from crtbegin.o to deregister the unwind info for an object.  */
+/* ??? Glibc has for a while now exported __register_frame_info and
+   __deregister_frame_info.  If we call __register_frame_info_bases
+   from crtbegin (wherein it is declared weak), and this object does
+   not get pulled from libgcc.a for other reasons, then the
+   invocation of __deregister_frame_info will be resolved from glibc.
+   Since the registration did not happen there, we'll abort.
+
+   Therefore, declare a new deregistration entry point that does the
+   exact same thing, but will resolve to the same library as 
+   implements __register_frame_info_bases.  */
 
 void *
-__deregister_frame_info (void *begin)
+__deregister_frame_info_bases (void *begin)
 {
   struct object **p;
   struct object *ob = 0;
@@ -187,6 +197,18 @@ __deregister_frame_info (void *begin)
   return (void *) ob;
 }
 
+#ifdef ASM_OUTPUT_DEF
+void *
+__deregister_frame_info (void *)
+ __attribute__((alias(__USER_LABEL_PREFIX__ "__deregister_frame_info_bases")));
+#else
+void *
+__deregister_frame_info (void *begin)
+{
+  return __deregister_frame_info_bases (begin);
+}
+#endif
+
 void
 __deregister_frame (void *begin)
 {
index efbded0fa99fd73426a4310cf5ac687083827f7e..3d7df409e641672a2452a4fa04be8aa3df0144fc 100644 (file)
@@ -94,6 +94,7 @@ extern void __register_frame_info_table_bases (void *, struct object *,
 extern void __register_frame_info_table (void *, struct object *);
 extern void __register_frame_table (void *);
 extern void *__deregister_frame_info (void *);
+extern void *__deregister_frame_info_bases (void *);
 extern void __deregister_frame (void *);
 
 \f