runtime: on ARM32 EABI, don't get LSDA if compact model is used
authorIan Lance Taylor <ian@gcc.gnu.org>
Thu, 27 Dec 2018 03:13:11 +0000 (03:13 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Thu, 27 Dec 2018 03:13:11 +0000 (03:13 +0000)
    On ARM32 EABI, when the "compact" unwinding model is used, it
    does not have standard LSDA and _Unwind_GetLanguageSpecificData
    will not return data that is parseable by us. Check this
    conditon before calling _Unwind_GetLanguageSpecificData.

    Fix ARM32 build.

    Reviewed-on: https://go-review.googlesource.com/c/155758

From-SVN: r267428

gcc/go/gofrontend/MERGE
libgo/runtime/go-unwind.c

index 8b1ca48..2bcf536 100644 (file)
@@ -1,4 +1,4 @@
-16a48dbc1c69075321b388d235651b59abcb58ce
+785414705628bf9d1279a8042e1886440424aade
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index f4bbfb6..388d7c7 100644 (file)
@@ -646,6 +646,17 @@ findstackmaps (struct _Unwind_Context *context, _Unwind_Ptr *ip, _Unwind_Ptr *sp
   _sleb128_t index;
   int size;
 
+#ifdef __ARM_EABI_UNWINDER__
+  {
+    _Unwind_Control_Block *ucbp;
+    ucbp = (_Unwind_Control_Block *) _Unwind_GetGR (context, 12);
+    if (*ucbp->pr_cache.ehtp & (1u << 31))
+      // The "compact" model is used, with one of the predefined
+      // personality functions. It doesn't have standard LSDA.
+      return NOTFOUND_OK;
+  }
+#endif
+
   language_specific_data = (const unsigned char *)
     _Unwind_GetLanguageSpecificData (context);