public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] IBM Z: Use @PLT symbols for local functions in 64-bit mode
@ 2021-06-24 11:18 Ilya Leoshkevich
  0 siblings, 0 replies; only message in thread
From: Ilya Leoshkevich @ 2021-06-24 11:18 UTC (permalink / raw)
  To: Andreas Krebbel; +Cc: gcc-patches, Ulrich Weigand, Ilya Leoshkevich

Bootstrapped and regtested on s390x-redhat-linux.  Ok for master?



This helps with generating the code for kernel hotpatches, which
contain individual functions and are loaded more than 2G away from
vmlinux.  This should not create performance regressions for the
normal use cases, because for local functions ld replaces @PLT calls
with direct calls.

gcc/ChangeLog:

	* config/s390/s390.c (print_operand): Handle %K.
	* config/s390/s390.md (*movdi_64): Use %K for larl.
	(reload_base_64): Likewise.
	(*sibcall_brc): Use %K for j.
	(*sibcall_brcl): Use %K for jg.
	(*sibcall_value_brc): Use %K for j.
	(*sibcall_value_brcl): Use %K for jg.
	(*bras): Use %K.
	(*brasl): Likewise.
	(*bras_r): Likewise.
	(*brasl_r): Likewise.
	(main_base_64): Use %K for larl.
	(reload_base_64): Likewise.
	(@split_stack_call<mode>): Use %K for jg.

gcc/testsuite/ChangeLog:

	* g++.dg/ext/visibility/noPLT.C: Skip on s390x.
	* gcc.target/s390/nodatarel-1.c: Move foostatic to the new
	tests.
	* gcc.target/s390/pr80080-4.c: Allow @PLT suffix.
	* gcc.target/s390/risbg-ll-3.c: Likewise.
	* gcc.target/s390/call.h: Common code for the new tests.
	* gcc.target/s390/call31-z10-pic-nodatarel.c: New test.
	* gcc.target/s390/call31-z10-pic.c: New test.
	* gcc.target/s390/call31-z10.c: New test.
	* gcc.target/s390/call31-z9-pic-nodatarel.c: New test.
	* gcc.target/s390/call31-z9-pic.c: New test.
	* gcc.target/s390/call31-z9.c: New test.
	* gcc.target/s390/call64-z10-pic-nodatarel.c: New test.
	* gcc.target/s390/call64-z10-pic.c: New test.
	* gcc.target/s390/call64-z10.c: New test.
	* gcc.target/s390/call64-z9-pic-nodatarel.c: New test.
	* gcc.target/s390/call64-z9-pic.c: New test.
	* gcc.target/s390/call64-z9.c: New test.
---
 gcc/config/s390/s390.c                        |  9 +++++
 gcc/config/s390/s390.md                       | 26 ++++++-------
 gcc/testsuite/g++.dg/ext/visibility/noPLT.C   |  2 +-
 gcc/testsuite/gcc.target/s390/call.h          | 38 +++++++++++++++++++
 .../s390/call31-z10-pic-nodatarel.c           | 16 ++++++++
 .../gcc.target/s390/call31-z10-pic.c          | 16 ++++++++
 gcc/testsuite/gcc.target/s390/call31-z10.c    | 15 ++++++++
 .../gcc.target/s390/call31-z9-pic-nodatarel.c | 16 ++++++++
 gcc/testsuite/gcc.target/s390/call31-z9-pic.c | 16 ++++++++
 gcc/testsuite/gcc.target/s390/call31-z9.c     | 15 ++++++++
 .../s390/call64-z10-pic-nodatarel.c           | 17 +++++++++
 .../gcc.target/s390/call64-z10-pic.c          | 17 +++++++++
 gcc/testsuite/gcc.target/s390/call64-z10.c    | 15 ++++++++
 .../gcc.target/s390/call64-z9-pic-nodatarel.c | 17 +++++++++
 gcc/testsuite/gcc.target/s390/call64-z9-pic.c | 17 +++++++++
 gcc/testsuite/gcc.target/s390/call64-z9.c     | 15 ++++++++
 gcc/testsuite/gcc.target/s390/nodatarel-1.c   | 26 +------------
 gcc/testsuite/gcc.target/s390/pr80080-4.c     |  2 +-
 gcc/testsuite/gcc.target/s390/risbg-ll-3.c    |  6 +--
 19 files changed, 258 insertions(+), 43 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/s390/call.h
 create mode 100644 gcc/testsuite/gcc.target/s390/call31-z10-pic-nodatarel.c
 create mode 100644 gcc/testsuite/gcc.target/s390/call31-z10-pic.c
 create mode 100644 gcc/testsuite/gcc.target/s390/call31-z10.c
 create mode 100644 gcc/testsuite/gcc.target/s390/call31-z9-pic-nodatarel.c
 create mode 100644 gcc/testsuite/gcc.target/s390/call31-z9-pic.c
 create mode 100644 gcc/testsuite/gcc.target/s390/call31-z9.c
 create mode 100644 gcc/testsuite/gcc.target/s390/call64-z10-pic-nodatarel.c
 create mode 100644 gcc/testsuite/gcc.target/s390/call64-z10-pic.c
 create mode 100644 gcc/testsuite/gcc.target/s390/call64-z10.c
 create mode 100644 gcc/testsuite/gcc.target/s390/call64-z9-pic-nodatarel.c
 create mode 100644 gcc/testsuite/gcc.target/s390/call64-z9-pic.c
 create mode 100644 gcc/testsuite/gcc.target/s390/call64-z9.c

diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c
index 6bbeb640e1f..e7839044a40 100644
--- a/gcc/config/s390/s390.c
+++ b/gcc/config/s390/s390.c
@@ -7943,6 +7943,7 @@ print_operand_address (FILE *file, rtx addr)
     'E': print opcode suffix for branch on index instruction.
     'G': print the size of the operand in bytes.
     'J': print tls_load/tls_gdcall/tls_ldcall suffix
+    'K': print @PLT suffix for call targets and load address values.
     'M': print the second word of a TImode operand.
     'N': print the second word of a DImode operand.
     'O': print only the displacement of a memory reference or address.
@@ -8129,6 +8130,14 @@ print_operand (FILE *file, rtx x, int code)
     case 'Y':
       print_shift_count_operand (file, x);
       return;
+
+    case 'K':
+      if (TARGET_64BIT
+	  && flag_pic
+	  && GET_CODE (x) == SYMBOL_REF
+	  && SYMBOL_REF_FUNCTION_P (x))
+	fprintf (file, "@PLT");
+      return;
     }
 
   switch (GET_CODE (x))
diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md
index 0c5b4dc9029..093ab5c5876 100644
--- a/gcc/config/s390/s390.md
+++ b/gcc/config/s390/s390.md
@@ -1906,7 +1906,7 @@
    vlgvg\t%0,%v1,0
    vleg\t%v0,%1,0
    vsteg\t%v1,%0,0
-   larl\t%0,%1"
+   larl\t%0,%1%K1"
   [(set_attr "op_type" "RI,RI,RI,RI,RI,RIL,RIL,RIL,RRE,RRE,RRE,RXY,RIL,RRE,RXY,
                         RXY,RR,RX,RXY,RX,RXY,RIL,SIL,*,*,RS,RS,VRI,VRR,VRS,VRS,
                         VRX,VRX,RIL")
@@ -2180,7 +2180,7 @@
         (match_operand:SI 1 "larl_operand" "X"))]
   "!TARGET_64BIT
    && !FP_REG_P (operands[0])"
-  "larl\t%0,%1"
+  "larl\t%0,%1%K1"
    [(set_attr "op_type" "RIL")
     (set_attr "type"    "larl")
     (set_attr "z10prop" "z10_fwd_A1")
@@ -10373,7 +10373,7 @@
   [(call (mem:QI (match_operand 0 "bras_sym_operand" "X"))
          (match_operand 1 "const_int_operand" "n"))]
   "SIBLING_CALL_P (insn) && TARGET_SMALL_EXEC"
-  "j\t%0"
+  "j\t%0%K0"
   [(set_attr "op_type" "RI")
    (set_attr "type"    "branch")])
 
@@ -10381,7 +10381,7 @@
   [(call (mem:QI (match_operand 0 "bras_sym_operand" "X"))
          (match_operand 1 "const_int_operand" "n"))]
   "SIBLING_CALL_P (insn)"
-  "jg\t%0"
+  "jg\t%0%K0"
   [(set_attr "op_type" "RIL")
    (set_attr "type"    "branch")])
 
@@ -10434,7 +10434,7 @@
 	(call (mem:QI (match_operand 1 "bras_sym_operand" "X"))
 	      (match_operand 2 "const_int_operand" "n")))]
   "SIBLING_CALL_P (insn) && TARGET_SMALL_EXEC"
-  "j\t%1"
+  "j\t%1%K1"
   [(set_attr "op_type" "RI")
    (set_attr "type"    "branch")])
 
@@ -10443,7 +10443,7 @@
 	(call (mem:QI (match_operand 1 "bras_sym_operand" "X"))
 	      (match_operand 2 "const_int_operand" "n")))]
   "SIBLING_CALL_P (insn)"
-  "jg\t%1"
+  "jg\t%1%K1"
   [(set_attr "op_type" "RIL")
    (set_attr "type"    "branch")])
 
@@ -10470,7 +10470,7 @@
   "!SIBLING_CALL_P (insn)
    && TARGET_SMALL_EXEC
    && GET_MODE (operands[2]) == Pmode"
-  "bras\t%2,%0"
+  "bras\t%2,%0%K0"
   [(set_attr "op_type" "RI")
    (set_attr "type"    "jsr")
    (set_attr "z196prop" "z196_cracked")])
@@ -10482,7 +10482,7 @@
   "!SIBLING_CALL_P (insn)
 
    && GET_MODE (operands[2]) == Pmode"
-  "brasl\t%2,%0"
+  "brasl\t%2,%0%K0"
   [(set_attr "op_type" "RIL")
    (set_attr "type"    "jsr")
    (set_attr "z196prop" "z196_cracked")
@@ -10576,7 +10576,7 @@
   "!SIBLING_CALL_P (insn)
    && TARGET_SMALL_EXEC
    && GET_MODE (operands[3]) == Pmode"
-  "bras\t%3,%1"
+  "bras\t%3,%1%K1"
   [(set_attr "op_type" "RI")
    (set_attr "type"    "jsr")
    (set_attr "z196prop" "z196_cracked")])
@@ -10589,7 +10589,7 @@
   "!SIBLING_CALL_P (insn)
 
    && GET_MODE (operands[3]) == Pmode"
-  "brasl\t%3,%1"
+  "brasl\t%3,%1%K1"
   [(set_attr "op_type" "RIL")
    (set_attr "type"    "jsr")
    (set_attr "z196prop" "z196_cracked")
@@ -11343,7 +11343,7 @@
   [(set (match_operand 0 "register_operand" "=a")
         (unspec [(label_ref (match_operand 1 "" ""))] UNSPEC_MAIN_BASE))]
   "GET_MODE (operands[0]) == Pmode"
-  "larl\t%0,%1"
+  "larl\t%0,%1%K1"
   [(set_attr "op_type" "RIL")
    (set_attr "type"    "larl")
    (set_attr "z10prop" "z10_fwd_A1")
@@ -11363,7 +11363,7 @@
   [(set (match_operand 0 "register_operand" "=a")
         (unspec [(label_ref (match_operand 1 "" ""))] UNSPEC_RELOAD_BASE))]
   "GET_MODE (operands[0]) == Pmode"
-  "larl\t%0,%1"
+  "larl\t%0,%1%K1"
   [(set_attr "op_type" "RIL")
    (set_attr "type"    "larl")
    (set_attr "z10prop" "z10_fwd_A1")])
@@ -12220,7 +12220,7 @@
   ""
 {
   s390_output_split_stack_data (operands[1], operands[2], operands[3], operands[4]);
-  return "jg\t%0";
+  return "jg\t%0%K0";
 }
   [(set_attr "op_type" "RIL")
    (set_attr "type"  "branch")])
diff --git a/gcc/testsuite/g++.dg/ext/visibility/noPLT.C b/gcc/testsuite/g++.dg/ext/visibility/noPLT.C
index 38af05fd6e3..b888303d56d 100644
--- a/gcc/testsuite/g++.dg/ext/visibility/noPLT.C
+++ b/gcc/testsuite/g++.dg/ext/visibility/noPLT.C
@@ -1,5 +1,5 @@
 /* Test that -fvisibility=hidden prevents PLT. */
-/* { dg-do compile { target fpic } } */
+/* { dg-do compile { target { fpic && { ! s390x-*-* } } } } */
 /* { dg-require-visibility "" } */
 /* { dg-options "-fPIC -fvisibility=hidden" } */
 /* { dg-final { scan-assembler-not "methodEv@PLT|indirect_symbol.*methodEv" } } */
diff --git a/gcc/testsuite/gcc.target/s390/call.h b/gcc/testsuite/gcc.target/s390/call.h
new file mode 100644
index 00000000000..61e9d3030dc
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/call.h
@@ -0,0 +1,38 @@
+__attribute__ ((noipa)) void
+foo (void)
+{
+  return;
+}
+
+void *
+usefoo (void)
+{
+  foo ();
+  return foo;
+}
+
+__attribute__ ((noipa)) static void
+foostatic (void)
+{
+  return;
+}
+
+void *
+usefoostatic (void)
+{
+  foostatic ();
+  return foostatic;
+}
+
+__attribute__ ((weak)) void fooweak (void);
+
+void *
+usefooweak (void)
+{
+  fooweak ();
+  return fooweak;
+}
+
+__attribute__ ((__used__, section (".foos"), aligned (sizeof (void *))))
+static void
+*foos[] = { foo, foostatic, fooweak };
diff --git a/gcc/testsuite/gcc.target/s390/call31-z10-pic-nodatarel.c b/gcc/testsuite/gcc.target/s390/call31-z10-pic-nodatarel.c
new file mode 100644
index 00000000000..3e6eff6c9db
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/call31-z10-pic-nodatarel.c
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -m31 -march=z10 -mzarch -fPIC -mno-pic-data-is-text-relative" } */
+
+#include "call.h"
+
+/* { dg-final { scan-assembler {brasl\t%r\d+,foo@PLT\n} } } */
+/* { dg-final { scan-assembler {lrl\t%r2,foo@GOTENT\n} } } */
+
+/* In 31-bit mode we can't use @PLT as freely as in 64-bit mode.  */
+/* { dg-final { scan-assembler {brasl\t%r\d+,foostatic\n} } } */
+/* { dg-final { scan-assembler {larl\t%r2,foostatic\n} } } */
+
+/* { dg-final { scan-assembler {brasl\t%r\d+,fooweak@PLT\n} } } */
+/* { dg-final { scan-assembler {lrl\t%r2,fooweak@GOTENT\n} } } */
+
+/* { dg-final { scan-assembler {foos:\n\t.long\tfoo\n\t.long\tfoostatic\n\t.long\tfooweak\n} } } */
diff --git a/gcc/testsuite/gcc.target/s390/call31-z10-pic.c b/gcc/testsuite/gcc.target/s390/call31-z10-pic.c
new file mode 100644
index 00000000000..34a5ca959b2
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/call31-z10-pic.c
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -m31 -march=z10 -mzarch -fPIC" } */
+
+#include "call.h"
+
+/* { dg-final { scan-assembler {brasl\t%r\d+,foo@PLT\n} } } */
+/* { dg-final { scan-assembler {lrl\t%r2,foo@GOTENT\n} } } */
+
+/* In 31-bit mode we can't use @PLT as freely as in 64-bit mode.  */
+/* { dg-final { scan-assembler {brasl\t%r\d+,foostatic\n} } } */
+/* { dg-final { scan-assembler {larl\t%r2,foostatic\n} } } */
+
+/* { dg-final { scan-assembler {brasl\t%r\d+,fooweak@PLT\n} } } */
+/* { dg-final { scan-assembler {lrl\t%r2,fooweak@GOTENT\n} } } */
+
+/* { dg-final { scan-assembler {foos:\n\t.long\tfoo\n\t.long\tfoostatic\n\t.long\tfooweak\n} } } */
diff --git a/gcc/testsuite/gcc.target/s390/call31-z10.c b/gcc/testsuite/gcc.target/s390/call31-z10.c
new file mode 100644
index 00000000000..935f7115cd5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/call31-z10.c
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -m31 -march=z10 -mzarch" } */
+
+#include "call.h"
+
+/* { dg-final { scan-assembler {brasl\t%r\d+,foo\n} } } */
+/* { dg-final { scan-assembler {larl\t%r2,foo\n} } } */
+
+/* { dg-final { scan-assembler {brasl\t%r\d+,foostatic\n} } } */
+/* { dg-final { scan-assembler {larl\t%r2,foostatic\n} } } */
+
+/* { dg-final { scan-assembler {brasl\t%r\d+,fooweak\n} } } */
+/* { dg-final { scan-assembler {larl\t%r2,fooweak\n} } } */
+
+/* { dg-final { scan-assembler {foos:\n\t.long\tfoo\n\t.long\tfoostatic\n\t.long\tfooweak\n} } } */
diff --git a/gcc/testsuite/gcc.target/s390/call31-z9-pic-nodatarel.c b/gcc/testsuite/gcc.target/s390/call31-z9-pic-nodatarel.c
new file mode 100644
index 00000000000..a4a3170f071
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/call31-z9-pic-nodatarel.c
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -m31 -march=z9-ec -fPIC -mno-pic-data-is-text-relative" } */
+
+#include "call.h"
+
+/* { dg-final { scan-assembler {brasl\t%r\d+,foo@PLT\n} } } */
+/* { dg-final { scan-assembler {larl\t%r\d+,foo@GOTENT\n} } } */
+
+/* In 31-bit mode we can't use @PLT as freely as in 64-bit mode.  */
+/* { dg-final { scan-assembler {brasl\t%r\d+,foostatic\n} } } */
+/* { dg-final { scan-assembler {larl\t%r2,foostatic\n} } } */
+
+/* { dg-final { scan-assembler {brasl\t%r\d+,fooweak@PLT\n} } } */
+/* { dg-final { scan-assembler {larl\t%r\d+,fooweak@GOTENT\n} } } */
+
+/* { dg-final { scan-assembler {foos:\n\t.long\tfoo\n\t.long\tfoostatic\n\t.long\tfooweak\n} } } */
diff --git a/gcc/testsuite/gcc.target/s390/call31-z9-pic.c b/gcc/testsuite/gcc.target/s390/call31-z9-pic.c
new file mode 100644
index 00000000000..9950d504e72
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/call31-z9-pic.c
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -m31 -march=z9-ec -fPIC" } */
+
+#include "call.h"
+
+/* { dg-final { scan-assembler {brasl\t%r\d+,foo@PLT\n} } } */
+/* { dg-final { scan-assembler {larl\t%r\d+,foo@GOTENT\n} } } */
+
+/* In 31-bit mode we can't use @PLT as freely as in 64-bit mode.  */
+/* { dg-final { scan-assembler {brasl\t%r\d+,foostatic\n} } } */
+/* { dg-final { scan-assembler {larl\t%r2,foostatic\n} } } */
+
+/* { dg-final { scan-assembler {brasl\t%r\d+,fooweak@PLT\n} } } */
+/* { dg-final { scan-assembler {larl\t%r\d+,fooweak@GOTENT\n} } } */
+
+/* { dg-final { scan-assembler {foos:\n\t.long\tfoo\n\t.long\tfoostatic\n\t.long\tfooweak\n} } } */
diff --git a/gcc/testsuite/gcc.target/s390/call31-z9.c b/gcc/testsuite/gcc.target/s390/call31-z9.c
new file mode 100644
index 00000000000..2f211135b25
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/call31-z9.c
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -m31 -march=z9-ec" } */
+
+#include "call.h"
+
+/* { dg-final { scan-assembler {brasl\t%r\d+,foo\n} } } */
+/* { dg-final { scan-assembler {larl\t%r2,foo\n} } } */
+
+/* { dg-final { scan-assembler {brasl\t%r\d+,foostatic\n} } } */
+/* { dg-final { scan-assembler {larl\t%r2,foostatic\n} } } */
+
+/* { dg-final { scan-assembler {brasl\t%r\d+,fooweak\n} } } */
+/* { dg-final { scan-assembler {larl\t%r2,fooweak\n} } } */
+
+/* { dg-final { scan-assembler {foos:\n\t.long\tfoo\n\t.long\tfoostatic\n\t.long\tfooweak\n} } } */
diff --git a/gcc/testsuite/gcc.target/s390/call64-z10-pic-nodatarel.c b/gcc/testsuite/gcc.target/s390/call64-z10-pic-nodatarel.c
new file mode 100644
index 00000000000..3547ca979e1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/call64-z10-pic-nodatarel.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -m64 -march=z10 -fPIC -mno-pic-data-is-text-relative" } */
+
+#include "call.h"
+
+/* { dg-final { scan-assembler {brasl\t%r\d+,foo@PLT\n} } } */
+/* { dg-final { scan-assembler {lgrl\t%r2,foo@GOTENT\n} } } */
+
+/* ld is supposed to optimize foostatic@PLT to just foostatic.  */
+/* { dg-final { scan-assembler {brasl\t%r\d+,foostatic@PLT\n} } } */
+/* { dg-final { scan-assembler {larl\t%r2,foostatic@PLT\n} } } */
+
+/* { dg-final { scan-assembler {brasl\t%r\d+,fooweak@PLT\n} } } */
+/* { dg-final { scan-assembler {lgrl\t%r2,fooweak@GOTENT\n} } } */
+
+/* @PLT is not used for data, since it produces R_390_PLT64 relocation.  */
+/* { dg-final { scan-assembler {foos:\n\t.quad\tfoo\n\t.quad\tfoostatic\n\t.quad\tfooweak\n} } } */
diff --git a/gcc/testsuite/gcc.target/s390/call64-z10-pic.c b/gcc/testsuite/gcc.target/s390/call64-z10-pic.c
new file mode 100644
index 00000000000..6ad36eb9e7e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/call64-z10-pic.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -m64 -march=z10 -fPIC" } */
+
+#include "call.h"
+
+/* { dg-final { scan-assembler {brasl\t%r\d+,foo@PLT\n} } } */
+/* { dg-final { scan-assembler {lgrl\t%r2,foo@GOTENT\n} } } */
+
+/* ld is supposed to optimize foostatic@PLT to just foostatic.  */
+/* { dg-final { scan-assembler {brasl\t%r\d+,foostatic@PLT\n} } } */
+/* { dg-final { scan-assembler {larl\t%r2,foostatic@PLT\n} } } */
+
+/* { dg-final { scan-assembler {brasl\t%r\d+,fooweak@PLT\n} } } */
+/* { dg-final { scan-assembler {lgrl\t%r2,fooweak@GOTENT\n} } } */
+
+/* @PLT is not used for data, since it produces R_390_PLT64 relocation.  */
+/* { dg-final { scan-assembler {foos:\n\t.quad\tfoo\n\t.quad\tfoostatic\n\t.quad\tfooweak\n} } } */
diff --git a/gcc/testsuite/gcc.target/s390/call64-z10.c b/gcc/testsuite/gcc.target/s390/call64-z10.c
new file mode 100644
index 00000000000..189feb56754
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/call64-z10.c
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -m64 -march=z10" } */
+
+#include "call.h"
+
+/* { dg-final { scan-assembler {brasl\t%r\d+,foo\n} } } */
+/* { dg-final { scan-assembler {larl\t%r2,foo\n} } } */
+
+/* { dg-final { scan-assembler {brasl\t%r\d+,foostatic\n} } } */
+/* { dg-final { scan-assembler {larl\t%r2,foostatic\n} } } */
+
+/* { dg-final { scan-assembler {brasl\t%r\d+,fooweak\n} } } */
+/* { dg-final { scan-assembler {larl\t%r2,fooweak\n} } } */
+
+/* { dg-final { scan-assembler {foos:\n\t.quad\tfoo\n\t.quad\tfoostatic\n\t.quad\tfooweak\n} } } */
diff --git a/gcc/testsuite/gcc.target/s390/call64-z9-pic-nodatarel.c b/gcc/testsuite/gcc.target/s390/call64-z9-pic-nodatarel.c
new file mode 100644
index 00000000000..4f498981f23
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/call64-z9-pic-nodatarel.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -m64 -march=z9-ec -fPIC -mno-pic-data-is-text-relative" } */
+
+#include "call.h"
+
+/* { dg-final { scan-assembler {brasl\t%r\d+,foo@PLT\n} } } */
+/* { dg-final { scan-assembler {larl\t%r\d+,foo@GOTENT\n} } } */
+
+/* ld is supposed to optimize foostatic@PLT to just foostatic.  */
+/* { dg-final { scan-assembler {brasl\t%r\d+,foostatic@PLT\n} } } */
+/* { dg-final { scan-assembler {larl\t%r2,foostatic@PLT\n} } } */
+
+/* { dg-final { scan-assembler {brasl\t%r\d+,fooweak@PLT\n} } } */
+/* { dg-final { scan-assembler {larl\t%r\d+,fooweak@GOTENT\n} } } */
+
+/* @PLT is not used for data, since it produces R_390_PLT64 relocation.  */
+/* { dg-final { scan-assembler {foos:\n\t.quad\tfoo\n\t.quad\tfoostatic\n\t.quad\tfooweak\n} } } */
diff --git a/gcc/testsuite/gcc.target/s390/call64-z9-pic.c b/gcc/testsuite/gcc.target/s390/call64-z9-pic.c
new file mode 100644
index 00000000000..1652f91e660
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/call64-z9-pic.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -m64 -march=z9-ec -fPIC" } */
+
+#include "call.h"
+
+/* { dg-final { scan-assembler {brasl\t%r\d+,foo@PLT\n} } } */
+/* { dg-final { scan-assembler {larl\t%r\d+,foo@GOTENT\n} } } */
+
+/* ld is supposed to optimize foostatic@PLT to just foostatic.  */
+/* { dg-final { scan-assembler {brasl\t%r\d+,foostatic@PLT\n} } } */
+/* { dg-final { scan-assembler {larl\t%r2,foostatic@PLT\n} } } */
+
+/* { dg-final { scan-assembler {brasl\t%r\d+,fooweak@PLT\n} } } */
+/* { dg-final { scan-assembler {larl\t%r\d+,fooweak@GOTENT\n} } } */
+
+/* @PLT is not used for data, since it produces R_390_PLT64 relocation.  */
+/* { dg-final { scan-assembler {foos:\n\t.quad\tfoo\n\t.quad\tfoostatic\n\t.quad\tfooweak\n} } } */
diff --git a/gcc/testsuite/gcc.target/s390/call64-z9.c b/gcc/testsuite/gcc.target/s390/call64-z9.c
new file mode 100644
index 00000000000..a890bc22dda
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/call64-z9.c
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -m64 -march=z9-ec" } */
+
+#include "call.h"
+
+/* { dg-final { scan-assembler {brasl\t%r\d+,foo\n} } } */
+/* { dg-final { scan-assembler {larl\t%r2,foo\n} } } */
+
+/* { dg-final { scan-assembler {brasl\t%r\d+,foostatic\n} } } */
+/* { dg-final { scan-assembler {larl\t%r2,foostatic\n} } } */
+
+/* { dg-final { scan-assembler {brasl\t%r\d+,fooweak\n} } } */
+/* { dg-final { scan-assembler {larl\t%r2,fooweak\n} } } */
+
+/* { dg-final { scan-assembler {foos:\n\t.quad\tfoo\n\t.quad\tfoostatic\n\t.quad\tfooweak\n} } } */
diff --git a/gcc/testsuite/gcc.target/s390/nodatarel-1.c b/gcc/testsuite/gcc.target/s390/nodatarel-1.c
index f53332f901d..02e64c3eddf 100644
--- a/gcc/testsuite/gcc.target/s390/nodatarel-1.c
+++ b/gcc/testsuite/gcc.target/s390/nodatarel-1.c
@@ -15,12 +15,6 @@ foo ()
   return a;
 }
 
-static int __attribute__((noinline,noclone))
-foostatic (void)
-{
-  return a;
-}
-
 /* Just to make a potentially modified.  */
 
 void
@@ -29,7 +23,7 @@ bar (int b)
   a = b;
 }
 
-/* { dg-final { scan-assembler-times "\\.LANCHOR\\d+@GOTENT" 3 } } */
+/* { dg-final { scan-assembler-times "\\.LANCHOR\\d+@GOTENT" 2 } } */
 
 /* The exrl target is a label_ref which should not be affected at
    all.  */
@@ -63,21 +57,3 @@ fooptr ()
 }
 
 /* { dg-final { scan-assembler-times "foo@GOTENT" 1 } } */
-
-
-/* A static function can be addressed relatively.  */
-
-int
-callfoostatic ()
-{
-  return foostatic ();
-}
-
-void *
-foostaticptr ()
-{
-  return &foostatic;
-}
-
-
-/* { dg-final { scan-assembler-not "foostatic@" } } */
diff --git a/gcc/testsuite/gcc.target/s390/pr80080-4.c b/gcc/testsuite/gcc.target/s390/pr80080-4.c
index 5fc6a558008..3f16a197764 100644
--- a/gcc/testsuite/gcc.target/s390/pr80080-4.c
+++ b/gcc/testsuite/gcc.target/s390/pr80080-4.c
@@ -13,4 +13,4 @@ void foo4(int *mem)
     }
 }
 
-/* { dg-final { scan-assembler {(?n)\n\tlt\t.*\n\tjne\t(\.L\d+)\n(.*\n)*\tcs\t.*\n\tber\t%r14\n\1:\n\tjg\tbar\n} } } */
+/* { dg-final { scan-assembler {(?n)\n\tlt\t.*\n\tjne\t(\.L\d+)\n(.*\n)*\tcs\t.*\n\tber\t%r14\n\1:\n\tjg\tbar(@PLT)?\n} } } */
diff --git a/gcc/testsuite/gcc.target/s390/risbg-ll-3.c b/gcc/testsuite/gcc.target/s390/risbg-ll-3.c
index 864b0d6c417..02f6e046eb9 100644
--- a/gcc/testsuite/gcc.target/s390/risbg-ll-3.c
+++ b/gcc/testsuite/gcc.target/s390/risbg-ll-3.c
@@ -23,7 +23,7 @@ i64 f1 (i64 v_a, i64 v_b)
 extern i64 f2_foo();
 i64 f2 (i64 v_a, i64 v_b)
 {
-/* { dg-final { scan-assembler "f2:\n\trisbg\t%r2,%r3,60,62,0\n\tbner\t%r14\n\tjg\tf2_foo\n" { target { lp64 } } } } */
+/* { dg-final { scan-assembler "f2:\n\trisbg\t%r2,%r3,60,62,0\n\tbner\t%r14\n\tjg\tf2_foo.*\n" { target { lp64 } } } } */
 /* { dg-final { scan-assembler "f2:\n\trisbgn\t%r3,%r2,0,0\\\+32-1,64-0-32\n\trisbg\t%r3,%r5,60,62,0" { target { ! lp64 } } } } */
   i64 v_anda = v_a & -15;
   i64 v_andb = v_b & 14;
@@ -37,8 +37,8 @@ i64 f2 (i64 v_a, i64 v_b)
 void f2_bar ();
 void f2_cconly (i64 v_a, i64 v_b)
 {
-/* { dg-final { scan-assembler "f2_cconly:\n\trisbg\t%r2,%r3,60,62,0\n\tber\t%r14\n\tjg\tf2_bar\n" { target { lp64 } } } } */
-/* { dg-final { scan-assembler "f2_cconly:\n\trisbgn\t%r3,%r2,0,0\\\+32-1,64-0-32\n\trisbg\t%r3,%r5,60,62,0\n\tber\t%r14\n\tjg\tf2_bar\n" { target { ! lp64 } } } } */
+/* { dg-final { scan-assembler "f2_cconly:\n\trisbg\t%r2,%r3,60,62,0\n\tber\t%r14\n\tjg\tf2_bar(@PLT)?\n" { target { lp64 } } } } */
+/* { dg-final { scan-assembler "f2_cconly:\n\trisbgn\t%r3,%r2,0,0\\\+32-1,64-0-32\n\trisbg\t%r3,%r5,60,62,0\n\tber\t%r14\n\tjg\tf2_bar(@PLT)?\n" { target { ! lp64 } } } } */
   if ((v_a & -15) | (v_b & 14))
     f2_bar();
 }
-- 
2.31.1


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2021-06-24 11:18 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-24 11:18 [PATCH] IBM Z: Use @PLT symbols for local functions in 64-bit mode Ilya Leoshkevich

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