exception.c (parse_lsda_header): hardcode ttype_encoding for older ARM EABI toolchains.
authorPaul Brook <paul@codesourcery.com>
Thu, 20 Oct 2011 13:57:21 +0000 (13:57 +0000)
committerMatthias Klose <doko@gcc.gnu.org>
Thu, 20 Oct 2011 13:57:21 +0000 (13:57 +0000)
2011-10-17  Paul Brook  <paul@codesourcery.com>
            Matthias Klose  <doko@ubuntu.com>

        * exception.c (parse_lsda_header): hardcode ttype_encoding for older
        ARM EABI toolchains.
        (get_ttype_entry) Remove __ARM_EABI_UNWINDER__ variant.

Co-Authored-By: Matthias Klose <doko@ubuntu.com>
From-SVN: r180255

libobjc/ChangeLog
libobjc/exception.c

index dbc70f190bb028bdbe81e77688c4316d7380f9d9..86e8c139194ba3b9e895ac8c2ebb89af84430357 100644 (file)
@@ -1,3 +1,10 @@
+2011-10-17  Paul Brook  <paul@codesourcery.com>
+           Matthias Klose  <doko@ubuntu.com>
+
+       * exception.c (parse_lsda_header): hardcode ttype_encoding for older
+       ARM EABI toolchains.
+       (get_ttype_entry) Remove __ARM_EABI_UNWINDER__ variant.
+
 2011-10-09  Nicola Pero  <nicola.pero@meta-innovation.com>
 
        PR libobjc/49883
index 37daed8f30c26b690127664c4cb3cb7074dc4db2..04308ce13e7d9319abdc19de6f70439cf3e8c273 100644 (file)
@@ -159,6 +159,11 @@ parse_lsda_header (struct _Unwind_Context *context, const unsigned char *p,
   info->ttype_encoding = *p++;
   if (info->ttype_encoding != DW_EH_PE_omit)
     {
+#if _GLIBCXX_OVERRIDE_TTYPE_ENCODING
+      /* Older ARM EABI toolchains set this value incorrectly, so use a
+        hardcoded OS-specific format.  */
+      info->ttype_encoding = _GLIBCXX_OVERRIDE_TTYPE_ENCODING;
+#endif
       p = read_uleb128 (p, &tmp);
       info->TType = p + tmp;
     }
@@ -174,26 +179,6 @@ parse_lsda_header (struct _Unwind_Context *context, const unsigned char *p,
   return p;
 }
 
-#ifdef __ARM_EABI_UNWINDER__
-
-static Class
-get_ttype_entry (struct lsda_header_info *info, _uleb128_t i)
-{
-  _Unwind_Ptr ptr;
-  
-  ptr = (_Unwind_Ptr) (info->TType - (i * 4));
-  ptr = _Unwind_decode_target2 (ptr);
-
-  /* NULL ptr means catch-all.  Note that if the class is not found,
-     this will abort the program.  */
-  if (ptr)
-    return objc_getRequiredClass ((const char *) ptr);
-  else
-    return 0;
-}
-
-#else
-
 static Class
 get_ttype_entry (struct lsda_header_info *info, _Unwind_Word i)
 {
@@ -211,8 +196,6 @@ get_ttype_entry (struct lsda_header_info *info, _Unwind_Word i)
     return 0;
 }
 
-#endif
-
 /* Using a different personality function name causes link failures
    when trying to mix code using different exception handling
    models.  */