patches/gcc/4.8.2/110-fix-PR-target-58595.patch
author "Yann E. MORIN" <yann.morin.1998@free.fr>
Thu Apr 17 18:17:12 2014 +0200 (2014-04-17)
changeset 3294 c65fcf8a34b7
permissions -rw-r--r--
cc/gcc: add some bug fixes to gcc 4.7.3 and 4.8.2

Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
yann@3294
     1
Backport fix for PR target/58595
yann@3294
     2
yann@3294
     3
From: jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
yann@3294
     4
Date: Thu, 6 Mar 2014 12:07:07 +0000
yann@3294
     5
Subject: [PATCH] 	PR target/58595 	* config/arm/arm.c
yann@3294
     6
 (arm_tls_symbol_p): Remove. 	(arm_legitimize_address): Call
yann@3294
     7
 legitimize_tls_address for any 	arm_tls_referenced_p expression,
yann@3294
     8
 handle constant addend.  Call it 	before testing for !TARGET_ARM. 
yann@3294
     9
 (thumb_legitimize_address): Don't handle arm_tls_symbol_p here.
yann@3294
    10
yann@3294
    11
	* gcc.dg/tls/pr58595.c: New test.
yann@3294
    12
yann@3294
    13
yann@3294
    14
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@208380 138bc75d-0d04-0410-961f-82ee72b054a4
yann@3294
    15
yann@3294
    16
Index: gcc-4.8.2/gcc/config/arm/arm.c
yann@3294
    17
===================================================================
yann@3294
    18
--- gcc-4.8.2.orig/gcc/config/arm/arm.c
yann@3294
    19
+++ gcc-4.8.2/gcc/config/arm/arm.c
yann@3294
    20
@@ -230,7 +230,6 @@ static tree arm_gimplify_va_arg_expr (tr
yann@3294
    21
 static void arm_option_override (void);
yann@3294
    22
 static unsigned HOST_WIDE_INT arm_shift_truncation_mask (enum machine_mode);
yann@3294
    23
 static bool arm_cannot_copy_insn_p (rtx);
yann@3294
    24
-static bool arm_tls_symbol_p (rtx x);
yann@3294
    25
 static int arm_issue_rate (void);
yann@3294
    26
 static void arm_output_dwarf_dtprel (FILE *, int, rtx) ATTRIBUTE_UNUSED;
yann@3294
    27
 static bool arm_output_addr_const_extra (FILE *, rtx);
yann@3294
    28
@@ -6573,6 +6572,32 @@ legitimize_tls_address (rtx x, rtx reg)
yann@3294
    29
 rtx
yann@3294
    30
 arm_legitimize_address (rtx x, rtx orig_x, enum machine_mode mode)
yann@3294
    31
 {
yann@3294
    32
+  if (arm_tls_referenced_p (x))
yann@3294
    33
+    {
yann@3294
    34
+      rtx addend = NULL;
yann@3294
    35
+
yann@3294
    36
+      if (GET_CODE (x) == CONST && GET_CODE (XEXP (x, 0)) == PLUS)
yann@3294
    37
+	{
yann@3294
    38
+	  addend = XEXP (XEXP (x, 0), 1);
yann@3294
    39
+	  x = XEXP (XEXP (x, 0), 0);
yann@3294
    40
+	}
yann@3294
    41
+
yann@3294
    42
+      if (GET_CODE (x) != SYMBOL_REF)
yann@3294
    43
+	return x;
yann@3294
    44
+
yann@3294
    45
+      gcc_assert (SYMBOL_REF_TLS_MODEL (x) != 0);
yann@3294
    46
+
yann@3294
    47
+      x = legitimize_tls_address (x, NULL_RTX);
yann@3294
    48
+
yann@3294
    49
+      if (addend)
yann@3294
    50
+	{
yann@3294
    51
+	  x = gen_rtx_PLUS (SImode, x, addend);
yann@3294
    52
+	  orig_x = x;
yann@3294
    53
+	}
yann@3294
    54
+      else
yann@3294
    55
+	return x;
yann@3294
    56
+    }
yann@3294
    57
+
yann@3294
    58
   if (!TARGET_ARM)
yann@3294
    59
     {
yann@3294
    60
       /* TODO: legitimize_address for Thumb2.  */
yann@3294
    61
@@ -6581,9 +6606,6 @@ arm_legitimize_address (rtx x, rtx orig_
yann@3294
    62
       return thumb_legitimize_address (x, orig_x, mode);
yann@3294
    63
     }
yann@3294
    64
 
yann@3294
    65
-  if (arm_tls_symbol_p (x))
yann@3294
    66
-    return legitimize_tls_address (x, NULL_RTX);
yann@3294
    67
-
yann@3294
    68
   if (GET_CODE (x) == PLUS)
yann@3294
    69
     {
yann@3294
    70
       rtx xop0 = XEXP (x, 0);
yann@3294
    71
@@ -6695,9 +6717,6 @@ arm_legitimize_address (rtx x, rtx orig_
yann@3294
    72
 rtx
yann@3294
    73
 thumb_legitimize_address (rtx x, rtx orig_x, enum machine_mode mode)
yann@3294
    74
 {
yann@3294
    75
-  if (arm_tls_symbol_p (x))
yann@3294
    76
-    return legitimize_tls_address (x, NULL_RTX);
yann@3294
    77
-
yann@3294
    78
   if (GET_CODE (x) == PLUS
yann@3294
    79
       && CONST_INT_P (XEXP (x, 1))
yann@3294
    80
       && (INTVAL (XEXP (x, 1)) >= 32 * GET_MODE_SIZE (mode)
yann@3294
    81
@@ -6988,20 +7007,6 @@ thumb_legitimize_reload_address (rtx *x_
yann@3294
    82
 
yann@3294
    83
 /* Test for various thread-local symbols.  */
yann@3294
    84
 
yann@3294
    85
-/* Return TRUE if X is a thread-local symbol.  */
yann@3294
    86
-
yann@3294
    87
-static bool
yann@3294
    88
-arm_tls_symbol_p (rtx x)
yann@3294
    89
-{
yann@3294
    90
-  if (! TARGET_HAVE_TLS)
yann@3294
    91
-    return false;
yann@3294
    92
-
yann@3294
    93
-  if (GET_CODE (x) != SYMBOL_REF)
yann@3294
    94
-    return false;
yann@3294
    95
-
yann@3294
    96
-  return SYMBOL_REF_TLS_MODEL (x) != 0;
yann@3294
    97
-}
yann@3294
    98
-
yann@3294
    99
 /* Helper for arm_tls_referenced_p.  */
yann@3294
   100
 
yann@3294
   101
 static int