public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r10-10451] [RS6000] Adjust gcc asm for power10
@ 2022-02-13 22:06 Alan Modra
0 siblings, 0 replies; only message in thread
From: Alan Modra @ 2022-02-13 22:06 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:445922b932d938a9f47a32b97fefbd07aa4a2841
commit r10-10451-g445922b932d938a9f47a32b97fefbd07aa4a2841
Author: Alan Modra <amodra@gmail.com>
Date: Mon Sep 28 16:42:33 2020 +0930
[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 2dd7b93778d551b6981c8086ecb38e26f677bd2b)
Diff:
---
gcc/config/rs6000/ppc-asm.h | 9 +++++++++
libgcc/config/rs6000/morestack.S | 30 +++++++++++++++++++++---------
libgcc/config/rs6000/tramp.S | 6 ++++++
libitm/config/powerpc/sjlj.S | 18 +++++++++++++++++-
4 files changed, 53 insertions(+), 10 deletions(-)
diff --git a/gcc/config/rs6000/ppc-asm.h b/gcc/config/rs6000/ppc-asm.h
index 48edc9945d7..e0bce9c5aec 100644
--- a/gcc/config/rs6000/ppc-asm.h
+++ b/gcc/config/rs6000/ppc-asm.h
@@ -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) \
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)
diff --git a/libgcc/config/rs6000/tramp.S b/libgcc/config/rs6000/tramp.S
index 47f97e93e6a..1fc5f37f88f 100644
--- a/libgcc/config/rs6000/tramp.S
+++ b/libgcc/config/rs6000/tramp.S
@@ -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 */
diff --git a/libitm/config/powerpc/sjlj.S b/libitm/config/powerpc/sjlj.S
index a963fc350bb..bcb0e73a285 100644
--- a/libitm/config/powerpc/sjlj.S
+++ b/libitm/config/powerpc/sjlj.S
@@ -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
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2022-02-13 22:06 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-02-13 22:06 [gcc r10-10451] [RS6000] Adjust gcc asm for power10 Alan Modra
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).