summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/arm/bsd-setjmp.S
diff options
context:
space:
mode:
Diffstat (limited to 'libc/sysdeps/linux/arm/bsd-setjmp.S')
-rw-r--r--libc/sysdeps/linux/arm/bsd-setjmp.S26
1 files changed, 26 insertions, 0 deletions
diff --git a/libc/sysdeps/linux/arm/bsd-setjmp.S b/libc/sysdeps/linux/arm/bsd-setjmp.S
index 6253c6675..d7ca72ad5 100644
--- a/libc/sysdeps/linux/arm/bsd-setjmp.S
+++ b/libc/sysdeps/linux/arm/bsd-setjmp.S
@@ -17,6 +17,8 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
+#include <bits/arm_asm.h>
+
/* This just does a tail-call to `__sigsetjmp (ARG, 1)'.
We cannot do it in C because it must be a tail-call, so frame-unwinding
in setjmp doesn't clobber the state restored by longjmp. */
@@ -24,6 +26,29 @@
.global setjmp
.type setjmp,%function
.align 2
+#if defined(THUMB1_ONLY)
+.thumb_func
+setjmp:
+ mov r1, #1
+#ifdef __PIC__
+ ldr r3, .L_GOT
+ adr r2, .L_GOT
+ add r3, r2, r3
+
+ ldr r2, .L_GOT+4 /* __sigsetjmp */
+ ldr r2, [r2, r3]
+ bx r2
+
+ .align 2
+.L_GOT:
+ .word _GLOBAL_OFFSET_TABLE_-.L_GOT
+ .word __sigsetjmp(GOT)
+#else
+ ldr r2, =__sigsetjmp
+ bx r2
+.pool
+#endif
+#else
setjmp:
mov r1, #1
#ifdef __PIC__
@@ -31,5 +56,6 @@ setjmp:
#else
b __sigsetjmp
#endif
+#endif
.size setjmp,.-setjmp