* libsupc++/eh_arm.cc (__cxa_type_match): Handle foreign
authorrearnsha <rearnsha@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 13 Jun 2007 19:31:58 +0000 (19:31 +0000)
committerrearnsha <rearnsha@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 13 Jun 2007 19:31:58 +0000 (19:31 +0000)
exceptions.
* libsubpc++/eh_personality.cc: Don't try to set up foreign or
forced unwind types here when using the ARM EABI unwinder.

git-svn-id: svn://gcc.gnu.org/svn/gcc/trunk@125683 138bc75d-0d04-0410-961f-82ee72b054a4

libstdc++-v3/ChangeLog
libstdc++-v3/libsupc++/eh_arm.cc
libstdc++-v3/libsupc++/eh_personality.cc

index ec10c58..2e4bdd7 100644 (file)
@@ -1,3 +1,10 @@
+2007-06-13  Richard Earnshaw  <rearnsha@arm.com>
+
+       * libsupc++/eh_arm.cc (__cxa_type_match): Handle foreign
+       exceptions.
+       * libsubpc++/eh_personality.cc: Don't try to set up foreign or
+       forced unwind types here when using the ARM EABI unwinder.
+
 2007-06-13  Paolo Carlini  <pcarlini@suse.de>
 
        * include/c_global/cmath: Tweak includes.
 2007-06-13  Paolo Carlini  <pcarlini@suse.de>
 
        * include/c_global/cmath: Tweak includes.
index 87fccba..e1e4851 100644 (file)
@@ -46,11 +46,16 @@ __cxa_type_match(_Unwind_Exception* ue_header,
                 bool is_reference __attribute__((__unused__)),
                 void** thrown_ptr_p)
 {
                 bool is_reference __attribute__((__unused__)),
                 void** thrown_ptr_p)
 {
-  if (!__is_gxx_exception_class(ue_header->exception_class))
-    return ctm_failed;
-
+  bool foreign_exception = !__is_gxx_exception_class(ue_header->exception_class);
   __cxa_exception* xh = __get_exception_header_from_ue(ue_header);
   __cxa_exception* xh = __get_exception_header_from_ue(ue_header);
-  const std::type_info* throw_type = xh->exceptionType;
+  const std::type_info* throw_type;
+
+  // XXX What to do with forced unwind?
+  if (foreign_exception)
+    throw_type = &typeid(abi::__foreign_exception);
+  else
+    throw_type = xh->exceptionType;
+
   void* thrown_ptr = *thrown_ptr_p;
 
   // Pointer types need to adjust the actual pointer, not
   void* thrown_ptr = *thrown_ptr_p;
 
   // Pointer types need to adjust the actual pointer, not
index bbcc007..f1cda0c 100644 (file)
@@ -542,6 +542,12 @@ PERSONALITY_FUNCTION (int version,
       bool saw_cleanup = false;
       bool saw_handler = false;
 
       bool saw_cleanup = false;
       bool saw_handler = false;
 
+#ifdef __ARM_EABI_UNWINDER__
+      throw_type = ue_header;
+      if ((actions & _UA_FORCE_UNWIND)
+         || foreign_exception)
+       thrown_ptr = 0;
+#else
       // During forced unwinding, match a magic exception type.
       if (actions & _UA_FORCE_UNWIND)
        {
       // During forced unwinding, match a magic exception type.
       if (actions & _UA_FORCE_UNWIND)
        {
@@ -556,9 +562,6 @@ PERSONALITY_FUNCTION (int version,
          thrown_ptr = 0;
        }
       else
          thrown_ptr = 0;
        }
       else
-#ifdef __ARM_EABI_UNWINDER__
-       throw_type = ue_header;
-#else
        throw_type = xh->exceptionType;
 #endif
 
        throw_type = xh->exceptionType;
 #endif