diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 224b4587987..c51ce01730e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,33 @@ +2007-09-14 Sandra Loosemore + Nigel Stephens + + * doc/tm.texi (LIBGCC2_UNWIND_ATTRIBUTE): Document. + * unwind-generic.h (LIBGCC2_UNWIND_ATTRIBUTE): Define. + (_Unwind_RaiseException): Add LIBGCC2_UNWIND_ATTRIBUTE to + declaration. + (_Unwind_ForcedUnwind): Likewise. + (_Unwind_Resume): Likewise. + (_Unwind_Resume_or_Rethrow): Likewise. + (_Unwind_Backtrace): Likewise. + (_Unwind_SjLj_RaiseException): Likewise. + (_Unwind_SjLj_ForcedUnwind): Likewise. + (_Unwind_SjLj_Resume): Likewise. + (_Unwind_SjLj_Resume_or_Rethrow): Likewise. + * unwind.inc (_Unwind_RaiseException): Add LIBGCC2_UNWIND_ATTRIBUTE + to definition. + (_Unwind_ForcedUnwind): Likewise. + (_Unwind_Resume): Likewise. + (_Unwind_Resume_or_Rethrow): Likewise. + (_Unwind_Backtrace): Likewise. + * unwind-compat.c (_Unwind_Backtrace): Likewise. + (_Unwind_ForcedUnwind): Likewise. + (_Unwind_RaiseException): Likewise. + (_Unwind_Resume): Likewise. + (_Unwind_Resume_or_Rethrow): Likewise. + + * config/mips/mips.h (LIBGCC2_UNWIND_ATTRIBUTE): Define to force + nomips16 mode when IN_LIBGCC2 with hard float. + 2007-09-14 Richard Sandiford * config/mips/sdemtk.opt: Update to GPLv3. diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h index 55e605a8c06..0d23e566105 100644 --- a/gcc/config/mips/mips.h +++ b/gcc/config/mips/mips.h @@ -582,6 +582,17 @@ extern enum mips_llsc_setting mips_llsc; #endif #endif /* IN_LIBGCC2 */ +/* Force the call stack unwinders in unwind.inc not to be MIPS16 code + when compiled with hardware floating point. This is because MIPS16 + code cannot save and restore the floating-point registers, which is + important if in a mixed MIPS16/non-MIPS16 environment. */ + +#ifdef IN_LIBGCC2 +#if __mips_hard_float +#define LIBGCC2_UNWIND_ATTRIBUTE __attribute__((__nomips16__)) +#endif +#endif /* IN_LIBGCC2 */ + #define TARGET_LIBGCC_SDATA_SECTION ".sdata" #ifndef MULTILIB_ENDIAN_DEFAULT diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index deb3abc2e87..c2da9f823a2 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -10336,3 +10336,10 @@ SUPPORTS_WEAK and TARGET_HAVE_NAMED_SECTIONS are true, else 0. This macro determines the size of the objective C jump buffer for the NeXT runtime. By default, OBJC_JBLEN is defined to an innocuous value. @end defmac + +@defmac LIBGCC2_UNWIND_ATTRIBUTE +Define this macro if any target-specific attributes need to be attached +to the functions in @file{libgcc} that provide low-level support for +call stack unwinding. It is used in declarations in @file{unwind-generic.h} +and the associated definitions of those functions. +@end defmac diff --git a/gcc/unwind-compat.c b/gcc/unwind-compat.c index fa40ab27cba..35b4fe884d4 100644 --- a/gcc/unwind-compat.c +++ b/gcc/unwind-compat.c @@ -38,7 +38,7 @@ extern _Unwind_Reason_Code __libunwind_Unwind_Backtrace (_Unwind_Trace_Fn, void *); -_Unwind_Reason_Code +_Unwind_Reason_Code LIBGCC2_UNWIND_ATTRIBUTE _Unwind_Backtrace (_Unwind_Trace_Fn trace, void *trace_argument) { return __libunwind_Unwind_Backtrace (trace, trace_argument); @@ -67,7 +67,7 @@ symver (_Unwind_FindEnclosingFunction, GCC_3.3); extern _Unwind_Reason_Code __libunwind_Unwind_ForcedUnwind (struct _Unwind_Exception *, _Unwind_Stop_Fn, void *); -_Unwind_Reason_Code +_Unwind_Reason_Code LIBGCC2_UNWIND_ATTRIBUTE _Unwind_ForcedUnwind (struct _Unwind_Exception *exc, _Unwind_Stop_Fn stop, void * stop_argument) { @@ -166,7 +166,7 @@ symver (_Unwind_GetRegionStart, GCC_3.0); extern _Unwind_Reason_Code __libunwind_Unwind_RaiseException (struct _Unwind_Exception *); -_Unwind_Reason_Code +_Unwind_Reason_Code LIBGCC2_UNWIND_ATTRIBUTE _Unwind_RaiseException(struct _Unwind_Exception *exc) { return __libunwind_Unwind_RaiseException (exc); @@ -175,7 +175,7 @@ symver (_Unwind_RaiseException, GCC_3.0); extern void __libunwind_Unwind_Resume (struct _Unwind_Exception *); -void +void LIBGCC2_UNWIND_ATTRIBUTE _Unwind_Resume (struct _Unwind_Exception *exc) { __libunwind_Unwind_Resume (exc); @@ -185,7 +185,7 @@ symver (_Unwind_Resume, GCC_3.0); extern _Unwind_Reason_Code __libunwind_Unwind_Resume_or_Rethrow (struct _Unwind_Exception *); -_Unwind_Reason_Code +_Unwind_Reason_Code LIBGCC2_UNWIND_ATTRIBUTE _Unwind_Resume_or_Rethrow (struct _Unwind_Exception *exc) { return __libunwind_Unwind_Resume_or_Rethrow (exc); diff --git a/gcc/unwind-generic.h b/gcc/unwind-generic.h index 4d5d14df105..cebd663d954 100644 --- a/gcc/unwind-generic.h +++ b/gcc/unwind-generic.h @@ -108,6 +108,12 @@ typedef int _Unwind_Action; #define _UA_FORCE_UNWIND 8 #define _UA_END_OF_STACK 16 +/* The target can override this macro to define any back-end-specific + attributes required for the lowest-level stack frame. */ +#ifndef LIBGCC2_UNWIND_ATTRIBUTE +#define LIBGCC2_UNWIND_ATTRIBUTE +#endif + /* This is an opaque type used to refer to a system-specific data structure used by the system unwinder. This context is created and destroyed by the system, and passed to the personality routine @@ -115,7 +121,8 @@ typedef int _Unwind_Action; struct _Unwind_Context; /* Raise an exception, passing along the given exception object. */ -extern _Unwind_Reason_Code _Unwind_RaiseException (struct _Unwind_Exception *); +extern _Unwind_Reason_Code LIBGCC2_UNWIND_ATTRIBUTE +_Unwind_RaiseException (struct _Unwind_Exception *); /* Raise an exception for forced unwinding. */ @@ -123,20 +130,21 @@ typedef _Unwind_Reason_Code (*_Unwind_Stop_Fn) (int, _Unwind_Action, _Unwind_Exception_Class, struct _Unwind_Exception *, struct _Unwind_Context *, void *); -extern _Unwind_Reason_Code _Unwind_ForcedUnwind (struct _Unwind_Exception *, - _Unwind_Stop_Fn, - void *); +extern _Unwind_Reason_Code LIBGCC2_UNWIND_ATTRIBUTE +_Unwind_ForcedUnwind (struct _Unwind_Exception *, _Unwind_Stop_Fn, void *); /* Helper to invoke the exception_cleanup routine. */ extern void _Unwind_DeleteException (struct _Unwind_Exception *); /* Resume propagation of an existing exception. This is used after e.g. executing cleanup code, and not to implement rethrowing. */ -extern void _Unwind_Resume (struct _Unwind_Exception *); +extern void LIBGCC2_UNWIND_ATTRIBUTE +_Unwind_Resume (struct _Unwind_Exception *); /* @@@ Resume propagation of an FORCE_UNWIND exception, or to rethrow a normal exception that was handled. */ -extern _Unwind_Reason_Code _Unwind_Resume_or_Rethrow (struct _Unwind_Exception *); +extern _Unwind_Reason_Code LIBGCC2_UNWIND_ATTRIBUTE +_Unwind_Resume_or_Rethrow (struct _Unwind_Exception *); /* @@@ Use unwind data to perform a stack backtrace. The trace callback is called for every stack frame in the call chain, but no cleanup @@ -144,7 +152,8 @@ extern _Unwind_Reason_Code _Unwind_Resume_or_Rethrow (struct _Unwind_Exception * typedef _Unwind_Reason_Code (*_Unwind_Trace_Fn) (struct _Unwind_Context *, void *); -extern _Unwind_Reason_Code _Unwind_Backtrace (_Unwind_Trace_Fn, void *); +extern _Unwind_Reason_Code LIBGCC2_UNWIND_ATTRIBUTE +_Unwind_Backtrace (_Unwind_Trace_Fn, void *); /* These functions are used for communicating information about the unwind context (i.e. the unwind descriptors and the user register state) between @@ -191,12 +200,14 @@ struct SjLj_Function_Context; extern void _Unwind_SjLj_Register (struct SjLj_Function_Context *); extern void _Unwind_SjLj_Unregister (struct SjLj_Function_Context *); -extern _Unwind_Reason_Code _Unwind_SjLj_RaiseException - (struct _Unwind_Exception *); -extern _Unwind_Reason_Code _Unwind_SjLj_ForcedUnwind - (struct _Unwind_Exception *, _Unwind_Stop_Fn, void *); -extern void _Unwind_SjLj_Resume (struct _Unwind_Exception *); -extern _Unwind_Reason_Code _Unwind_SjLj_Resume_or_Rethrow (struct _Unwind_Exception *); +extern _Unwind_Reason_Code LIBGCC2_UNWIND_ATTRIBUTE +_Unwind_SjLj_RaiseException (struct _Unwind_Exception *); +extern _Unwind_Reason_Code LIBGCC2_UNWIND_ATTRIBUTE +_Unwind_SjLj_ForcedUnwind (struct _Unwind_Exception *, _Unwind_Stop_Fn, void *); +extern void LIBGCC2_UNWIND_ATTRIBUTE +_Unwind_SjLj_Resume (struct _Unwind_Exception *); +extern _Unwind_Reason_Code LIBGCC2_UNWIND_ATTRIBUTE +_Unwind_SjLj_Resume_or_Rethrow (struct _Unwind_Exception *); /* @@@ The following provide access to the base addresses for text and data-relative addressing in the LDSA. In order to stay link diff --git a/gcc/unwind.inc b/gcc/unwind.inc index b533eb58873..f905b47f147 100644 --- a/gcc/unwind.inc +++ b/gcc/unwind.inc @@ -82,7 +82,7 @@ _Unwind_RaiseException_Phase2(struct _Unwind_Exception *exc, /* Raise an exception, passing along the given exception object. */ -_Unwind_Reason_Code +_Unwind_Reason_Code LIBGCC2_UNWIND_ATTRIBUTE _Unwind_RaiseException(struct _Unwind_Exception *exc) { struct _Unwind_Context this_context, cur_context; @@ -195,7 +195,7 @@ _Unwind_ForcedUnwind_Phase2 (struct _Unwind_Exception *exc, /* Raise an exception for forced unwinding. */ -_Unwind_Reason_Code +_Unwind_Reason_Code LIBGCC2_UNWIND_ATTRIBUTE _Unwind_ForcedUnwind (struct _Unwind_Exception *exc, _Unwind_Stop_Fn stop, void * stop_argument) { @@ -219,7 +219,7 @@ _Unwind_ForcedUnwind (struct _Unwind_Exception *exc, /* Resume propagation of an existing exception. This is used after e.g. executing cleanup code, and not to implement rethrowing. */ -void +void LIBGCC2_UNWIND_ATTRIBUTE _Unwind_Resume (struct _Unwind_Exception *exc) { struct _Unwind_Context this_context, cur_context; @@ -244,7 +244,7 @@ _Unwind_Resume (struct _Unwind_Exception *exc) /* Resume propagation of an FORCE_UNWIND exception, or to rethrow a normal exception that was handled. */ -_Unwind_Reason_Code +_Unwind_Reason_Code LIBGCC2_UNWIND_ATTRIBUTE _Unwind_Resume_or_Rethrow (struct _Unwind_Exception *exc) { struct _Unwind_Context this_context, cur_context; @@ -278,7 +278,7 @@ _Unwind_DeleteException (struct _Unwind_Exception *exc) /* Perform stack backtrace through unwind data. */ -_Unwind_Reason_Code +_Unwind_Reason_Code LIBGCC2_UNWIND_ATTRIBUTE _Unwind_Backtrace(_Unwind_Trace_Fn trace, void * trace_argument) { struct _Unwind_Context context;