re PR target/80090 (Incorrect assembler - output_addr_const may generate visibility...
authorJohn David Anglin <danglin@gcc.gnu.org>
Wed, 10 May 2017 23:54:58 +0000 (23:54 +0000)
committerJohn David Anglin <danglin@gcc.gnu.org>
Wed, 10 May 2017 23:54:58 +0000 (23:54 +0000)
PR target/80090
* config/pa/pa.c (pa_assemble_integer): When outputting a SYMBOL_REF,
handle calling assemble_external ourself.

From-SVN: r247872

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

index 4483f33ed1fed27ea30c8b2c92e681a39dba696b..4ee565be7b4d1d1d82148f80e5003c682b18220f 100644 (file)
@@ -1,5 +1,9 @@
 2017-05-10  John David Anglin  <danglin@gcc.gnu.org>
 
+       PR target/80090
+       * config/pa/pa.c (pa_assemble_integer): When outputting a SYMBOL_REF,
+       handle calling assemble_external ourself.
+
        PR target/79027
        * config/pa/pa.c (pa_cannot_change_mode_class): Reject changes to/from
        modes with zero size.  Enhance comment.
index 874d12d374110cc21934cc9279779e5936e33397..3e65ba1db59d14bca40f221120dcc0d3735a9f21 100644 (file)
@@ -3299,6 +3299,24 @@ pa_output_64bit_ior (rtx *operands)
 static bool
 pa_assemble_integer (rtx x, unsigned int size, int aligned_p)
 {
+  bool result;
+  tree decl = NULL;
+
+  /* When we have a SYMBOL_REF with a SYMBOL_REF_DECL, we need to call
+     call assemble_external and set the SYMBOL_REF_DECL to NULL before
+     calling output_addr_const.  Otherwise, it may call assemble_external
+     in the midst of outputing the assembler code for the SYMBOL_REF.
+     We restore the SYMBOL_REF_DECL after the output is done.  */
+  if (GET_CODE (x) == SYMBOL_REF)
+    {
+      decl = SYMBOL_REF_DECL (x);
+      if (decl)
+       {
+         assemble_external (decl);
+         SET_SYMBOL_REF_DECL (x, NULL);
+       }
+    }
+
   if (size == UNITS_PER_WORD
       && aligned_p
       && function_label_operand (x, VOIDmode))
@@ -3311,9 +3329,15 @@ pa_assemble_integer (rtx x, unsigned int size, int aligned_p)
 
       output_addr_const (asm_out_file, x);
       fputc ('\n', asm_out_file);
-      return true;
+      result = true;
     }
-  return default_assemble_integer (x, size, aligned_p);
+  else
+    result = default_assemble_integer (x, size, aligned_p);
+
+  if (decl)
+    SET_SYMBOL_REF_DECL (x, decl);
+
+  return result;
 }
 \f
 /* Output an ascii string.  */