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]

new improved EH on Darwin


Apparently, Darwin's ld will reorder objects you supply on the command
line, which means that the end-of-section marker in crtend.o sometimes
appears before the EH information for libgcc.  In particular, all the
EH tests fail on mainline if you use the sourceware dejagnu (because
the sourceware dejagnu supplies -lm, which is really -lc on Darwin, so
you get -lc -lgcc -lc -lgcc -lcrtend.o which then gets reordered).

Thus, some rewriting is in order.  This version of EH for Darwin has
these additional advantages:
- works across modules
- compatible with the native GCC on Darwin
- less load-time overhead
none of which the previous version (in this tree) had.  It also has a
small advantage over the previous Apple version:
- can throw even when malloc can't allocate memory.

Bootstrapped and tested on powerpc-darwin; with this, I get 11 g++
failures and one libstdc++-v3 failure, none of which seem EH-related.

I will wait a while before committing so those with history on Darwin
can read the code; I think I'd also like to check that new executables
still work on old Darwin versions.

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

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

	* config.gcc: Don't create crtbegin, crtend on Darwin.
	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): No crtbegin.o.
	(ENDFILE_SPEC): No crtend.o either.
	(DWARF2_OBJECT_END_PTR_EXTENSION): Define.
	* config/t-darwin: New.
	* config/i386/t-darwin: Delete.
	* config/rs6000/darwin-crtbegin.c: New.
	* config/rs6000/t-darwin: Delete contents duplicated in t-rs6000
	or config/t-darwin.
	(LIB2FUNCS_EXTRA): Add darwin-crtbegin.o.

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	6 Nov 2002 19:47:26 -0000
@@ -985,12 +985,11 @@ 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 i386/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"
 	# Darwin linker does collect2 functionality
 	use_collect2=no
 	;;
@@ -1956,12 +1955,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	6 Nov 2002 19:47:26 -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	6 Nov 2002 19:47:26 -0000
@@ -0,0 +1,230 @@
+/* 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
+#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	6 Nov 2002 19:47:26 -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	6 Nov 2002 19:47:27 -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	6 Nov 2002 19:47:29 -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.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	6 Nov 2002 19:47:42 -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}} \
+    %{!pg:%{static:-lcrt0.o}%{!static:-lcrt1.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
@@ -618,6 +619,10 @@ enum machopic_addr_class {
   darwin_asm_output_dwarf_delta (FILE, SIZE, LABEL1, LABEL2)
 
 #define TARGET_TERMINATE_DW2_EH_FRAME_INFO false
+
+/* Define if we want the "struct object" in unwind-dw2-fde.h to be extended
+   with a "dwarf_fde_end" field.  */
+#define DWARF2_OBJECT_END_PTR_EXTENSION
 
 #define DARWIN_REGISTER_TARGET_PRAGMAS(PFILE)				\
   do {									\
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	6 Nov 2002 19:47:42 -0000
@@ -0,0 +1,16 @@
+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
+
+# 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/darwin-crt2.c
===================================================================
RCS file: config/rs6000/darwin-crt2.c
diff -N config/rs6000/darwin-crt2.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ config/rs6000/darwin-crt2.c	6 Nov 2002 19:47:55 -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/rs6000/darwin.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/rs6000/darwin.h,v
retrieving revision 1.29
diff -u -p -u -p -r1.29 darwin.h
--- config/rs6000/darwin.h	31 Oct 2002 20:32:49 -0000	1.29
+++ config/rs6000/darwin.h	6 Nov 2002 19:48:02 -0000
@@ -1,5 +1,5 @@
 /* Target definitions for PowerPC running Darwin (Mac OS X).
-   Copyright (C) 1997, 2000, 2001 Free Software Foundation, Inc.
+   Copyright (C) 1997, 2000, 2001, 2002 Free Software Foundation, Inc.
    Contributed by Apple Computer Inc.
 
 This file is part of GNU CC.
@@ -243,3 +243,10 @@ Boston, MA 02111-1307, USA.  */
 
 #undef REGISTER_TARGET_PRAGMAS
 #define REGISTER_TARGET_PRAGMAS DARWIN_REGISTER_TARGET_PRAGMAS
+
+/* We specify crt0.o as -lcrt0.o so that ld will search the library path.  */
+
+#undef	STARTFILE_SPEC
+#define STARTFILE_SPEC  \
+  "%{pg:%{static:-lgcrt0.o}%{!static:-lgcrt1.o}} \
+    %{!pg:%{static:-lcrt0.o}%{!static:-lcrt1.o}} -lcrt2.o"
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	6 Nov 2002 19:48:02 -0000
@@ -1,34 +1,8 @@
-# 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
+# Explain how to build crt2.o
+$(T)crt2$(objext): $(srcdir)/config/rs6000/darwin-crt2.c $(GCC_PASSES) \
+	$(TCONFIG_H) tsystem.h
+	$(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) \
+	  -c $(srcdir)/config/rs6000/darwin-crt2.c -o $(T)crt2$(objext)
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	6 Nov 2002 19:48:42 -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]