Changeset View
Changeset View
Standalone View
Standalone View
lang/gcc13/files/patch-arm-unwind-cxx-support
- This file was added.
--- UTC | |||||
Index: gcc/ginclude/unwind-arm-common.h | |||||
=================================================================== | |||||
--- gcc/ginclude/unwind-arm-common.h (revision 219113) | |||||
+++ gcc/ginclude/unwind-arm-common.h (working copy) | |||||
@@ -82,7 +82,11 @@ | |||||
struct _Unwind_Control_Block | |||||
{ | |||||
+#ifdef __FreeBSD__ | |||||
+ unsigned exception_class __attribute__((__mode__(__DI__))); | |||||
+#else | |||||
char exception_class[8]; | |||||
+#endif | |||||
void (*exception_cleanup)(_Unwind_Reason_Code, _Unwind_Control_Block *); | |||||
/* Unwinder cache, private fields for the unwinder's use */ | |||||
struct | |||||
@@ -181,7 +185,11 @@ | |||||
/* Support functions for the PR. */ | |||||
#define _Unwind_Exception _Unwind_Control_Block | |||||
+#ifdef __FreeBSD__ | |||||
+ typedef unsigned _Unwind_Exception_Class __attribute__((__mode__(__DI__))); | |||||
+#else | |||||
typedef char _Unwind_Exception_Class[8]; | |||||
+#endif | |||||
void * _Unwind_GetLanguageSpecificData (_Unwind_Context *); | |||||
_Unwind_Ptr _Unwind_GetRegionStart (_Unwind_Context *); | |||||
Index: libstdc++-v3/libsupc++/unwind-cxx.h | |||||
=================================================================== | |||||
--- libstdc++-v3/libsupc++/unwind-cxx.h (revision 219147) | |||||
+++ libstdc++-v3/libsupc++/unwind-cxx.h (working copy) | |||||
@@ -235,7 +235,7 @@ | |||||
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 @@ | |||||
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 @@ | |||||
<< 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 @@ | |||||
|| 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,7 +367,18 @@ | |||||
#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 | |||||
(int, _Unwind_Action, _Unwind_Exception_Class, |