diff options
author | Geoffrey Keating <geoffk@apple.com> | 2002-11-07 06:00:07 +0000 |
---|---|---|
committer | Geoffrey Keating <geoffk@gcc.gnu.org> | 2002-11-07 06:00:07 +0000 |
commit | 3cfe49dab857d0d0a61597afe558a175287c27ec (patch) | |
tree | 0a818627c9d2e5109f50615e83ad08d7572b1feb /gcc/config | |
parent | 12f256d42ec080c4bc69e08636ce3b40b792eae7 (diff) | |
download | gcc-3cfe49dab857d0d0a61597afe558a175287c27ec.zip gcc-3cfe49dab857d0d0a61597afe558a175287c27ec.tar.gz gcc-3cfe49dab857d0d0a61597afe558a175287c27ec.tar.bz2 |
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.
From-SVN: r58877
Diffstat (limited to 'gcc/config')
-rw-r--r-- | gcc/config/darwin-crt2.c | 151 | ||||
-rw-r--r-- | gcc/config/darwin.h | 11 | ||||
-rw-r--r-- | gcc/config/rs6000/t-darwin | 34 | ||||
-rw-r--r-- | gcc/config/t-darwin (renamed from gcc/config/i386/t-darwin) | 11 |
4 files changed, 169 insertions, 38 deletions
diff --git a/gcc/config/darwin-crt2.c b/gcc/config/darwin-crt2.c new file mode 100644 index 0000000..1ea2413 --- /dev/null +++ b/gcc/config/darwin-crt2.c @@ -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 = ⊤ *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); +} diff --git a/gcc/config/darwin.h b/gcc/config/darwin.h index f215a75..27ce49f 100644 --- a/gcc/config/darwin.h +++ b/gcc/config/darwin.h @@ -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 diff --git a/gcc/config/rs6000/t-darwin b/gcc/config/rs6000/t-darwin index 1629578..7aca023 100644 --- a/gcc/config/rs6000/t-darwin +++ b/gcc/config/rs6000/t-darwin @@ -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 diff --git a/gcc/config/i386/t-darwin b/gcc/config/t-darwin index 5128557..aca59ba 100644 --- a/gcc/config/i386/t-darwin +++ b/gcc/config/t-darwin @@ -9,3 +9,14 @@ darwin-c.o: $(srcdir)/config/darwin-c.c $(CONFIG_H) $(SYSTEM_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 |