diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-07-31 22:54:30 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-07-31 22:54:30 +0000 |
commit | 4d28bf12f9c314291869078863c878233c2924c1 (patch) | |
tree | d620416f806e0e6c3fdc1389e8fcef7fcd7d86e5 | |
parent | a283c1dda0fe9dd9bf191bcf45d468b711447b4c (diff) | |
download | gcc-4d28bf12f9c314291869078863c878233c2924c1.tar.gz |
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@70022 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 26 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tls/opt-7.c | 13 |
4 files changed, 39 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 87ce37ab103..d05ba369e74 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 22c495f443b..7b1a39bf4d6 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 52389e6bdb3..9299dde54e8 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 00000000000..beb2c2622d4 --- /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-*-* } } } */ |