# undef PSEUDO_RET
# define PSEUDO_RET \
ldrcc pc, [sp], $4; \
+ ldr lr, [sp], $4; \
b PLTJMP(SYSCALL_ERROR)
# undef PSEUDO
.section ".text"; \
PSEUDO_PROLOGUE; \
ENTRY (name) \
- SINGLE_THREAD_P; \
+ SINGLE_THREAD_P_INT; \
bne .Lpseudo_cancel; \
DO_CALL (syscall_name, args); \
cmn r0, $4096; \
# define UNDOC2ARGS_4
# define DOCARGS_5 stmfd sp!, {r0-r3}
-# define UNDOCARGS_5 str r4, [sp, #-4]!; ldmfd sp, {r0-r4}
+# define UNDOCARGS_5 ldmfd sp, {r0-r3}; str r4, [sp, #-4]!; ldr r4, [sp, #24]
# define UNDOC2ARGS_5 ldr r4, [sp], #20
# ifdef IS_IN_libpthread
# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
# else
# if !defined PIC
-# define SINGLE_THREAD_P \
+# define SINGLE_THREAD_P_INT \
ldr ip, =__local_multiple_threads; \
ldr ip, [ip]; \
teq ip, #0;
+# define SINGLE_THREAD_P SINGLE_THREAD_P_INT
# define MAYBE_SAVE_LR \
str lr, [sp, $-4]!;
# define PSEUDO_RET_MOV \
b PLTJMP(SYSCALL_ERROR)
# define PSEUDO_PROLOGUE
# else
-# define SINGLE_THREAD_P \
- str lr, [sp, $-4]!; \
+# define SINGLE_THREAD_P_PIC(reg) \
ldr ip, 1b; \
- ldr lr, 2b; \
+ ldr reg, 2b; \
3: \
add ip, pc, ip; \
ldr ip, [ip, lr]; \
teq ip, #0;
+# define SINGLE_THREAD_P_INT \
+ str lr, [sp, $-4]!; \
+ SINGLE_THREAD_P_PIC(lr)
+# define SINGLE_THREAD_P \
+ SINGLE_THREAD_P_INT; \
+ ldr lr, [sp], $4
# define PSEUDO_PROLOGUE \
1: .word _GLOBAL_OFFSET_TABLE_ - 3f - 8; \
2: .word __local_multiple_threads(GOTOFF);