arm: Introduce and use PC_OFS

Scour the source for raw "-8" adjustments that are related to the
offset created by reading the pc.
This commit is contained in:
Richard Henderson 2013-02-12 17:15:52 -08:00
parent 63cc0e75ea
commit 783a65c253
11 changed files with 41 additions and 20 deletions

View File

@ -11,6 +11,21 @@
* ports/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h: Likewise. * ports/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h: Likewise.
* sysdeps/unix/sysv/linux/arm/sysdep.h: Likewise. * sysdeps/unix/sysv/linux/arm/sysdep.h: Likewise.
* sysdeps/arm/sysdep.h (PC_OFS): New macros.
* sysdeps/arm/__longjmp.S (__longjmp): Use PC_OFS.
* sysdeps/arm/setjmp.S (__sigsetjmp): Likewise.
* sysdeps/unix/arm/sysdep.S (__syscall_error): Likewise.
* sysdeps/unix/sysv/linux/arm/getcontext.S (__getcontext): Likewise.
* sysdeps/unix/sysv/linux/arm/setcontext.S (__startcontext): Likewise.
* sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h
(SINGLE_THREAD_P): Likewise.
* sysdeps/unix/sysv/linux/arm/sysdep.h
(SYSCALL_ERROR_HANDLER): Likewise.
* sysdeps/unix/sysv/linux/arm/nptl/unwind-forcedunwind.c
(_Unwind_Resume): Use stringified PC_OFS.
* sysdeps/unix/sysv/linux/arm/nptl/unwind-resume.c
(_Unwind_Resume): Likewise.
2013-02-27 Roland McGrath <roland@hack.frob.com> 2013-02-27 Roland McGrath <roland@hack.frob.com>
* sysdeps/arm/sysdep.h (CFI_SECTIONS): New macro. * sysdeps/arm/sysdep.h (CFI_SECTIONS): New macro.

View File

@ -105,12 +105,12 @@ ENTRY (__longjmp)
#ifdef NEED_HWCAP #ifdef NEED_HWCAP
# ifdef IS_IN_rtld # ifdef IS_IN_rtld
1: .long _GLOBAL_OFFSET_TABLE_ - 0b - 8 1: .long _GLOBAL_OFFSET_TABLE_ - 0b - PC_OFS
.Lrtld_local_ro: .Lrtld_local_ro:
.long C_SYMBOL_NAME(_rtld_local_ro)(GOTOFF) .long C_SYMBOL_NAME(_rtld_local_ro)(GOTOFF)
# else # else
# ifdef PIC # ifdef PIC
1: .long _GLOBAL_OFFSET_TABLE_ - 0b - 8 1: .long _GLOBAL_OFFSET_TABLE_ - 0b - PC_OFS
.Lrtld_global_ro: .Lrtld_global_ro:
.long C_SYMBOL_NAME(_rtld_global_ro)(GOT) .long C_SYMBOL_NAME(_rtld_global_ro)(GOT)
# else # else

View File

@ -91,12 +91,12 @@ ENTRY (__sigsetjmp)
#ifdef NEED_HWCAP #ifdef NEED_HWCAP
# ifdef IS_IN_rtld # ifdef IS_IN_rtld
1: .long _GLOBAL_OFFSET_TABLE_ - 0b - 8 1: .long _GLOBAL_OFFSET_TABLE_ - 0b - PC_OFS
.Lrtld_local_ro: .Lrtld_local_ro:
.long C_SYMBOL_NAME(_rtld_local_ro)(GOTOFF) .long C_SYMBOL_NAME(_rtld_local_ro)(GOTOFF)
# else # else
# ifdef PIC # ifdef PIC
1: .long _GLOBAL_OFFSET_TABLE_ - 0b - 8 1: .long _GLOBAL_OFFSET_TABLE_ - 0b - PC_OFS
.Lrtld_global_ro: .Lrtld_global_ro:
.long C_SYMBOL_NAME(_rtld_global_ro)(GOT) .long C_SYMBOL_NAME(_rtld_global_ro)(GOT)
# else # else

View File

@ -118,3 +118,11 @@
.eabi_attribute 24, 1 .eabi_attribute 24, 1
#endif /* __ASSEMBLER__ */ #endif /* __ASSEMBLER__ */
/* This number is the offset from the pc at the current location. */
/* ??? At the moment we're not turning on thumb mode in assembly. */
#if defined(__thumb__) && !defined(__ASSEMBLER__)
# define PC_OFS 4
#else
# define PC_OFS 8
#endif

View File

@ -50,14 +50,14 @@ __syscall_error:
mvn r0, #0 mvn r0, #0
RETINSTR (, ip) RETINSTR (, ip)
1: .word errno(gottpoff) + (. - 2b - 8) 1: .word errno(gottpoff) + (. - 2b - PC_OFS)
#elif RTLD_PRIVATE_ERRNO #elif RTLD_PRIVATE_ERRNO
ldr r1, 1f ldr r1, 1f
0: str r0, [pc, r1] 0: str r0, [pc, r1]
mvn r0, $0 mvn r0, $0
DO_RET(r14) DO_RET(r14)
1: .word C_SYMBOL_NAME(rtld_errno) - 0b - 8 1: .word C_SYMBOL_NAME(rtld_errno) - 0b - PC_OFS
#else #else
#error "Unsupported non-TLS case" #error "Unsupported non-TLS case"
#endif #endif

View File

@ -103,7 +103,7 @@ ENTRY(__getcontext)
END(__getcontext) END(__getcontext)
#ifdef PIC #ifdef PIC
1: .long _GLOBAL_OFFSET_TABLE_ - 0b - 8 1: .long _GLOBAL_OFFSET_TABLE_ - 0b - PC_OFS
.Lrtld_global_ro: .Lrtld_global_ro:
.long C_SYMBOL_NAME(_rtld_global_ro)(GOT) .long C_SYMBOL_NAME(_rtld_global_ro)(GOT)
#else #else

View File

@ -208,7 +208,7 @@ extern int __local_multiple_threads attribute_hidden;
ldr ip, [pc, ip]; \ ldr ip, [pc, ip]; \
teq ip, #0; teq ip, #0;
# define PSEUDO_PROLOGUE \ # define PSEUDO_PROLOGUE \
1: .word __local_multiple_threads - 2f - 8; 1: .word __local_multiple_threads - 2f - PC_OFS;
# endif # endif
# else # else
/* There is no __local_multiple_threads for librt, so use the TCB. */ /* There is no __local_multiple_threads for librt, so use the TCB. */

View File

@ -84,6 +84,9 @@ __unwind_freeres (void)
ARM unwinder relies on register state at entrance. So we write this in ARM unwinder relies on register state at entrance. So we write this in
assembly. */ assembly. */
#define STR1(S) #S
#define STR(S) STR1(S)
asm ( asm (
" .globl _Unwind_Resume\n" " .globl _Unwind_Resume\n"
" .type _Unwind_Resume, %function\n" " .type _Unwind_Resume, %function\n"
@ -118,11 +121,7 @@ asm (
" b 5b\n" " b 5b\n"
" " CFI_ENDPROC "\n" " " CFI_ENDPROC "\n"
" .align 2\n" " .align 2\n"
#ifdef __thumb2__ "1: .word _GLOBAL_OFFSET_TABLE_ - 3b - " STR (PC_OFS) "\n"
"1: .word _GLOBAL_OFFSET_TABLE_ - 3b - 4\n"
#else
"1: .word _GLOBAL_OFFSET_TABLE_ - 3b - 8\n"
#endif
"2: .word libgcc_s_resume(GOTOFF)\n" "2: .word libgcc_s_resume(GOTOFF)\n"
" .size _Unwind_Resume, .-_Unwind_Resume\n" " .size _Unwind_Resume, .-_Unwind_Resume\n"
); );

View File

@ -47,6 +47,9 @@ init (void)
ARM unwinder relies on register state at entrance. So we write this in ARM unwinder relies on register state at entrance. So we write this in
assembly. */ assembly. */
#define STR1(S) #S
#define STR(S) STR1(S)
asm ( asm (
" .globl _Unwind_Resume\n" " .globl _Unwind_Resume\n"
" .type _Unwind_Resume, %function\n" " .type _Unwind_Resume, %function\n"
@ -81,11 +84,7 @@ asm (
" b 5b\n" " b 5b\n"
" " CFI_ENDPROC "\n" " " CFI_ENDPROC "\n"
" .align 2\n" " .align 2\n"
#ifdef __thumb2__ "1: .word _GLOBAL_OFFSET_TABLE_ - 3b - " STR (PC_OFS) "\n"
"1: .word _GLOBAL_OFFSET_TABLE_ - 3b - 4\n"
#else
"1: .word _GLOBAL_OFFSET_TABLE_ - 3b - 8\n"
#endif
"2: .word libgcc_s_resume(GOTOFF)\n" "2: .word libgcc_s_resume(GOTOFF)\n"
" .size _Unwind_Resume, .-_Unwind_Resume\n" " .size _Unwind_Resume, .-_Unwind_Resume\n"
); );

View File

@ -93,7 +93,7 @@ ENTRY(__startcontext)
END(__startcontext) END(__startcontext)
#ifdef PIC #ifdef PIC
1: .long _GLOBAL_OFFSET_TABLE_ - 0b - 8 1: .long _GLOBAL_OFFSET_TABLE_ - 0b - PC_OFS
.Lrtld_global_ro: .Lrtld_global_ro:
.long C_SYMBOL_NAME(_rtld_global_ro)(GOT) .long C_SYMBOL_NAME(_rtld_global_ro)(GOT)
#else #else

View File

@ -114,7 +114,7 @@ __local_syscall_error: \
0: str r0, [pc, r1]; \ 0: str r0, [pc, r1]; \
mvn r0, #0; \ mvn r0, #0; \
DO_RET(lr); \ DO_RET(lr); \
1: .word C_SYMBOL_NAME(rtld_errno) - 0b - 8; 1: .word C_SYMBOL_NAME(rtld_errno) - 0b - PC_OFS;
# else # else
# if defined(__ARM_ARCH_4T__) && defined(__THUMB_INTERWORK__) # if defined(__ARM_ARCH_4T__) && defined(__THUMB_INTERWORK__)
# define POP_PC \ # define POP_PC \