]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
i386.c (legitimate_pic_address_disp_p): Disallow TLS SYMBOL_REFs not inside UNSPEC...
authorJakub Jelinek <jakub@redhat.com>
Thu, 31 Jul 2003 22:54:30 +0000 (00:54 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 31 Jul 2003 22:54:30 +0000 (00:54 +0200)
* 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

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tls/opt-7.c [new file with mode: 0644]

index 87ce37ab1032a198e2ed48a852ecf8a6f53c8718..d05ba369e74b0dac64cedcd92fefebd805242898 100644 (file)
@@ -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.
index 22c495f443b388fd121d9bb6bbf1fbb3ce57ae6d..7b1a39bf4d622034a1bf7db4ce6892248c1c8ff0 100644 (file)
@@ -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;
index 52389e6bdb3dc3f9ae17f29cc448e7110d3b986b..9299dde54e8a02fb59ea6f25c00d5d8a1d257f49 100644 (file)
@@ -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 (file)
index 0000000..beb2c26
--- /dev/null
@@ -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-*-* } } } */