#undef toc
#define FUNC_NAME(name) GLUE(__USER_LABEL_PREFIX__,name)
+#ifdef __PCREL__
+#define JUMP_TARGET(name) GLUE(FUNC_NAME(name),@notoc)
+#define FUNC_START(name) \
+ .type FUNC_NAME(name),@function; \
+ .globl FUNC_NAME(name); \
+FUNC_NAME(name): \
+ .localentry FUNC_NAME(name),1
+#else
#define JUMP_TARGET(name) FUNC_NAME(name)
#define FUNC_START(name) \
.type FUNC_NAME(name),@function; \
0: addis 2,12,(.TOC.-0b)@ha; \
addi 2,2,(.TOC.-0b)@l; \
.localentry FUNC_NAME(name),.-FUNC_NAME(name)
+#endif /* !__PCREL__ */
#define HIDDEN_FUNC(name) \
FUNC_START(name) \
.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
#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
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,
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
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.
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)
.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
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)
# 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)