OSDN Git Service

* unwind-dw2-fde-darwin.c (DESTRUCTOR_MAY_BE_CALLED_LIVE): New.
authorgeoffk <geoffk@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 1 Apr 2003 21:02:25 +0000 (21:02 +0000)
committergeoffk <geoffk@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 1 Apr 2003 21:02:25 +0000 (21:02 +0000)
(live_image_destructor): Reset image to initial state.
(examine_objects): Set DESTRUCTOR_MAY_BE_CALLED_LIVE.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@65145 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/unwind-dw2-fde-darwin.c

index 9410ca5..a96f1ad 100644 (file)
@@ -1,3 +1,9 @@
+2003-04-01  Geoffrey Keating  <geoffk@apple.com>
+
+       * unwind-dw2-fde-darwin.c (DESTRUCTOR_MAY_BE_CALLED_LIVE): New.
+       (live_image_destructor): Reset image to initial state.
+       (examine_objects): Set DESTRUCTOR_MAY_BE_CALLED_LIVE.
+
 2003-04-01  Eric Botcazou  <ebotcazou@libertysurf.fr>
 
        * config/sparc/sparc.c (input_operand): Accept bare
index 8bd161f..cd979dc 100644 (file)
@@ -86,12 +86,18 @@ enum {
   ALLOCED_IMAGE_MASK = 2,      /* The FDE entries were allocated by
                                   malloc, and must be freed.  This isn't
                                   used by newer libgcc versions.  */
-  IMAGE_IS_TEXT_MASK = 4       /* This image is in the TEXT segment.  */
+  IMAGE_IS_TEXT_MASK = 4,      /* This image is in the TEXT segment.  */
+  DESTRUCTOR_MAY_BE_CALLED_LIVE = 8  /* The destructor may be called on an
+                                       object that's part of the live
+                                       image list.  */
 };
 \f
-/* Delete any data we allocated on a live_images structure.
-   IMAGE has already been removed from the KEYMGR_GCC3_LIVE_IMAGE_LIST.
-   Called by KeyMgr (which will delete the struct after we return.)  */
+/* Delete any data we allocated on a live_images structure.  Either
+   IMAGE has already been removed from the
+   KEYMGR_GCC3_LIVE_IMAGE_LIST and the struct will be deleted
+   after we return, or that list is locked and we're being called
+   because this object might be about to be unloaded.  Called by
+   KeyMgr.  */
 
 static void 
 live_image_destructor (struct live_images *image)
@@ -105,7 +111,10 @@ live_image_destructor (struct live_images *image)
       image->object_info = NULL;
       if (image->examined_p & ALLOCED_IMAGE_MASK)
        free (image->fde);
+      image->fde = NULL;
     }
+  image->examined_p = 0;
+  image->destructor = NULL;
 }
 
 /* Run through the list of live images.  If we can allocate memory,
@@ -165,7 +174,8 @@ examine_objects (void *pc, struct dwarf_eh_bases *bases, int dont_alloc)
                image->destructor = live_image_destructor;
                image->object_info = ob;
                
-               image->examined_p |= EXAMINED_IMAGE_MASK;
+               image->examined_p |= (EXAMINED_IMAGE_MASK 
+                                     | DESTRUCTOR_MAY_BE_CALLED_LIVE);
              }
            image->fde = real_fde;