Skip to content

Commit 51464ea

Browse files
fix up setjmp for thumb1
1 parent 96d8f14 commit 51464ea

File tree

1 file changed

+30
-0
lines changed

1 file changed

+30
-0
lines changed

libc/src/setjmp/arm/setjmp.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,34 @@
1111

1212
namespace LIBC_NAMESPACE {
1313

14+
#if defined(__thumb__) && __ARM_ARCH_ISA_THUMB == 1
15+
16+
[[gnu::naked]]
17+
LLVM_LIBC_FUNCTION(int, setjmp, (__jmp_buf * buf)) {
18+
asm(R"(
19+
# Store r4, r5, r6, and r7 into buf.
20+
stmia r0!, {r4-r7}
21+
22+
# Store r8, r9, r10, and r11 into buf. Thumb(1) doesn't support the high
23+
# registers > r7 in stmia, so move them into lower GPRs first.
24+
mov r4, r8
25+
mov r5, r9
26+
mov r6, r10
27+
mov r7, r11
28+
stmia r0!, {r4-r7}
29+
30+
# Store sp into buf. Thumb(1) doesn't support sp in str, move to GPR
31+
# first.
32+
mov r4, sp
33+
str r4, [r0]
34+
35+
# Return 0.
36+
movs r0, #0
37+
bx lr)");
38+
}
39+
40+
#else // Thumb2 or ARM
41+
1442
[[gnu::naked]]
1543
LLVM_LIBC_FUNCTION(int, setjmp, (__jmp_buf * buf)) {
1644
asm(R"(
@@ -20,4 +48,6 @@ LLVM_LIBC_FUNCTION(int, setjmp, (__jmp_buf * buf)) {
2048
bx lr)");
2149
}
2250

51+
#endif
52+
2353
} // namespace LIBC_NAMESPACE

0 commit comments

Comments
 (0)