diff options
Diffstat (limited to 'libgcc/config/rs6000/morestack.S')
-rw-r--r-- | libgcc/config/rs6000/morestack.S | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/libgcc/config/rs6000/morestack.S b/libgcc/config/rs6000/morestack.S index 1b8ebb5dc3b..ac33c882c30 100644 --- a/libgcc/config/rs6000/morestack.S +++ b/libgcc/config/rs6000/morestack.S @@ -55,11 +55,18 @@ .type name,@function; \ name##: +#ifdef __PCREL__ +#define ENTRY(name) \ + ENTRY0(name); \ + .localentry name, 1 +#define JUMP_TARGET(name) name##@notoc +#else #define ENTRY(name) \ ENTRY0(name); \ 0: addis %r2,%r12,.TOC.-0b@ha; \ addi %r2,%r2,.TOC.-0b@l; \ .localentry name, .-name +#endif #else @@ -81,6 +88,9 @@ BODY_LABEL(name)##: #define SIZE(name) .size name, .-BODY_LABEL(name) +#ifndef JUMP_TARGET +#define JUMP_TARGET(name) name +#endif .text # Just like __morestack, but with larger excess allocation @@ -156,7 +166,7 @@ ENTRY0(__morestack) stdu %r1,-MORESTACK_FRAMESIZE(%r1) # void __morestack_block_signals (void) - bl __morestack_block_signals + bl JUMP_TARGET(__morestack_block_signals) # void *__generic_morestack (size_t *pframe_size, # void *old_stack, @@ -164,7 +174,7 @@ ENTRY0(__morestack) addi %r3,%r29,NEWSTACKSIZE_SAVE mr %r4,%r29 li %r5,0 # no copying from old stack - bl __generic_morestack + bl JUMP_TARGET(__generic_morestack) # Start using new stack stdu %r29,-32(%r3) # back-chain @@ -183,7 +193,7 @@ ENTRY0(__morestack) std %r3,-0x7000-64(%r13) # tcbhead_t.__private_ss # void __morestack_unblock_signals (void) - bl __morestack_unblock_signals + bl JUMP_TARGET(__morestack_unblock_signals) # Set up for a call to the target function, located 3 # instructions after __morestack's return address. @@ -218,11 +228,11 @@ ENTRY0(__morestack) std %r10,PARAMREG_SAVE+56(%r29) #endif - bl __morestack_block_signals + bl JUMP_TARGET(__morestack_block_signals) # void *__generic_releasestack (size_t *pavailable) addi %r3,%r29,NEWSTACKSIZE_SAVE - bl __generic_releasestack + bl JUMP_TARGET(__generic_releasestack) # Reset __private_ss stack guard to value for old stack ld %r12,NEWSTACKSIZE_SAVE(%r29) @@ -231,7 +241,7 @@ ENTRY0(__morestack) .LEHE0: std %r3,-0x7000-64(%r13) # tcbhead_t.__private_ss - bl __morestack_unblock_signals + bl JUMP_TARGET(__morestack_unblock_signals) # Use old stack again. mr %r1,%r29 @@ -260,13 +270,15 @@ cleanup: std %r3,PARAMREG_SAVE(%r29) # Save exception header # size_t __generic_findstack (void *stack) mr %r3,%r29 - bl __generic_findstack + bl JUMP_TARGET(__generic_findstack) sub %r3,%r29,%r3 addi %r3,%r3,BACKOFF std %r3,-0x7000-64(%r13) # tcbhead_t.__private_ss ld %r3,PARAMREG_SAVE(%r29) - bl _Unwind_Resume + bl JUMP_TARGET(_Unwind_Resume) +#ifndef __PCREL__ nop +#endif .cfi_endproc SIZE (__morestack) @@ -310,7 +322,7 @@ ENTRY(__stack_split_initialize) # void __generic_morestack_set_initial_sp (void *sp, size_t len) mr %r3,%r1 li %r4, 0x4000 - b __generic_morestack_set_initial_sp + b JUMP_TARGET(__generic_morestack_set_initial_sp) # The lack of .cfi_endproc here is deliberate. This function and the # following ones can all use the default FDE. SIZE (__stack_split_initialize) |