[git commit master 1/1] arm/nptl: Use the old C version of _Unwind_Resume in thumb mode.

Khem Raj raj.khem at gmail.com
Tue Jun 29 14:57:23 UTC 2010


commit: http://git.uclibc.org/uClibc/commit/?id=38830bf257298bec1291ef4d09ebcc1dbf92eae0
branch: http://git.uclibc.org/uClibc/commit/?id=refs/heads/master

Signed-off-by: Khem Raj <raj.khem at gmail.com>
---
 .../unix/sysv/linux/arm/unwind-forcedunwind.c      |   13 +++++++++++++
 .../sysdeps/unix/sysv/linux/arm/unwind-resume.c    |   11 ++++++++++-
 2 files changed, 23 insertions(+), 1 deletions(-)

diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/arm/unwind-forcedunwind.c b/libpthread/nptl/sysdeps/unix/sysv/linux/arm/unwind-forcedunwind.c
index 7e77f18..88e1205 100644
--- a/libpthread/nptl/sysdeps/unix/sysv/linux/arm/unwind-forcedunwind.c
+++ b/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,
diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/arm/unwind-resume.c b/libpthread/nptl/sysdeps/unix/sysv/linux/arm/unwind-resume.c
index a1366f3..e35374d 100644
--- a/libpthread/nptl/sysdeps/unix/sysv/linux/arm/unwind-resume.c
+++ b/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,
-- 
1.7.1



More information about the uClibc-cvs mailing list