diff options
author | Richard Henderson <rth@twiddle.net> | 2013-02-12 17:15:52 -0800 |
---|---|---|
committer | Richard Henderson <rth@twiddle.net> | 2013-02-28 00:16:05 -0800 |
commit | 783a65c253b144cd7b500720cf37bbddaf861a03 (patch) | |
tree | 09e6655f98d7e27b1ec35a7ce5140f3ee907a6ad | |
parent | 63cc0e75eadde85676bdde0fe8c90b540c200465 (diff) | |
download | glibc-783a65c253b144cd7b500720cf37bbddaf861a03.tar glibc-783a65c253b144cd7b500720cf37bbddaf861a03.tar.gz glibc-783a65c253b144cd7b500720cf37bbddaf861a03.tar.bz2 glibc-783a65c253b144cd7b500720cf37bbddaf861a03.zip |
arm: Introduce and use PC_OFS
Scour the source for raw "-8" adjustments that are related to the
offset created by reading the pc.
-rw-r--r-- | ports/ChangeLog.arm | 15 | ||||
-rw-r--r-- | ports/sysdeps/arm/__longjmp.S | 4 | ||||
-rw-r--r-- | ports/sysdeps/arm/setjmp.S | 4 | ||||
-rw-r--r-- | ports/sysdeps/arm/sysdep.h | 8 | ||||
-rw-r--r-- | ports/sysdeps/unix/arm/sysdep.S | 4 | ||||
-rw-r--r-- | ports/sysdeps/unix/sysv/linux/arm/getcontext.S | 2 | ||||
-rw-r--r-- | ports/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h | 2 | ||||
-rw-r--r-- | ports/sysdeps/unix/sysv/linux/arm/nptl/unwind-forcedunwind.c | 9 | ||||
-rw-r--r-- | ports/sysdeps/unix/sysv/linux/arm/nptl/unwind-resume.c | 9 | ||||
-rw-r--r-- | ports/sysdeps/unix/sysv/linux/arm/setcontext.S | 2 | ||||
-rw-r--r-- | ports/sysdeps/unix/sysv/linux/arm/sysdep.h | 2 |
11 files changed, 41 insertions, 20 deletions
diff --git a/ports/ChangeLog.arm b/ports/ChangeLog.arm index da15413924..fe0fd46803 100644 --- a/ports/ChangeLog.arm +++ b/ports/ChangeLog.arm @@ -11,6 +11,21 @@ * ports/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.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> * sysdeps/arm/sysdep.h (CFI_SECTIONS): New macro. diff --git a/ports/sysdeps/arm/__longjmp.S b/ports/sysdeps/arm/__longjmp.S index 5c04f36457..3d6e114c88 100644 --- a/ports/sysdeps/arm/__longjmp.S +++ b/ports/sysdeps/arm/__longjmp.S @@ -105,12 +105,12 @@ ENTRY (__longjmp) #ifdef NEED_HWCAP # ifdef IS_IN_rtld -1: .long _GLOBAL_OFFSET_TABLE_ - 0b - 8 +1: .long _GLOBAL_OFFSET_TABLE_ - 0b - PC_OFS .Lrtld_local_ro: .long C_SYMBOL_NAME(_rtld_local_ro)(GOTOFF) # else # ifdef PIC -1: .long _GLOBAL_OFFSET_TABLE_ - 0b - 8 +1: .long _GLOBAL_OFFSET_TABLE_ - 0b - PC_OFS .Lrtld_global_ro: .long C_SYMBOL_NAME(_rtld_global_ro)(GOT) # else diff --git a/ports/sysdeps/arm/setjmp.S b/ports/sysdeps/arm/setjmp.S index 4b7542ad35..baa02be39d 100644 --- a/ports/sysdeps/arm/setjmp.S +++ b/ports/sysdeps/arm/setjmp.S @@ -91,12 +91,12 @@ ENTRY (__sigsetjmp) #ifdef NEED_HWCAP # ifdef IS_IN_rtld -1: .long _GLOBAL_OFFSET_TABLE_ - 0b - 8 +1: .long _GLOBAL_OFFSET_TABLE_ - 0b - PC_OFS .Lrtld_local_ro: .long C_SYMBOL_NAME(_rtld_local_ro)(GOTOFF) # else # ifdef PIC -1: .long _GLOBAL_OFFSET_TABLE_ - 0b - 8 +1: .long _GLOBAL_OFFSET_TABLE_ - 0b - PC_OFS .Lrtld_global_ro: .long C_SYMBOL_NAME(_rtld_global_ro)(GOT) # else diff --git a/ports/sysdeps/arm/sysdep.h b/ports/sysdeps/arm/sysdep.h index f5ddab0108..4af7429ac9 100644 --- a/ports/sysdeps/arm/sysdep.h +++ b/ports/sysdeps/arm/sysdep.h @@ -118,3 +118,11 @@ .eabi_attribute 24, 1 #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 diff --git a/ports/sysdeps/unix/arm/sysdep.S b/ports/sysdeps/unix/arm/sysdep.S index da07d85f18..99bca9fab1 100644 --- a/ports/sysdeps/unix/arm/sysdep.S +++ b/ports/sysdeps/unix/arm/sysdep.S @@ -50,14 +50,14 @@ __syscall_error: mvn r0, #0 RETINSTR (, ip) -1: .word errno(gottpoff) + (. - 2b - 8) +1: .word errno(gottpoff) + (. - 2b - PC_OFS) #elif RTLD_PRIVATE_ERRNO ldr r1, 1f 0: str r0, [pc, r1] mvn r0, $0 DO_RET(r14) -1: .word C_SYMBOL_NAME(rtld_errno) - 0b - 8 +1: .word C_SYMBOL_NAME(rtld_errno) - 0b - PC_OFS #else #error "Unsupported non-TLS case" #endif diff --git a/ports/sysdeps/unix/sysv/linux/arm/getcontext.S b/ports/sysdeps/unix/sysv/linux/arm/getcontext.S index f7857c1996..fa00c0b789 100644 --- a/ports/sysdeps/unix/sysv/linux/arm/getcontext.S +++ b/ports/sysdeps/unix/sysv/linux/arm/getcontext.S @@ -103,7 +103,7 @@ ENTRY(__getcontext) END(__getcontext) #ifdef PIC -1: .long _GLOBAL_OFFSET_TABLE_ - 0b - 8 +1: .long _GLOBAL_OFFSET_TABLE_ - 0b - PC_OFS .Lrtld_global_ro: .long C_SYMBOL_NAME(_rtld_global_ro)(GOT) #else diff --git a/ports/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h b/ports/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h index 4bd79d4d4f..df85d51995 100644 --- a/ports/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h +++ b/ports/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h @@ -208,7 +208,7 @@ extern int __local_multiple_threads attribute_hidden; ldr ip, [pc, ip]; \ teq ip, #0; # define PSEUDO_PROLOGUE \ - 1: .word __local_multiple_threads - 2f - 8; + 1: .word __local_multiple_threads - 2f - PC_OFS; # endif # else /* There is no __local_multiple_threads for librt, so use the TCB. */ diff --git a/ports/sysdeps/unix/sysv/linux/arm/nptl/unwind-forcedunwind.c b/ports/sysdeps/unix/sysv/linux/arm/nptl/unwind-forcedunwind.c index 58ca9acf64..caa6a26260 100644 --- a/ports/sysdeps/unix/sysv/linux/arm/nptl/unwind-forcedunwind.c +++ b/ports/sysdeps/unix/sysv/linux/arm/nptl/unwind-forcedunwind.c @@ -84,6 +84,9 @@ __unwind_freeres (void) ARM unwinder relies on register state at entrance. So we write this in assembly. */ +#define STR1(S) #S +#define STR(S) STR1(S) + asm ( " .globl _Unwind_Resume\n" " .type _Unwind_Resume, %function\n" @@ -118,11 +121,7 @@ asm ( " b 5b\n" " " CFI_ENDPROC "\n" " .align 2\n" -#ifdef __thumb2__ -"1: .word _GLOBAL_OFFSET_TABLE_ - 3b - 4\n" -#else -"1: .word _GLOBAL_OFFSET_TABLE_ - 3b - 8\n" -#endif +"1: .word _GLOBAL_OFFSET_TABLE_ - 3b - " STR (PC_OFS) "\n" "2: .word libgcc_s_resume(GOTOFF)\n" " .size _Unwind_Resume, .-_Unwind_Resume\n" ); diff --git a/ports/sysdeps/unix/sysv/linux/arm/nptl/unwind-resume.c b/ports/sysdeps/unix/sysv/linux/arm/nptl/unwind-resume.c index 0a3ad953b8..1211599131 100644 --- a/ports/sysdeps/unix/sysv/linux/arm/nptl/unwind-resume.c +++ b/ports/sysdeps/unix/sysv/linux/arm/nptl/unwind-resume.c @@ -47,6 +47,9 @@ init (void) ARM unwinder relies on register state at entrance. So we write this in assembly. */ +#define STR1(S) #S +#define STR(S) STR1(S) + asm ( " .globl _Unwind_Resume\n" " .type _Unwind_Resume, %function\n" @@ -81,11 +84,7 @@ asm ( " b 5b\n" " " CFI_ENDPROC "\n" " .align 2\n" -#ifdef __thumb2__ -"1: .word _GLOBAL_OFFSET_TABLE_ - 3b - 4\n" -#else -"1: .word _GLOBAL_OFFSET_TABLE_ - 3b - 8\n" -#endif +"1: .word _GLOBAL_OFFSET_TABLE_ - 3b - " STR (PC_OFS) "\n" "2: .word libgcc_s_resume(GOTOFF)\n" " .size _Unwind_Resume, .-_Unwind_Resume\n" ); diff --git a/ports/sysdeps/unix/sysv/linux/arm/setcontext.S b/ports/sysdeps/unix/sysv/linux/arm/setcontext.S index 8e71f5b4e4..edd17bcd40 100644 --- a/ports/sysdeps/unix/sysv/linux/arm/setcontext.S +++ b/ports/sysdeps/unix/sysv/linux/arm/setcontext.S @@ -93,7 +93,7 @@ ENTRY(__startcontext) END(__startcontext) #ifdef PIC -1: .long _GLOBAL_OFFSET_TABLE_ - 0b - 8 +1: .long _GLOBAL_OFFSET_TABLE_ - 0b - PC_OFS .Lrtld_global_ro: .long C_SYMBOL_NAME(_rtld_global_ro)(GOT) #else diff --git a/ports/sysdeps/unix/sysv/linux/arm/sysdep.h b/ports/sysdeps/unix/sysv/linux/arm/sysdep.h index 676a14358a..f9b3443c14 100644 --- a/ports/sysdeps/unix/sysv/linux/arm/sysdep.h +++ b/ports/sysdeps/unix/sysv/linux/arm/sysdep.h @@ -114,7 +114,7 @@ __local_syscall_error: \ 0: str r0, [pc, r1]; \ mvn r0, #0; \ DO_RET(lr); \ -1: .word C_SYMBOL_NAME(rtld_errno) - 0b - 8; +1: .word C_SYMBOL_NAME(rtld_errno) - 0b - PC_OFS; # else # if defined(__ARM_ARCH_4T__) && defined(__THUMB_INTERWORK__) # define POP_PC \ |