Blame SOURCES/gcc48-rh1555397.patch

8178f7
2017-06-28  Andreas Krebbel  <krebbel@linux.vnet.ibm.com>
8178f7
8178f7
	* config/s390/predicates.md: Use s390_rel_address_ok_p.
8178f7
	* config/s390/s390-protos.h: Add prototype of
8178f7
	s390_rel_address_ok_p.
8178f7
	* config/s390/s390.c (s390_got_symbol): New function.
8178f7
	(s390_rel_address_ok_p): New function.
8178f7
	(legitimize_pic_address): Use s390_rel_address_ok_p.
8178f7
	(s390_load_got): Use s390_got_symbol.
8178f7
	(s390_option_override): Issue error if
8178f7
	-mno-pic-data-is-text-relative is used without -fpic/-fPIC.
8178f7
	* config/s390/s390.h (TARGET_DEFAULT_PIC_DATA_IS_TEXT_RELATIVE):
8178f7
	New macro.
8178f7
	* config/s390/s390.opt: New option mpic-data-is-text-relative.
8178f7
8178f7
--- gcc/config/s390/predicates.md	2013-08-14 07:55:12.000000000 -0400
8178f7
+++ gcc/config/s390/predicates.md	2018-04-09 21:36:49.428209951 -0400
8178f7
@@ -116,7 +116,7 @@
8178f7
   if (GET_CODE (op) == SYMBOL_REF)
8178f7
     return (!SYMBOL_REF_ALIGN1_P (op)
8178f7
 	    && SYMBOL_REF_TLS_MODEL (op) == 0
8178f7
-	    && (!flag_pic || SYMBOL_REF_LOCAL_P (op)));
8178f7
+	    && s390_rel_address_ok_p (op));
8178f7
 
8178f7
   /* Everything else must have a CONST, so strip it.  */
8178f7
   if (GET_CODE (op) != CONST)
8178f7
@@ -141,7 +141,7 @@
8178f7
   if (GET_CODE (op) == SYMBOL_REF)
8178f7
     return ((SYMBOL_REF_FLAGS (op) & SYMBOL_FLAG_ALIGN1) == 0
8178f7
 	    && SYMBOL_REF_TLS_MODEL (op) == 0
8178f7
-	    && (!flag_pic || SYMBOL_REF_LOCAL_P (op)));
8178f7
+	    && s390_rel_address_ok_p (op));
8178f7
 
8178f7
   /* Now we must have a @GOTENT offset or @PLT stub
8178f7
      or an @INDNTPOFF TLS offset.  */
8178f7
--- gcc/config/s390/s390.c	2015-06-18 10:33:04.000000000 -0400
8178f7
+++ gcc/config/s390/s390.c	2018-04-09 21:32:43.489851529 -0400
8178f7
@@ -491,6 +491,23 @@ s390_label_align (rtx label)
8178f7
   return align_labels_log;
8178f7
 }
8178f7
 
8178f7
+static GTY(()) rtx got_symbol;
8178f7
+
8178f7
+/* Return the GOT table symbol.  The symbol will be created when the
8178f7
+   function is invoked for the first time.  */
8178f7
+
8178f7
+static rtx
8178f7
+s390_got_symbol (void)
8178f7
+{
8178f7
+  if (!got_symbol)
8178f7
+    {
8178f7
+      got_symbol = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
8178f7
+      SYMBOL_REF_FLAGS (got_symbol) = SYMBOL_FLAG_LOCAL;
8178f7
+    }
8178f7
+
8178f7
+  return got_symbol;
8178f7
+}
8178f7
+
8178f7
 static enum machine_mode
8178f7
 s390_libgcc_cmp_return_mode (void)
8178f7
 {
8178f7
@@ -1863,6 +1880,9 @@ s390_option_override (void)
8178f7
   if (flag_prefetch_loop_arrays < 0 && HAVE_prefetch && optimize >= 3)
8178f7
     flag_prefetch_loop_arrays = 1;
8178f7
 
8178f7
+  if (!s390_pic_data_is_text_relative && !flag_pic)
8178f7
+    error ("-mno-pic-data-is-text-relative cannot be used without -fpic/-fPIC");
8178f7
+
8178f7
   /* Use the alternative scheduling-pressure algorithm by default.  */
8178f7
   maybe_set_param_value (PARAM_SCHED_PRESSURE_ALGORITHM, 2,
8178f7
                          global_options.x_param_values,
8178f7
@@ -3557,6 +3577,26 @@ s390_load_address (rtx dst, rtx src)
8178f7
     emit_insn (gen_force_la_31 (dst, src));
8178f7
 }
8178f7
 
8178f7
+/* Return true if it ok to use SYMBOL_REF in a relative address.  */
8178f7
+
8178f7
+bool
8178f7
+s390_rel_address_ok_p (rtx symbol_ref)
8178f7
+{
8178f7
+  tree decl;
8178f7
+
8178f7
+  if (symbol_ref == s390_got_symbol () || CONSTANT_POOL_ADDRESS_P (symbol_ref))
8178f7
+    return true;
8178f7
+
8178f7
+  decl = SYMBOL_REF_DECL (symbol_ref);
8178f7
+
8178f7
+  if (!flag_pic || SYMBOL_REF_LOCAL_P (symbol_ref))
8178f7
+    return (s390_pic_data_is_text_relative
8178f7
+	    || (decl
8178f7
+		&& TREE_CODE (decl) == FUNCTION_DECL));
8178f7
+
8178f7
+  return false;
8178f7
+}
8178f7
+
8178f7
 /* Return a legitimate reference for ORIG (an address) using the
8178f7
    register REG.  If REG is 0, a new pseudo is generated.
8178f7
 
8178f7
@@ -3594,7 +3634,7 @@ legitimize_pic_address (rtx orig, rtx re
8178f7
     }
8178f7
 
8178f7
   if ((GET_CODE (addr) == LABEL_REF
8178f7
-       || (GET_CODE (addr) == SYMBOL_REF && SYMBOL_REF_LOCAL_P (addr))
8178f7
+       || (GET_CODE (addr) == SYMBOL_REF && s390_rel_address_ok_p (addr))
8178f7
        || (GET_CODE (addr) == UNSPEC &&
8178f7
 	   (XINT (addr, 1) == UNSPEC_GOTENT
8178f7
 	    || (TARGET_CPU_ZARCH && XINT (addr, 1) == UNSPEC_PLT))))
8178f7
@@ -8545,7 +8585,6 @@ restore_gprs (rtx base, int offset, int
8178f7
 
8178f7
 /* Return insn sequence to load the GOT register.  */
8178f7
 
8178f7
-static GTY(()) rtx got_symbol;
8178f7
 rtx
8178f7
 s390_load_got (void)
8178f7
 {
8178f7
@@ -8557,23 +8596,17 @@ s390_load_got (void)
8178f7
      aren't usable.  */
8178f7
   rtx got_rtx = gen_rtx_REG (Pmode, 12);
8178f7
 
8178f7
-  if (!got_symbol)
8178f7
-    {
8178f7
-      got_symbol = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
8178f7
-      SYMBOL_REF_FLAGS (got_symbol) = SYMBOL_FLAG_LOCAL;
8178f7
-    }
8178f7
-
8178f7
   start_sequence ();
8178f7
 
8178f7
   if (TARGET_CPU_ZARCH)
8178f7
     {
8178f7
-      emit_move_insn (got_rtx, got_symbol);
8178f7
+      emit_move_insn (got_rtx, s390_got_symbol ());
8178f7
     }
8178f7
   else
8178f7
     {
8178f7
       rtx offset;
8178f7
 
8178f7
-      offset = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, got_symbol),
8178f7
+      offset = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, s390_got_symbol ()),
8178f7
 			       UNSPEC_LTREL_OFFSET);
8178f7
       offset = gen_rtx_CONST (Pmode, offset);
8178f7
       offset = force_const_mem (Pmode, offset);
8178f7
--- gcc/config/s390/s390.h	2014-01-14 10:37:03.000000000 -0500
8178f7
+++ gcc/config/s390/s390.h	2018-04-09 21:21:28.076858052 -0400
8178f7
@@ -814,6 +814,10 @@ do {									\
8178f7
 
8178f7
 #define LEGITIMATE_PIC_OPERAND_P(X)  legitimate_pic_operand_p (X)
8178f7
 
8178f7
+#ifndef TARGET_DEFAULT_PIC_DATA_IS_TEXT_RELATIVE
8178f7
+#define TARGET_DEFAULT_PIC_DATA_IS_TEXT_RELATIVE 1
8178f7
+#endif
8178f7
+
8178f7
 
8178f7
 /* Assembler file format.  */
8178f7
 
8178f7
--- gcc/config/s390/s390.opt	2015-06-18 10:33:05.000000000 -0400
8178f7
+++ gcc/config/s390/s390.opt	2018-04-09 21:28:18.842465842 -0400
8178f7
@@ -158,6 +158,10 @@ mzarch
8178f7
 Target Report RejectNegative Negative(mesa) Mask(ZARCH)
8178f7
 z/Architecture
8178f7
 
8178f7
+mpic-data-is-text-relative
8178f7
+Target Report Var(s390_pic_data_is_text_relative) Init(TARGET_DEFAULT_PIC_DATA_IS_TEXT_RELATIVE)
8178f7
+Assume data segments are relative to text segment.
8178f7
+
8178f7
 mbranch-cost=
8178f7
 Target Report Joined RejectNegative UInteger Var(s390_branch_cost) Init(1)
8178f7
 Set the branch costs for conditional branch instructions.  Reasonable
8178f7
--- gcc/config/s390/s390-protos.h	2014-01-14 10:37:04.000000000 -0500
8178f7
+++ gcc/config/s390/s390-protos.h	2018-04-09 21:21:28.072858046 -0400
8178f7
@@ -52,6 +52,7 @@ extern bool s390_contiguous_bitmask_p (u
8178f7
 extern bool s390_split_ok_p (rtx, rtx, enum machine_mode, int);
8178f7
 extern bool s390_overlap_p (rtx, rtx, HOST_WIDE_INT);
8178f7
 extern bool s390_offset_p (rtx, rtx, rtx);
8178f7
+extern bool s390_rel_address_ok_p (rtx);
8178f7
 extern int tls_symbolic_operand (rtx);
8178f7
 
8178f7
 extern bool s390_match_ccmode (rtx, enum machine_mode);
8178f7
--- gcc/testsuite/gcc.target/s390/nodatarel-1.c	1969-12-31 19:00:00.000000000 -0500
8178f7
+++ gcc/testsuite/gcc.target/s390/nodatarel-1.c	2018-04-09 21:21:28.077858053 -0400
8178f7
@@ -0,0 +1,83 @@
8178f7
+/* Test -mno-pic-data-is-text-relative option.  No relative addressing
8178f7
+   of elements in .data and .bss are allowed with that option.  */
8178f7
+
8178f7
+/* { dg-do compile } */
8178f7
+/* { dg-options "-O3 -fno-optimize-sibling-calls -fpic -mno-pic-data-is-text-relative -march=z10 -mtune=z9-109 -mzarch" } */
8178f7
+
8178f7
+static int a = 3;
8178f7
+
8178f7
+/* With -mno-pic-data-is-text-relative these must be addressed via
8178f7
+   GOT.  */
8178f7
+
8178f7
+int __attribute__((noinline,noclone))
8178f7
+foo ()
8178f7
+{
8178f7
+  return a;
8178f7
+}
8178f7
+
8178f7
+static int __attribute__((noinline,noclone))
8178f7
+foostatic (void)
8178f7
+{
8178f7
+  return a;
8178f7
+}
8178f7
+
8178f7
+/* Just to make a potentially modified.  */
8178f7
+
8178f7
+void
8178f7
+bar (int b)
8178f7
+{
8178f7
+  a = b;
8178f7
+}
8178f7
+
8178f7
+/* { dg-final { scan-assembler-times "a@GOTENT" 3 } } */
8178f7
+
8178f7
+/* The exrl target is a label_ref which should not be affected at
8178f7
+   all.  */
8178f7
+
8178f7
+void
8178f7
+mymemcpy (char *dst, char *src, long size)
8178f7
+{
8178f7
+  __builtin_memcpy (dst, src, size);
8178f7
+}
8178f7
+
8178f7
+/* { dg-final { scan-assembler "exrl" } } */
8178f7
+
8178f7
+
8178f7
+/* PLT slots can still be addressed relatively.  */
8178f7
+
8178f7
+int
8178f7
+callfoo ()
8178f7
+{
8178f7
+  return foo ();
8178f7
+}
8178f7
+
8178f7
+/* { dg-final { scan-assembler-times "foo@PLT" 1 } } */
8178f7
+
8178f7
+
8178f7
+/* GOT entries can still be addressed relatively.  */
8178f7
+
8178f7
+void *
8178f7
+fooptr ()
8178f7
+{
8178f7
+  return &foo;
8178f7
+}
8178f7
+
8178f7
+/* { dg-final { scan-assembler-times "foo@GOTENT" 1 } } */
8178f7
+
8178f7
+
8178f7
+/* A static function can be addressed relatively.  */
8178f7
+
8178f7
+int
8178f7
+callfoostatic ()
8178f7
+{
8178f7
+  return foostatic ();
8178f7
+}
8178f7
+
8178f7
+void *
8178f7
+foostaticptr ()
8178f7
+{
8178f7
+  return &foostatic;
8178f7
+}
8178f7
+
8178f7
+
8178f7
+/* { dg-final { scan-assembler-not "foostatic@" } } */