diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4250e239849..0221aead2e5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2009-09-22 Loren J. Rittle + + * unwind-dw2-fde-glibc.c: Define and use USE_PT_GNU_EH_FRAME. + Enable a new case for __FreeBSD__ >= 7. + * crtstuff.c: Define USE_PT_GNU_EH_FRAME for __FreeBSD__ >= 7. + * config/t-freebsd: Define LIB2ADDEH and LIB2ADDEHDEP. + * config/freebsd-spec.h: Conditionally define LINK_EH_SPEC + and USE_LD_AS_NEEDED. + 2009-09-22 Richard Guenther PR middle-end/41395 diff --git a/gcc/config/freebsd-spec.h b/gcc/config/freebsd-spec.h index c726a158c6b..84d81278af8 100644 --- a/gcc/config/freebsd-spec.h +++ b/gcc/config/freebsd-spec.h @@ -148,3 +148,12 @@ is built with the --enable-threads configure-time option.} \ #else #define FBSD_DYNAMIC_LINKER "/libexec/ld-elf.so.1" #endif + +#if defined(HAVE_LD_EH_FRAME_HDR) +#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " +#endif + +/* Use --as-needed -lgcc_s for eh support. */ +#ifdef HAVE_LD_AS_NEEDED +#define USE_LD_AS_NEEDED 1 +#endif diff --git a/gcc/config/t-freebsd b/gcc/config/t-freebsd index 0680618a6ec..c1b086ea116 100644 --- a/gcc/config/t-freebsd +++ b/gcc/config/t-freebsd @@ -3,3 +3,8 @@ CRTSTUFF_T_CFLAGS_S = $(CRTSTUFF_T_CFLAGS) -fPIC # Compile libgcc.a with pic. TARGET_LIBGCC2_CFLAGS += -fPIC + +# Use unwind-dw2-fde-glibc +LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/unwind-dw2-fde-glibc.c \ + $(srcdir)/unwind-sjlj.c $(srcdir)/gthr-gnat.c $(srcdir)/unwind-c.c +LIB2ADDEHDEP = unwind.inc unwind-dw2-fde.h unwind-dw2-fde.c diff --git a/gcc/crtstuff.c b/gcc/crtstuff.c index 6f8a8dd2d62..2b6b7799209 100644 --- a/gcc/crtstuff.c +++ b/gcc/crtstuff.c @@ -79,6 +79,15 @@ call_ ## FUNC (void) \ } #endif +#if defined(OBJECT_FORMAT_ELF) \ + && !defined(OBJECT_FORMAT_FLAT) \ + && defined(HAVE_LD_EH_FRAME_HDR) \ + && !defined(inhibit_libc) && !defined(CRTSTUFFT_O) \ + && defined(__FreeBSD__) && __FreeBSD__ >= 7 +#include +# define USE_PT_GNU_EH_FRAME +#endif + #if defined(OBJECT_FORMAT_ELF) \ && !defined(OBJECT_FORMAT_FLAT) \ && defined(HAVE_LD_EH_FRAME_HDR) \ diff --git a/gcc/unwind-dw2-fde-glibc.c b/gcc/unwind-dw2-fde-glibc.c index 418f0300108..ad6ecd50d59 100644 --- a/gcc/unwind-dw2-fde-glibc.c +++ b/gcc/unwind-dw2-fde-glibc.c @@ -48,6 +48,16 @@ #if !defined(inhibit_libc) && defined(HAVE_LD_EH_FRAME_HDR) \ && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) \ || (__GLIBC__ == 2 && __GLIBC_MINOR__ == 2 && defined(DT_CONFIG))) +# define USE_PT_GNU_EH_FRAME +#endif + +#if !defined(inhibit_libc) && defined(HAVE_LD_EH_FRAME_HDR) \ + && defined(__FreeBSD__) && __FreeBSD__ >= 7 +# define ElfW __ElfN +# define USE_PT_GNU_EH_FRAME +#endif + +#if defined(USE_PT_GNU_EH_FRAME) #ifndef __RELOC_POINTER # define __RELOC_POINTER(ptr, base) ((ptr) + (base))