crtstuff.c (__do_global_dtors_aux): Allow finalization code to be run more than once.
authorMike Stump <mrs@gcc.gnu.org>
Thu, 24 Oct 1996 01:23:43 +0000 (01:23 +0000)
committerMike Stump <mrs@gcc.gnu.org>
Thu, 24 Oct 1996 01:23:43 +0000 (01:23 +0000)
        * crtstuff.c (__do_global_dtors_aux): Allow finalization code to
        be run more than once.
        * libgcc2.c (__do_global_dtors): Ditto.

From-SVN: r13023

gcc/crtstuff.c
gcc/libgcc2.c

index f41035c91ae5dc27e3a74d44f6ddb64f961b0b0c..6cbb82b6f38ced0aa50b876486f9e2ce2d90849f 100644 (file)
@@ -111,15 +111,23 @@ typedef void (*func_ptr) (void);
    functions in each root executable and one in each shared library, but
    although they all have the same code, each one is unique in that it
    refers to one particular associated `__DTOR_LIST__' which belongs to the
-   same particular root executable or shared library file.  */
+   same particular root executable or shared library file.
+
+   On some systems, this routine is run more than once from the .fini,
+   when exit is called recursively, so we arrange to remember where in
+   the list we left off processing, and we resume at that point,
+   should we be re-invoked.  */
 
 static func_ptr __DTOR_LIST__[];
 static void
 __do_global_dtors_aux ()
 {
-  func_ptr *p;
-  for (p = __DTOR_LIST__ + 1; *p; p++)
-    (*p) ();
+  static func_ptr *p = __DTOR_LIST__ + 1;
+  while (*p)
+    {
+      p++;
+      (*(p-1)) ();
+    }
 }
 
 /* Stick a call to __do_global_dtors_aux into the .fini section.  */
index 9ccb1a550e48d38c8d2e2a5c4086c93a0f512ab3..69cb7e47ad81e5da3f56ac5ec7137b843a46abaf 100644 (file)
@@ -2829,9 +2829,12 @@ __do_global_dtors ()
 #ifdef DO_GLOBAL_DTORS_BODY
   DO_GLOBAL_DTORS_BODY;
 #else
-  func_ptr *p;
-  for (p = __DTOR_LIST__ + 1; *p; )
-    (*p++) ();
+  static func_ptr *p = __DTOR_LIST__ + 1;
+  while (*p)
+    {
+      p++;
+      (*(p-1)) ();
+    }
 #endif
 }
 #endif