OSDN Git Service

PR target/50691
authordanglin <danglin@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 29 Oct 2011 15:57:00 +0000 (15:57 +0000)
committerdanglin <danglin@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 29 Oct 2011 15:57:00 +0000 (15:57 +0000)
config/pa/pa.c (emit_move_sequence): Legitimize TLS symbol references.
(pa_legitimate_constant_p): Return false for TLS_MODEL_GLOBAL_DYNAMIC
and TLS_MODEL_LOCAL_DYNAMIC symbol references.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@180655 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/pa/pa.c

index f25b3f0..08687df 100644 (file)
@@ -1,3 +1,10 @@
+2011-10-29  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
+
+       PR target/50691
+       config/pa/pa.c (emit_move_sequence): Legitimize TLS symbol references.
+       (pa_legitimate_constant_p): Return false for TLS_MODEL_GLOBAL_DYNAMIC
+       and TLS_MODEL_LOCAL_DYNAMIC symbol references.
+
 2011-10-29  Georg-Johann Lay  <avr@gjlay.de>
 
        PR target/50887
index 66e3fc7..85ccf89 100644 (file)
@@ -1781,6 +1781,11 @@ emit_move_sequence (rtx *operands, enum machine_mode mode, rtx scratch_reg)
   /* Handle the most common case: storing into a register.  */
   else if (register_operand (operand0, mode))
     {
+      /* Legitimize TLS symbol references.  This happens for references
+        that aren't a legitimate constant.  */
+      if (PA_SYMBOL_REF_TLS_P (operand1))
+       operand1 = legitimize_tls_address (operand1);
+
       if (register_operand (operand1, mode)
          || (GET_CODE (operand1) == CONST_INT
              && cint_ok_for_move (INTVAL (operand1)))
@@ -10271,6 +10276,16 @@ pa_legitimate_constant_p (enum machine_mode mode, rtx x)
   if (!NEW_HP_ASSEMBLER && !TARGET_GAS && GET_CODE (x) == LABEL_REF)
     return false;
 
+  /* TLS_MODEL_GLOBAL_DYNAMIC and TLS_MODEL_LOCAL_DYNAMIC are not
+     legitimate constants.  */
+  if (PA_SYMBOL_REF_TLS_P (x))
+   {
+     enum tls_model model = SYMBOL_REF_TLS_MODEL (x);
+
+     if (model == TLS_MODEL_GLOBAL_DYNAMIC || model == TLS_MODEL_LOCAL_DYNAMIC)
+       return false;
+   }
+
   if (TARGET_64BIT && GET_CODE (x) == CONST_DOUBLE)
     return false;