diff options
Diffstat (limited to 'libstdc++-v3')
-rw-r--r-- | libstdc++-v3/ChangeLog | 4 | ||||
-rw-r--r-- | libstdc++-v3/configure.host | 3 | ||||
-rw-r--r-- | libstdc++-v3/libsupc++/unwind-cxx.h | 37 |
3 files changed, 36 insertions, 8 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 50c74af9a5d..c6184fda434 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,7 @@ +2015-01-09 Andreas Tobler <andreast@gcc.gnu.org> + + * configure.host: Add arm*-*-freebsd* port_specific_symbol_files. + 2015-01-09 Tim Shen <timshen@google.com> PR libstdc++/64239 diff --git a/libstdc++-v3/configure.host b/libstdc++-v3/configure.host index 6f7b09d51e9..82ddc524092 100644 --- a/libstdc++-v3/configure.host +++ b/libstdc++-v3/configure.host @@ -366,6 +366,9 @@ case "${host}" in ;; esac ;; + arm*-*-freebsd*) + port_specific_symbol_files="\$(srcdir)/../config/os/gnu-linux/arm-eabi-extra.ver" + ;; powerpc*-*-darwin*) port_specific_symbol_files="\$(srcdir)/../config/os/bsd/darwin/ppc-extra.ver" ;; diff --git a/libstdc++-v3/libsupc++/unwind-cxx.h b/libstdc++-v3/libsupc++/unwind-cxx.h index e6015964390..70f14b4d1b5 100644 --- a/libstdc++-v3/libsupc++/unwind-cxx.h +++ b/libstdc++-v3/libsupc++/unwind-cxx.h @@ -235,7 +235,7 @@ __get_dependent_exception_from_ue (_Unwind_Exception *exc) return reinterpret_cast<__cxa_dependent_exception *>(exc + 1) - 1; } -#ifdef __ARM_EABI_UNWINDER__ +#if defined (__ARM_EABI_UNWINDER__) && !defined (__FreeBSD__) static inline bool __is_gxx_exception_class(_Unwind_Exception_Class c) { @@ -309,13 +309,7 @@ __GXX_INIT_FORCED_UNWIND_CLASS(_Unwind_Exception_Class c) c[6] = 'R'; c[7] = '\0'; } - -static inline void* -__gxx_caught_object(_Unwind_Exception* eo) -{ - return (void*)eo->barrier_cache.bitpattern[0]; -} -#else // !__ARM_EABI_UNWINDER__ +#else // !__ARM_EABI_UNWINDER__ || __FreeBSD__ // This is the primary exception class we report -- "GNUCC++\0". const _Unwind_Exception_Class __gxx_primary_exception_class = ((((((((_Unwind_Exception_Class) 'G' @@ -339,6 +333,16 @@ const _Unwind_Exception_Class __gxx_dependent_exception_class << 8 | (_Unwind_Exception_Class) '+') << 8 | (_Unwind_Exception_Class) '\x01'); +const _Unwind_Exception_Class __gxx_forced_unwind_class += ((((((((_Unwind_Exception_Class) 'G' + << 8 | (_Unwind_Exception_Class) 'N') + << 8 | (_Unwind_Exception_Class) 'U') + << 8 | (_Unwind_Exception_Class) 'C') + << 8 | (_Unwind_Exception_Class) 'F') + << 8 | (_Unwind_Exception_Class) 'O') + << 8 | (_Unwind_Exception_Class) 'R') + << 8 | (_Unwind_Exception_Class) '\0'); + static inline bool __is_gxx_exception_class(_Unwind_Exception_Class c) { @@ -346,6 +350,12 @@ __is_gxx_exception_class(_Unwind_Exception_Class c) || c == __gxx_dependent_exception_class; } +static inline bool +__is_gxx_forced_unwind_class(_Unwind_Exception_Class c) +{ + return c == __gxx_forced_unwind_class; +} + // Only checks for primary or dependent, but not that it is a C++ exception at // all. static inline bool @@ -357,6 +367,17 @@ __is_dependent_exception(_Unwind_Exception_Class c) #define __GXX_INIT_PRIMARY_EXCEPTION_CLASS(c) c = __gxx_primary_exception_class #define __GXX_INIT_DEPENDENT_EXCEPTION_CLASS(c) \ c = __gxx_dependent_exception_class +#define __GXX_INIT_FORCED_UNWIND_CLASS(c) c = __gxx_forced_unwind_class +#endif // __ARM_EABI_UNWINDER__ && !__FreeBSD__ + +#ifdef __ARM_EABI_UNWINDER__ +static inline void* +__gxx_caught_object(_Unwind_Exception* eo) +{ + return (void*)eo->barrier_cache.bitpattern[0]; +} + +#else // !__ARM_EABI_UNWINDER__ // GNU C++ personality routine, Version 0. extern "C" _Unwind_Reason_Code __gxx_personality_v0 |