aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2003-08-01 00:54:30 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2003-08-01 00:54:30 +0200
commita132b6a818c35da81002527bfc680e8eea3f24a8 (patch)
treed620416f806e0e6c3fdc1389e8fcef7fcd7d86e5 /gcc
parentd759e96dc14e97cea6d4ded004e17446b3fd9c1c (diff)
downloadgcc-a132b6a818c35da81002527bfc680e8eea3f24a8.zip
gcc-a132b6a818c35da81002527bfc680e8eea3f24a8.tar.gz
gcc-a132b6a818c35da81002527bfc680e8eea3f24a8.tar.bz2
i386.c (legitimate_pic_address_disp_p): Disallow TLS SYMBOL_REFs not inside UNSPEC even in PLUS rtx.
* config/i386/i386.c (legitimate_pic_address_disp_p): Disallow TLS SYMBOL_REFs not inside UNSPEC even in PLUS rtx. * gcc.dg/tls/opt-7.c: New test. From-SVN: r70022
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/i386/i386.c26
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/tls/opt-7.c13
4 files changed, 39 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 87ce37a..d05ba36 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2003-07-31 Jakub Jelinek <jakub@redhat.com>
+
+ * config/i386/i386.c (legitimate_pic_address_disp_p): Disallow TLS
+ SYMBOL_REFs not inside UNSPEC even in PLUS rtx.
+
2003-07-31 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* dwarf2out.c (loc_descriptor_from_tree, case CONSTRUCTOR): New case.
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 22c495f..7b1a39b 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -5661,15 +5661,23 @@ legitimate_pic_address_disp_p (register rtx disp)
if (GET_CODE (disp) == LABEL_REF)
return 1;
if (GET_CODE (disp) == CONST
- && GET_CODE (XEXP (disp, 0)) == PLUS
- && ((GET_CODE (XEXP (XEXP (disp, 0), 0)) == SYMBOL_REF
- && ix86_cmodel == CM_SMALL_PIC
- && SYMBOL_REF_LOCAL_P (XEXP (XEXP (disp, 0), 0)))
- || GET_CODE (XEXP (XEXP (disp, 0), 0)) == LABEL_REF)
- && GET_CODE (XEXP (XEXP (disp, 0), 1)) == CONST_INT
- && INTVAL (XEXP (XEXP (disp, 0), 1)) < 16*1024*1024
- && INTVAL (XEXP (XEXP (disp, 0), 1)) >= -16*1024*1024)
- return 1;
+ && GET_CODE (XEXP (disp, 0)) == PLUS)
+ {
+ rtx op0 = XEXP (XEXP (disp, 0), 0);
+ rtx op1 = XEXP (XEXP (disp, 0), 1);
+
+ /* TLS references should always be enclosed in UNSPEC. */
+ if (tls_symbolic_operand (op0, GET_MODE (op0)))
+ return 0;
+ if (((GET_CODE (op0) == SYMBOL_REF
+ && ix86_cmodel == CM_SMALL_PIC
+ && SYMBOL_REF_LOCAL_P (op0))
+ || GET_CODE (op0) == LABEL_REF)
+ && GET_CODE (op1) == CONST_INT
+ && INTVAL (op1) < 16*1024*1024
+ && INTVAL (op1) >= -16*1024*1024)
+ return 1;
+ }
}
if (GET_CODE (disp) != CONST)
return 0;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 52389e6..9299dde 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2003-07-31 Jakub Jelinek <jakub@redhat.com>
+
+ * gcc.dg/tls/opt-7.c: New test.
+
2003-07-31 Andrew Pinski <pinskia@physics.uc.edu>
* g++.old-deja/g++.other/crash18.C: Remove.
diff --git a/gcc/testsuite/gcc.dg/tls/opt-7.c b/gcc/testsuite/gcc.dg/tls/opt-7.c
new file mode 100644
index 0000000..beb2c26
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tls/opt-7.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fPIC" } */
+
+static __thread void *baz [4] __attribute__((tls_model ("initial-exec")));
+void foo (void)
+{
+ void **u = (void **) baz;
+
+ u[0] = 0;
+ u[1] = 0;
+}
+
+/* { dg-final { scan-assembler-not "\[48\]\\+baz" { target i?86-*-* x86_64-*-* } } } */