patches/gcc/4.7.3/100-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
child 3295 db3f7ffabdc8
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
commit 4fa1f8926227d4e79975b674dc4292b9bec4b137
yann@3294
     2
Author: jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
yann@3294
     3
Date:   Thu Mar 6 12:07:07 2014 +0000
yann@3294
     4
yann@3294
     5
    	PR target/58595
yann@3294
     6
    	* config/arm/arm.c (arm_tls_symbol_p): Remove.
yann@3294
     7
    	(arm_legitimize_address): Call legitimize_tls_address for any
yann@3294
     8
    	arm_tls_referenced_p expression, handle constant addend.  Call it
yann@3294
     9
    	before testing for !TARGET_ARM.
yann@3294
    10
    	(thumb_legitimize_address): Don't handle arm_tls_symbol_p here.
yann@3294
    11
    
yann@3294
    12
    	* gcc.dg/tls/pr58595.c: New test.
yann@3294
    13
    
yann@3294
    14
    
yann@3294
    15
    git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@208380 138bc75d-0d04-0410-961f-82ee72b054a4
yann@3294
    16
yann@3294
    17
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
yann@3294
    18
index ce24bfe..af5666b 100644
yann@3294
    19
--- a/gcc/config/arm/arm.c
yann@3294
    20
+++ b/gcc/config/arm/arm.c
yann@3294
    21
@@ -235,7 +235,6 @@ static tree arm_gimplify_va_arg_expr (tree, tree, gimple_seq *, gimple_seq *);
yann@3294
    22
 static void arm_option_override (void);
yann@3294
    23
 static unsigned HOST_WIDE_INT arm_shift_truncation_mask (enum machine_mode);
yann@3294
    24
 static bool arm_cannot_copy_insn_p (rtx);
yann@3294
    25
-static bool arm_tls_symbol_p (rtx x);
yann@3294
    26
 static int arm_issue_rate (void);
yann@3294
    27
 static void arm_output_dwarf_dtprel (FILE *, int, rtx) ATTRIBUTE_UNUSED;
yann@3294
    28
 static bool arm_output_addr_const_extra (FILE *, rtx);
yann@3294
    29
@@ -7336,6 +7335,32 @@ legitimize_tls_address (rtx x, rtx reg)
yann@3294
    30
 rtx
yann@3294
    31
 arm_legitimize_address (rtx x, rtx orig_x, enum machine_mode mode)
yann@3294
    32
 {
yann@3294
    33
+  if (arm_tls_referenced_p (x))
yann@3294
    34
+    {
yann@3294
    35
+      rtx addend = NULL;
yann@3294
    36
+
yann@3294
    37
+      if (GET_CODE (x) == CONST && GET_CODE (XEXP (x, 0)) == PLUS)
yann@3294
    38
+	{
yann@3294
    39
+	  addend = XEXP (XEXP (x, 0), 1);
yann@3294
    40
+	  x = XEXP (XEXP (x, 0), 0);
yann@3294
    41
+	}
yann@3294
    42
+
yann@3294
    43
+      if (GET_CODE (x) != SYMBOL_REF)
yann@3294
    44
+	return x;
yann@3294
    45
+
yann@3294
    46
+      gcc_assert (SYMBOL_REF_TLS_MODEL (x) != 0);
yann@3294
    47
+
yann@3294
    48
+      x = legitimize_tls_address (x, NULL_RTX);
yann@3294
    49
+
yann@3294
    50
+      if (addend)
yann@3294
    51
+	{
yann@3294
    52
+	  x = gen_rtx_PLUS (SImode, x, addend);
yann@3294
    53
+	  orig_x = x;
yann@3294
    54
+	}
yann@3294
    55
+      else
yann@3294
    56
+	return x;
yann@3294
    57
+    }
yann@3294
    58
+
yann@3294
    59
   if (!TARGET_ARM)
yann@3294
    60
     {
yann@3294
    61
       /* TODO: legitimize_address for Thumb2.  */
yann@3294
    62
@@ -7344,9 +7369,6 @@ arm_legitimize_address (rtx x, rtx orig_x, enum machine_mode mode)
yann@3294
    63
       return thumb_legitimize_address (x, orig_x, mode);
yann@3294
    64
     }
yann@3294
    65
 
yann@3294
    66
-  if (arm_tls_symbol_p (x))
yann@3294
    67
-    return legitimize_tls_address (x, NULL_RTX);
yann@3294
    68
-
yann@3294
    69
   if (GET_CODE (x) == PLUS)
yann@3294
    70
     {
yann@3294
    71
       rtx xop0 = XEXP (x, 0);
yann@3294
    72
@@ -7459,9 +7481,6 @@ arm_legitimize_address (rtx x, rtx orig_x, enum machine_mode mode)
yann@3294
    73
 rtx
yann@3294
    74
 thumb_legitimize_address (rtx x, rtx orig_x, enum machine_mode mode)
yann@3294
    75
 {
yann@3294
    76
-  if (arm_tls_symbol_p (x))
yann@3294
    77
-    return legitimize_tls_address (x, NULL_RTX);
yann@3294
    78
-
yann@3294
    79
   if (GET_CODE (x) == PLUS
yann@3294
    80
       && CONST_INT_P (XEXP (x, 1))
yann@3294
    81
       && (INTVAL (XEXP (x, 1)) >= 32 * GET_MODE_SIZE (mode)
yann@3294
    82
@@ -7756,20 +7775,6 @@ thumb_legitimize_reload_address (rtx *x_p,
yann@3294
    83
 
yann@3294
    84
 /* Test for various thread-local symbols.  */
yann@3294
    85
 
yann@3294
    86
-/* Return TRUE if X is a thread-local symbol.  */
yann@3294
    87
-
yann@3294
    88
-static bool
yann@3294
    89
-arm_tls_symbol_p (rtx x)
yann@3294
    90
-{
yann@3294
    91
-  if (! TARGET_HAVE_TLS)
yann@3294
    92
-    return false;
yann@3294
    93
-
yann@3294
    94
-  if (GET_CODE (x) != SYMBOL_REF)
yann@3294
    95
-    return false;
yann@3294
    96
-
yann@3294
    97
-  return SYMBOL_REF_TLS_MODEL (x) != 0;
yann@3294
    98
-}
yann@3294
    99
-
yann@3294
   100
 /* Helper for arm_tls_referenced_p.  */
yann@3294
   101
 
yann@3294
   102
 static int