This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Revised new improved EH on Darwin


This is the previous patch with these cahnges:

- Makes DWARF2_OBJECT_END_PTR_EXTENSION specific to
  unwind-dw2-fde-darwin.c, not a general target macro; I was going
  to document it, and then realised it didn't make sense.

- Makes x86 behave the same way as powerpc on Darwin (I think I fixed
  a bug there too).

- Corrects the ChangeLog a bit.

I'll commit this when the bootstrap & testrun finishes.

-- 
- Geoffrey Keating <geoffk@apple.com>

===File ~/patches/darwin-realeh-3.patch=====================
Index: ChangeLog
2002-11-05  Geoffrey Keating  <geoffk@apple.com>

	* config.gcc: Don't create crtbegin, crtend on Darwin; do create
	crt2.o.  Rearrange t-darwin makefiles.
	* crtstuff.c [OBJECT_FORMAT_MACHO]: Delete.
	* unwind-dw2-fde-darwin.c: New.
	* unwind-dw2-fde-glibc.c: Correct comment.
	* unwind-dw2-fde.c (__register_frame_info_bases)
	[DWARF2_OBJECT_END_PTR_EXTENSION]: Clear fde_end.
	(classify_object_over_fdes): Use last_fde.
	(add_fdes): Likewise.
	(linear_search_fdes): Likewise.
	* unwind-dw2-fde.h (struct object)
	[DWARF2_OBJECT_END_PTR_EXTENSION]: Add fde_end field.
	(last_fde): New.
	* config/darwin.h (STARTFILE_SPEC): Include crt2.o not crtbegin.o.
	(ENDFILE_SPEC): No crtend.o.
	* config/t-darwin: New.
	* config/i386/t-darwin: Delete.
	* config/darwin-crt2.c: New.
	* config/rs6000/t-darwin: Delete contents duplicated in t-rs6000
	or config/t-darwin.

Index: testsuite/ChangeLog
2002-11-05  Geoffrey Keating  <geoffk@apple.com>

	* g++.old-deja/g++.eh/badalloc1.C: XFAIL excess errors test on
	Darwin.

Index: config.gcc
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config.gcc,v
retrieving revision 1.257
diff -u -p -u -p -r1.257 config.gcc
--- config.gcc	28 Oct 2002 17:20:35 -0000	1.257
+++ config.gcc	7 Nov 2002 00:04:16 -0000
@@ -985,12 +985,12 @@ i370-*-linux*)
 i[34567]86-*-darwin*)
 	tm_file="${tm_file} darwin.h i386/darwin.h"
 	tm_p_file="${tm_p_file} darwin-protos.h"
-	tmake_file=i386/t-darwin
+	tmake_file="t-darwin"
 	extra_objs="darwin.o"
 	target_gtfiles="\$(srcdir)/config/darwin.c"
 	c_target_objs="darwin-c.o"
 	cxx_target_objs="darwin-c.o"
-	extra_parts="crtbegin.o crtend.o"
+	extra_parts="crt2.o"
 	# Darwin linker does collect2 functionality
 	use_collect2=no
 	;;
@@ -1956,12 +1956,12 @@ powerpc-*-beos*)
 powerpc-*-darwin*)
 	tm_file="${tm_file} darwin.h rs6000/darwin.h"
 	tm_p_file="${tm_p_file} darwin-protos.h"
-	tmake_file=rs6000/t-darwin
+	tmake_file="rs6000/t-rs6000 t-darwin rs6000/t-darwin"
 	extra_objs="darwin.o"
 	target_gtfiles="\$(srcdir)/config/darwin.c"
 	c_target_objs="darwin-c.o"
 	cxx_target_objs="darwin-c.o"
-	extra_parts="crtbegin.o crtend.o"
+	extra_parts="crt2.o"
 	# Darwin linker does collect2 functionality
 	use_collect2=no
 	extra_headers=altivec.h
Index: crtstuff.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/crtstuff.c,v
retrieving revision 1.57
diff -u -p -u -p -r1.57 crtstuff.c
--- crtstuff.c	13 Sep 2002 03:44:53 -0000	1.57
+++ crtstuff.c	7 Nov 2002 00:04:17 -0000
@@ -126,8 +126,6 @@ extern void *__deregister_frame_info_bas
 /* Likewise for _Jv_RegisterClasses.  */
 extern void _Jv_RegisterClasses (void *) TARGET_ATTRIBUTE_WEAK;
 
-#ifndef OBJECT_FORMAT_MACHO
-
 #ifdef OBJECT_FORMAT_ELF
 
 /*  Declare a pointer to void function type.  */
@@ -542,83 +540,3 @@ __do_global_ctors (void)
 #else /* ! CRT_BEGIN && ! CRT_END */
 #error "One of CRT_BEGIN or CRT_END must be defined."
 #endif
-
-#else  /* OBJECT_FORMAT_MACHO */
-
-/* Crt stuff for Mach-O (NeXT and Darwin).
-
-   The theory of this is that each dynamically-loadable module,
-   including the main program itself, must have been positioned by
-   dyld before any frame info can be registered.  So we set up the
-   registration functions as dyld hooks, using a "preregistration"
-   function that is called directly from the system crt1.o.  */
-
-#ifdef CRT_BEGIN
-
-/* Homemade decls substituting for getsect.h and dyld.h, so cross
-   compilation works.  */
-struct mach_header;
-extern char *getsectdatafromheader (struct mach_header *, const char *,
-				    const char *, unsigned long *);
-extern void _dyld_register_func_for_add_image
-  (void (*) (struct mach_header *, unsigned long));
-extern void _dyld_register_func_for_remove_image
-  (void (*) (struct mach_header *, unsigned long));
-
-extern void __darwin_gcc3_preregister_frame_info (void);
-
-static void
-unwind_dyld_add_image_hook (struct mach_header *mh,
-			    unsigned long vm_slide)
-{
-  unsigned long sz;
-  char *fde;
-
-  fde = getsectdatafromheader (mh, "__TEXT", "__eh_frame", &sz);
-  if (fde)
-    {
-      struct object *ob = (struct object *) malloc (sizeof (struct object));
-
-      __register_frame_info (fde + vm_slide, ob);
-    }
-}
-
-static void
-unwind_dyld_remove_image_hook (struct mach_header *mh,
-			       unsigned long vm_slide)
-{
-  unsigned long sz;
-  char *fde;
-
-  fde = getsectdatafromheader (mh, "__TEXT", "__eh_frame", &sz);
-
-  if (fde)
-    __deregister_frame_info (fde + vm_slide);
-}
-
-/* Call this routine from the system crt1.o.  The call is standard in
-   Darwin 6.x (Mac OS X 10.2) and later; for earlier systems, you
-   would need to modify crt.c in the Csu project.  (This isn't great,
-   but other alternatives run afoul of linker semantics.  This
-   function is declared as common and tested before being called, so
-   that programs compiled by older GCCs still link and run.)  */
-
-void
-__darwin_gcc3_preregister_frame_info ()
-{
-  _dyld_register_func_for_add_image (unwind_dyld_add_image_hook);
-  _dyld_register_func_for_remove_image (unwind_dyld_remove_image_hook);
-}
-
-#elif defined(CRT_END) /* ! CRT_BEGIN */
-
-/* Install a single zero word at the end of the __eh_frame section.  */
-
-asm (".section __TEXT,__eh_frame");
-asm (".long 0");
-
-#else /* ! CRT_BEGIN && ! CRT_END */
-#error "One of CRT_BEGIN or CRT_END must be defined."
-#endif
-
-#endif  /* OBJECT_FORMAT_MACHO  */
Index: unwind-dw2-fde-darwin.c
===================================================================
RCS file: unwind-dw2-fde-darwin.c
diff -N unwind-dw2-fde-darwin.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ unwind-dw2-fde-darwin.c	7 Nov 2002 00:04:17 -0000
@@ -0,0 +1,231 @@
+/* Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+
+   This file is part of GNU CC.
+
+   GNU CC is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   GNU CC is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with GNU CC; see the file COPYING.  If not, write to
+   the Free Software Foundation, 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+/* As a special exception, if you link this library with other files,
+   some of which are compiled with GCC, to produce an executable,
+   this library does not by itself cause the resulting executable
+   to be covered by the GNU General Public License.
+   This exception does not however invalidate any other reasons why
+   the executable file might be covered by the GNU General Public License.  */
+
+/* Locate the FDE entry for a given address, using Darwin's keymgr support.  */
+
+#include "tconfig.h"
+#include <string.h>
+#include <stdlib.h>
+#include "dwarf2.h"
+#include "unwind.h"
+#define NO_BASE_OF_ENCODED_VALUE
+#define DWARF2_OBJECT_END_PTR_EXTENSION
+#include "unwind-pe.h"
+#include "unwind-dw2-fde.h"
+/* Carefully don't include gthr.h.  */
+
+typedef int __gthread_mutex_t;
+#define __gthread_mutex_lock(x)  (void)(x)
+#define __gthread_mutex_unlock(x) (void)(x)
+
+static fde * _Unwind_Find_registered_FDE (void *pc, 
+					  struct dwarf_eh_bases *bases);
+
+#define _Unwind_Find_FDE _Unwind_Find_registered_FDE
+#include "unwind-dw2-fde.c"
+#undef _Unwind_Find_FDE
+
+/* KeyMgr stuff.  */
+#define KEYMGR_GCC3_LIVE_IMAGE_LIST     301     /* loaded images  */
+#define KEYMGR_GCC3_DW2_OBJ_LIST        302     /* Dwarf2 object list  */
+
+extern void *_keymgr_get_and_lock_processwide_ptr (int);
+extern void _keymgr_set_and_unlock_processwide_ptr (int, void *);
+extern void _keymgr_unlock_processwide_ptr (int);
+
+struct mach_header;
+extern char *getsectdatafromheader (struct mach_header*, const char*,
+			const char *, unsigned long *);
+
+/* This is referenced from KEYMGR_GCC3_DW2_OBJ_LIST.  */
+struct km_object_info {
+  struct object *seen_objects;
+  struct object *unseen_objects;
+  unsigned spare[2];
+};
+
+/* Node of KEYMGR_GCC3_LIVE_IMAGE_LIST.  Info about each resident image.  */
+struct live_images {
+  unsigned long this_size;                      /* sizeof (live_images)  */
+  struct mach_header *mh;                       /* the image info  */
+  unsigned long vm_slide;
+  void (*destructor)(struct live_images *);     /* destructor for this  */
+  struct live_images *next;
+  unsigned int examined_p;
+  void *fde;
+  void *object_info;
+  unsigned long info[2];                        /* Future use.  */
+};
+
+/* Bits in the examined_p field of struct live_images.  */
+enum {
+  EXAMINED_IMAGE_MASK = 1,	/* We've seen this one.  */
+  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.  */
+};
+
+/* 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.)  */
+
+static void 
+live_image_destructor (struct live_images *image)
+{
+  if (image->object_info)
+    {
+      /* Free any sorted arrays.  */
+      __deregister_frame_info_bases (image->fde);
+
+      free (image->object_info);
+      image->object_info = NULL;
+      if (image->examined_p & ALLOCED_IMAGE_MASK)
+	free (image->fde);
+    }
+}
+
+/* Run through the list of live images.  If we can allocate memory,
+   give each unseen image a new `struct object'.  Even if we can't,
+   check whether the PC is inside the FDE of each unseen image.
+ */
+ 
+static inline fde *
+examine_objects (void *pc, struct dwarf_eh_bases *bases, int dont_alloc)
+{
+  fde *result = NULL;
+  struct live_images *image;
+
+  image = _keymgr_get_and_lock_processwide_ptr (KEYMGR_GCC3_LIVE_IMAGE_LIST);
+
+  for (; image != NULL; image = image->next)
+    if ((image->examined_p & EXAMINED_IMAGE_MASK) == 0)
+      {
+	char *fde;
+	unsigned long sz;
+	
+	fde = getsectdatafromheader (image->mh, "__DATA", "__eh_frame", &sz);
+	if (fde == NULL)
+	  {
+	    fde = getsectdatafromheader (image->mh, "__TEXT",
+					 "__eh_frame", &sz);
+	    if (fde != NULL)
+	      image->examined_p |= IMAGE_IS_TEXT_MASK;
+	  }
+	
+	/* If .eh_frame is empty, don't register at all.  */
+	if (fde != NULL && sz > 0)
+	  {
+	    char *real_fde = (fde + image->vm_slide);
+	    struct object *ob = NULL;
+	    struct object panicob;
+	    
+	    if (! dont_alloc)
+	      ob = calloc (1, sizeof (struct object));
+	    dont_alloc |= ob == NULL;
+	    if (dont_alloc)
+	      ob = &panicob;
+	    
+	    ob->pc_begin = (void *)-1;
+	    ob->tbase = 0;
+	    ob->dbase = 0;
+	    ob->u.single = (struct dwarf_fde *)real_fde;
+	    ob->s.i = 0;
+	    ob->s.b.encoding = DW_EH_PE_omit;
+	    ob->fde_end = real_fde + sz;
+	    
+	    if (! dont_alloc)
+	      {
+		ob->next = unseen_objects;
+		unseen_objects = ob;
+		
+		image->destructor = live_image_destructor;
+		image->object_info = ob;
+		
+		image->examined_p |= EXAMINED_IMAGE_MASK;
+	      }
+	    image->fde = real_fde;
+	    
+	    result = search_object (ob, pc);
+	    if (result)
+	      {
+		int encoding;
+		
+		bases->tbase = ob->tbase;
+		bases->dbase = ob->dbase;
+		
+		encoding = ob->s.b.encoding;
+		if (ob->s.b.mixed_encoding)
+		  encoding = get_fde_encoding (result);
+		read_encoded_value_with_base (encoding, 
+					      base_from_object (encoding, ob),
+					      result->pc_begin, 
+					      (_Unwind_Ptr *)&bases->func);
+		break;
+	      }
+	  }
+	else
+	  image->examined_p |= EXAMINED_IMAGE_MASK;
+      }
+
+  _keymgr_unlock_processwide_ptr (KEYMGR_GCC3_LIVE_IMAGE_LIST);
+
+  return result;
+}
+
+fde *
+_Unwind_Find_FDE (void *pc, struct dwarf_eh_bases *bases)
+{
+  struct km_object_info *the_obj_info;
+  fde *ret = NULL;
+
+  the_obj_info = 
+    _keymgr_get_and_lock_processwide_ptr (KEYMGR_GCC3_DW2_OBJ_LIST);
+  if (! the_obj_info)
+    the_obj_info = calloc (1, sizeof (*the_obj_info));
+  
+  if (the_obj_info != NULL)
+    {
+      seen_objects = the_obj_info->seen_objects;
+      unseen_objects = the_obj_info->unseen_objects;
+  
+      ret = _Unwind_Find_registered_FDE (pc, bases);
+    }
+  
+  /* OK, didn't find it in the list of FDEs we've seen before,
+     so go through and look at the new ones.  */
+  if (ret == NULL)
+    ret = examine_objects (pc, bases, the_obj_info == NULL);
+
+  if (the_obj_info != NULL)
+    {
+      the_obj_info->seen_objects = seen_objects;
+      the_obj_info->unseen_objects = unseen_objects;
+      _keymgr_set_and_unlock_processwide_ptr (KEYMGR_GCC3_DW2_OBJ_LIST,
+					      the_obj_info);
+    }
+  return ret;
+}
Index: unwind-dw2-fde-glibc.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/unwind-dw2-fde-glibc.c,v
retrieving revision 1.6
diff -u -p -u -p -r1.6 unwind-dw2-fde-glibc.c
--- unwind-dw2-fde-glibc.c	31 May 2002 22:15:40 -0000	1.6
+++ unwind-dw2-fde-glibc.c	7 Nov 2002 00:04:17 -0000
@@ -79,8 +79,8 @@ struct unw_eh_frame_hdr
   unsigned char table_enc;
 };
 
-/* Like base_of_encoded_value, but take the base from a struct object
-   instead of an _Unwind_Context.  */
+/* Like base_of_encoded_value, but take the base from a struct
+   unw_eh_callback_data instead of an _Unwind_Context.  */
 
 static _Unwind_Ptr
 base_from_cb_data (unsigned char encoding, struct unw_eh_callback_data *data)
Index: unwind-dw2-fde.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/unwind-dw2-fde.c,v
retrieving revision 1.20
diff -u -p -u -p -r1.20 unwind-dw2-fde.c
--- unwind-dw2-fde.c	31 May 2002 22:15:39 -0000	1.20
+++ unwind-dw2-fde.c	7 Nov 2002 00:04:17 -0000
@@ -1,5 +1,5 @@
 /* Subroutines needed for unwinding stack frames for exception handling.  */
-/* Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+/* Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
    Contributed by Jason Merrill <jason@cygnus.com>.
 
 This file is part of GCC.
@@ -85,6 +85,9 @@ __register_frame_info_bases (void *begin
   ob->u.single = begin;
   ob->s.i = 0;
   ob->s.b.encoding = DW_EH_PE_omit;
+#ifdef DWARF2_OBJECT_END_PTR_EXTENSION
+  ob->fde_end = NULL;
+#endif
 
   init_object_mutex_once ();
   __gthread_mutex_lock (&object_mutex);
@@ -602,7 +605,7 @@ classify_object_over_fdes (struct object
   int encoding = DW_EH_PE_absptr;
   _Unwind_Ptr base = 0;
 
-  for (; this_fde->length != 0; this_fde = next_fde (this_fde))
+  for (; ! last_fde (ob, this_fde); this_fde = next_fde (this_fde))
     {
       struct dwarf_cie *this_cie;
       _Unwind_Ptr mask, pc_begin;
@@ -656,7 +659,7 @@ add_fdes (struct object *ob, struct fde_
   int encoding = ob->s.b.encoding;
   _Unwind_Ptr base = base_from_object (ob->s.b.encoding, ob);
 
-  for (; this_fde->length != 0; this_fde = next_fde (this_fde))
+  for (; ! last_fde (ob, this_fde); this_fde = next_fde (this_fde))
     {
       struct dwarf_cie *this_cie;
 
@@ -773,7 +776,7 @@ linear_search_fdes (struct object *ob, f
   int encoding = ob->s.b.encoding;
   _Unwind_Ptr base = base_from_object (ob->s.b.encoding, ob);
 
-  for (; this_fde->length != 0; this_fde = next_fde (this_fde))
+  for (; ! last_fde (ob, this_fde); this_fde = next_fde (this_fde))
     {
       struct dwarf_cie *this_cie;
       _Unwind_Ptr pc_begin, pc_range;
Index: unwind-dw2-fde.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/unwind-dw2-fde.h,v
retrieving revision 1.8
diff -u -p -u -p -r1.8 unwind-dw2-fde.h
--- unwind-dw2-fde.h	31 May 2002 22:15:40 -0000	1.8
+++ unwind-dw2-fde.h	7 Nov 2002 00:04:17 -0000
@@ -61,6 +61,10 @@ struct object
     size_t i;
   } s;
 
+#ifdef DWARF2_OBJECT_END_PTR_EXTENSION
+  char *fde_end;
+#endif
+
   struct object *next;
 };
 
@@ -160,3 +164,13 @@ next_fde (fde *f)
 }
 
 extern fde * _Unwind_Find_FDE (void *, struct dwarf_eh_bases *);
+
+static inline int
+last_fde (struct object *obj, fde *f)
+{
+#ifdef DWARF2_OBJECT_END_PTR_EXTENSION
+  return (char *)f == obj->fde_end || f->length == 0;
+#else
+  return f->length == 0;
+#endif
+}
Index: config/darwin-crt2.c
===================================================================
RCS file: config/darwin-crt2.c
diff -N config/darwin-crt2.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ config/darwin-crt2.c	7 Nov 2002 00:04:25 -0000
@@ -0,0 +1,151 @@
+/* KeyMgr backwards-compatibility support for Darwin.
+   Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 2, or (at your option) any later
+version.
+
+In addition to the permissions in the GNU General Public License, the
+Free Software Foundation gives you unlimited permission to link the
+compiled version of this file into combinations with other programs,
+and to distribute those combinations without any restriction coming
+from the use of this file.  (The General Public License restrictions
+do apply in other respects; for example, they cover modification of
+the file, and distribution when not linked into a combine
+executable.)
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA.  */
+
+/* It is incorrect to include config.h here, because this file is being
+   compiled for the target, and hence definitions concerning only the host
+   do not apply.  */
+
+#include "tconfig.h"
+#include "tsystem.h"
+
+/* Homemade decls substituting for getsect.h and dyld.h, so cross
+   compilation works.  */
+struct mach_header;
+extern char *getsectdatafromheader (struct mach_header *, const char *,
+				    const char *, unsigned long *);
+extern void _dyld_register_func_for_add_image
+  (void (*) (struct mach_header *, unsigned long));
+extern void _dyld_register_func_for_remove_image
+  (void (*) (struct mach_header *, unsigned long));
+
+extern void __darwin_gcc3_preregister_frame_info (void);
+
+/* These are from "keymgr.h".  */
+extern void _init_keymgr (void);
+extern void *_keymgr_get_and_lock_processwide_ptr (unsigned key);
+extern void _keymgr_set_and_unlock_processwide_ptr (unsigned key, void *ptr);
+
+extern void *__keymgr_global[];
+typedef struct _Sinfo_Node {
+        unsigned int size ;             /*size of this node*/
+        unsigned short major_version ;  /*API major version.*/
+        unsigned short minor_version ;  /*API minor version.*/
+        } _Tinfo_Node ;
+
+/* KeyMgr 3.x is the first one supporting GCC3 stuff natively.  */
+#define KEYMGR_API_MAJOR_GCC3           3       
+/* ... with these keys.  */
+#define KEYMGR_GCC3_LIVE_IMAGE_LIST	301     /* loaded images  */
+#define KEYMGR_GCC3_DW2_OBJ_LIST	302     /* Dwarf2 object list  */   
+
+/* Node of KEYMGR_GCC3_LIVE_IMAGE_LIST.  Info about each resident image.  */
+struct live_images {
+  unsigned long this_size;                      /* sizeof (live_images)  */
+  struct mach_header *mh;                       /* the image info  */
+  unsigned long vm_slide;
+  void (*destructor)(struct live_images *);     /* destructor for this  */
+  struct live_images *next;
+  unsigned int examined_p;
+  void *fde;
+  void *object_info;
+  unsigned long info[2];                        /* Future use.  */
+};
+
+
+/* These routines are used only on Darwin versions before 10.2.
+   Later versions have equivalent code in the system.  
+   Eventually, they might go away, although it might be a long time...  */
+
+static void darwin_unwind_dyld_remove_image_hook 
+  (struct mach_header *m, unsigned long s);
+static void darwin_unwind_dyld_remove_image_hook 
+  (struct mach_header *m, unsigned long s);
+extern void __darwin_gcc3_preregister_frame_info (void);
+     
+static void
+darwin_unwind_dyld_add_image_hook (struct mach_header *mh, unsigned long slide)
+{
+  struct live_images *l = (struct live_images *)calloc (1, sizeof (*l));
+  l->mh = mh;
+  l->vm_slide = slide;
+  l->this_size = sizeof (*l);
+  l->next = (struct live_images *)
+	_keymgr_get_and_lock_processwide_ptr (KEYMGR_GCC3_LIVE_IMAGE_LIST);
+  _keymgr_set_and_unlock_processwide_ptr (KEYMGR_GCC3_LIVE_IMAGE_LIST, l);
+}
+
+static void
+darwin_unwind_dyld_remove_image_hook (struct mach_header *m, unsigned long s)
+{
+  struct live_images *top, **lip, *destroy = NULL;
+
+  /* Look for it in the list of live images and delete it.  */
+
+  top = (struct live_images *)
+	   _keymgr_get_and_lock_processwide_ptr (KEYMGR_GCC3_LIVE_IMAGE_LIST);
+  for (lip = &top; *lip != NULL; lip = &(*lip)->next)
+    {
+      if ((*lip)->mh == m && (*lip)->vm_slide == s)
+        {
+          destroy = *lip;
+          *lip = destroy->next;			/* unlink DESTROY  */
+
+          if (destroy->this_size != sizeof (*destroy))	/* sanity check  */
+            abort ();
+
+          break;
+        }
+    }
+  _keymgr_set_and_unlock_processwide_ptr (KEYMGR_GCC3_LIVE_IMAGE_LIST, top);
+
+  /* Now that we have unlinked this from the image list, toss it.  */
+  if (destroy != NULL)
+    {
+      if (destroy->destructor != NULL)
+	(*destroy->destructor) (destroy);
+      free (destroy);
+    }
+}
+
+void
+__darwin_gcc3_preregister_frame_info (void)
+{
+  const _Tinfo_Node *info;
+  _init_keymgr ();
+  info = (_Tinfo_Node *)__keymgr_global[2];
+  if (info != NULL)
+    {
+      if (info->major_version >= KEYMGR_API_MAJOR_GCC3)
+	return;
+      /* Otherwise, use our own add_image_hooks.  */
+    }
+
+  _dyld_register_func_for_add_image (darwin_unwind_dyld_add_image_hook);
+  _dyld_register_func_for_remove_image (darwin_unwind_dyld_remove_image_hook);
+}
Index: config/darwin.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/darwin.h,v
retrieving revision 1.41
diff -u -p -u -p -r1.41 darwin.h
--- config/darwin.h	29 Sep 2002 13:16:44 -0000	1.41
+++ config/darwin.h	7 Nov 2002 00:04:28 -0000
@@ -98,12 +98,13 @@ Boston, MA 02111-1307, USA.  */
 
 #undef	STARTFILE_SPEC
 #define STARTFILE_SPEC  \
-  "%{pg:%{static:-lgcrt0.o}%{!static:-lgcrt1.o -lcrtbegin.o}} \
-    %{!pg:%{static:-lcrt0.o}%{!static:-lcrt1.o -lcrtbegin.o}}"
+  "%{pg:%{static:-lgcrt0.o}%{!static:-lgcrt1.o} -lcrt2.o} \
+    %{!pg:%{static:-lcrt0.o}%{!static:-lcrt1.o} -lcrt2.o}"
 
-#undef	ENDFILE_SPEC
-#define ENDFILE_SPEC \
-  "-lcrtend.o"
+/* The native Darwin linker doesn't necessarily place files in the order
+   that they're specified on the link line.  Thus, it is pointless
+   to put anything in ENDFILE_SPEC.  */
+/* #define ENDFILE_SPEC "" */
 
 #undef	DOLLARS_IN_IDENTIFIERS
 #define DOLLARS_IN_IDENTIFIERS 2
Index: config/t-darwin
===================================================================
RCS file: config/t-darwin
diff -N config/t-darwin
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ config/t-darwin	7 Nov 2002 00:04:29 -0000
@@ -0,0 +1,22 @@
+darwin.o: $(srcdir)/config/darwin.c $(CONFIG_H) $(SYSTEM_H) $(RTL_BASE_H) \
+          $(REGS_H) hard-reg-set.h insn-config.h conditions.h output.h \
+          insn-attr.h flags.h $(TREE_H) $(EXPR_H) reload.h \
+          function.h $(GGC_H) $(TM_P_H) gt-darwin.h
+	$(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $<
+
+darwin-c.o: $(srcdir)/config/darwin-c.c $(CONFIG_H) $(SYSTEM_H) \
+	    $(TREE_H) $(C_TREE_H) c-pragma.h toplev.h cpplib.h $(TM_P_H)
+	$(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $<
+
+gt-darwin.h : s-gtype ; @true
+
+# Explain how to build crt2.o
+$(T)crt2$(objext): $(srcdir)/config/darwin-crt2.c $(GCC_PASSES) \
+	$(TCONFIG_H) tsystem.h
+	$(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) \
+	  -c $(srcdir)/config/darwin-crt2.c -o $(T)crt2$(objext)
+
+# Use unwind-dw2-fde-darwin
+LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/unwind-dw2-fde-darwin.c \
+  $(srcdir)/unwind-sjlj.c
+LIB2ADDEHDEP = unwind.inc unwind-dw2-fde.h unwind-dw2-fde.c
Index: config/i386/t-darwin
===================================================================
RCS file: config/i386/t-darwin
diff -N config/i386/t-darwin
--- config/i386/t-darwin	31 Jul 2002 23:18:44 -0000	1.1
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,11 +0,0 @@
-darwin.o: $(srcdir)/config/darwin.c $(CONFIG_H) $(SYSTEM_H) $(RTL_BASE_H) \
-          $(REGS_H) hard-reg-set.h insn-config.h conditions.h output.h \
-          insn-attr.h flags.h $(TREE_H) $(EXPR_H) reload.h \
-          function.h $(GGC_H) $(TM_P_H) gt-darwin.h
-	$(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $<
-
-darwin-c.o: $(srcdir)/config/darwin-c.c $(CONFIG_H) $(SYSTEM_H) \
-	    $(TREE_H) $(C_TREE_H) c-pragma.h toplev.h cpplib.h $(TM_P_H)
-	$(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $<
-
-gt-darwin.h : s-gtype ; @true
Index: config/rs6000/t-darwin
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/rs6000/t-darwin,v
retrieving revision 1.7
diff -u -p -u -p -r1.7 t-darwin
--- config/rs6000/t-darwin	4 Jun 2002 07:09:33 -0000	1.7
+++ config/rs6000/t-darwin	7 Nov 2002 00:04:33 -0000
@@ -1,34 +1,2 @@
-# Library code must include trampoline support
+# Library code must include trampoline support.
 LIB2FUNCS_EXTRA = $(srcdir)/config/rs6000/darwin-tramp.asm
-
-# We want fine grained libraries, so use the new code to build the
-# floating point emulation libraries.
-FPBIT = fp-bit.c
-DPBIT = dp-bit.c
-
-dp-bit.c: $(srcdir)/config/fp-bit.c
-	cat $(srcdir)/config/fp-bit.c > dp-bit.c
-
-fp-bit.c: $(srcdir)/config/fp-bit.c
-	echo '#define FLOAT' > fp-bit.c
-	cat $(srcdir)/config/fp-bit.c >> fp-bit.c
-
-darwin.o: $(srcdir)/config/darwin.c $(CONFIG_H) $(SYSTEM_H) $(RTL_BASE_H) \
-          $(REGS_H) hard-reg-set.h insn-config.h conditions.h output.h \
-          insn-attr.h flags.h $(TREE_H) $(EXPR_H) reload.h \
-          function.h $(GGC_H) $(TM_P_H) gt-darwin.h
-	$(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $<
-
-darwin-c.o: $(srcdir)/config/darwin-c.c $(CONFIG_H) $(SYSTEM_H) \
-	    $(TREE_H) $(C_TREE_H) c-pragma.h toplev.h cpplib.h $(TM_P_H)
-	$(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $<
-
-gt-darwin.h : s-gtype ; @true
-
-# Build the libraries for both hard and soft floating point
-
-MULTILIB_OPTIONS = msoft-float
-MULTILIB_DIRNAMES = soft-float
-
-LIBGCC = stmp-multilib
-INSTALL_LIBGCC = install-multilib
Index: testsuite/g++.old-deja/g++.eh/badalloc1.C
===================================================================
RCS file: /cvs/gcc/gcc/gcc/testsuite/g++.old-deja/g++.eh/badalloc1.C,v
retrieving revision 1.7
diff -u -p -u -p -r1.7 badalloc1.C
--- testsuite/g++.old-deja/g++.eh/badalloc1.C	21 Dec 2001 18:03:25 -0000	1.7
+++ testsuite/g++.old-deja/g++.eh/badalloc1.C	7 Nov 2002 00:04:57 -0000
@@ -1,5 +1,5 @@
-// excess errors test - XFAIL xstormy16-*-*
-// Copyright (C) 2000 Free Software Foundation, Inc.
+// excess errors test - XFAIL xstormy16-*-* *-*-darwin*
+// Copyright (C) 2000, 2002 Free Software Foundation, Inc.
 // Contributed by Nathan Sidwell 6 June 2000 <nathan@codesourcery.com>
 
 // Check we can throw a bad_alloc exception when malloc dies.
============================================================


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]