[RS6000] Adjust gcc asm for power10

Generate assembly with .localentry,1 functions using @notoc calls.
This patch makes libgcc.a asm look the same as power10 pcrel as far as
toc/notoc is concerned.

Otherwise calling between functions that advertise as using the TOC
and those that don't, will require linker call stubs in statically
linked code.

gcc/
	* config/rs6000/ppc-asm.h: Support __PCREL__ code.
libgcc/
	* config/rs6000/morestack.S,
	* config/rs6000/tramp.S: Support __PCREL__ code.
libitm/
	* config/powerpc/sjlj.S: Support __PCREL__ code.

(cherry picked from commit 2dd7b93778)
This commit is contained in:
Alan Modra 2020-09-28 16:42:33 +09:30
parent 21e609b9bb
commit 445922b932
4 changed files with 53 additions and 10 deletions

View File

@ -262,6 +262,14 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
#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; \
@ -270,6 +278,7 @@ FUNC_NAME(name): \
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) \

View File

@ -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)

View File

@ -139,15 +139,21 @@ trampoline_size = .-trampoline_initial
/* R5 = function address */
/* R6 = static chain */
#ifndef __PCREL__
.pushsection ".toc","aw"
.LC0:
.quad trampoline_initial-8
.popsection
#endif
FUNC_START(__trampoline_setup)
.cfi_startproc
#ifdef __PCREL__
pla 7,(trampoline_initial-8)@pcrel
#else
addis 7,2,.LC0@toc@ha
ld 7,.LC0@toc@l(7) /* trampoline address -8 */
#endif
cmpwi cr1,r4,trampoline_size /* verify that the trampoline is big enough */
srwi r4,r4,3 /* # doublewords to move */

View File

@ -26,7 +26,23 @@
#include "asmcfi.h"
#if defined(__powerpc64__) && _CALL_ELF == 2
#if defined(__powerpc64__) && _CALL_ELF == 2 && defined(__PCREL__)
.macro FUNC name
.globl \name
.type \name, @function
\name:
.localentry \name, 1
.endm
.macro END name
.size \name, . - \name
.endm
.macro HIDDEN name
.hidden \name
.endm
.macro CALL name
bl \name @notoc
.endm
#elif defined(__powerpc64__) && _CALL_ELF == 2
.macro FUNC name
.globl \name
.type \name, @function