[RS6000] Adjust gcc asm for power10
authorAlan Modra <amodra@gmail.com>
Mon, 28 Sep 2020 07:12:33 +0000 (16:42 +0930)
committerAlan Modra <amodra@gmail.com>
Thu, 1 Oct 2020 01:04:48 +0000 (10:34 +0930)
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.

gcc/config/rs6000/ppc-asm.h
libgcc/config/rs6000/morestack.S
libgcc/config/rs6000/tramp.S
libitm/config/powerpc/sjlj.S

index 48edc9945d7626170c77b6a4e79675f38fcadf42..e0bce9c5aec227b66029e8ed4c67823d9ec6ec92 100644 (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) \
index 1b8ebb5dc3b300e592ea870f8f652c89af925155..ac33c882c3060048ed31dca147846ea4e382acc2 100644 (file)
        .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)
index 9b8fcfe34a3bc38987f49100acd4d5fdc68b3464..b165faa31ec7ba04661c2eaf1242ea8ae69546de 100644 (file)
@@ -140,15 +140,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
 
        li      r8,trampoline_size      /* verify that the trampoline is big enough */
        cmpw    cr1,r8,r4
index a963fc350bb701995e14e5fd48d29d37f4ecff79..bcb0e73a2852ad60c77a700d11c76475466a8070 100644 (file)
 
 #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