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
|