Browse Source

arm/nptl: Use the old C version of _Unwind_Resume in thumb mode.

Signed-off-by: Khem Raj <raj.khem@gmail.com>
Khem Raj 15 years ago
parent
commit
38830bf257

+ 13 - 0
libpthread/nptl/sysdeps/unix/sysv/linux/arm/unwind-forcedunwind.c

@@ -86,6 +86,17 @@ __unwind_freeres (void)
     }
 }
 
+#ifdef __thumb__
+void
+_Unwind_Resume (struct _Unwind_Exception *exc)
+{
+  if (__builtin_expect (libgcc_s_resume == NULL, 0))
+    pthread_cancel_init ();
+
+  libgcc_s_resume (exc);
+}
+
+#else
 /* It's vitally important that _Unwind_Resume not have a stack frame; the
    ARM unwinder relies on register state at entrance.  So we write this in
    assembly.  */
@@ -133,6 +144,8 @@ __asm__ (
 "	.size	_Unwind_Resume, .-_Unwind_Resume\n"
 );
 
+#endif
+
 _Unwind_Reason_Code
 __gcc_personality_v0 (_Unwind_State state,
 		      struct _Unwind_Exception *ue_header,

+ 10 - 1
libpthread/nptl/sysdeps/unix/sysv/linux/arm/unwind-resume.c

@@ -48,7 +48,15 @@ init (void)
   libgcc_s_resume = resume;
   libgcc_s_personality = personality;
 }
-
+#ifdef __thumb__
+void
+_Unwind_Resume (struct _Unwind_Exception *exc)
+{
+  if (__builtin_expect (libgcc_s_resume == NULL, 0))
+    init ();
+  libgcc_s_resume (exc);
+}
+#else
 /* It's vitally important that _Unwind_Resume not have a stack frame; the
    ARM unwinder relies on register state at entrance.  So we write this in
    assembly.  */
@@ -95,6 +103,7 @@ __asm__ (
 "2:	.word	libgcc_s_resume(GOTOFF)\n"
 "	.size	_Unwind_Resume, .-_Unwind_Resume\n"
 );
+#endif
 
 _Unwind_Reason_Code
 __gcc_personality_v0 (_Unwind_State state,