]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/52894 (Stage1 bootstrap fails with gcc-4.6.3: Infinite loop in point...
authorJohn David Anglin <dave.anglin@nrc-cnrc.gc.ca>
Tue, 10 Apr 2012 22:13:52 +0000 (22:13 +0000)
committerJohn David Anglin <danglin@gcc.gnu.org>
Tue, 10 Apr 2012 22:13:52 +0000 (22:13 +0000)
PR middle-end/52894
* varasm.c (process_pending_assemble_externals): Set
pending_assemble_externals_processed true.
(assemble_external): Call assemble_external_real if the pending
assemble externals have been processed.

From-SVN: r186297

gcc/ChangeLog
gcc/varasm.c

index f8973e5ca1cae09286f2d245368f2a0bf1d25edc..86e2427facb5f6e3fd10f06542d144614e5726f4 100644 (file)
@@ -1,3 +1,11 @@
+2012-04-10  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
+
+       PR middle-end/52894
+       * varasm.c (process_pending_assemble_externals): Set
+       pending_assemble_externals_processed true.
+       (assemble_external): Call assemble_external_real if the pending
+       assemble externals have been processed.
+
 2012-04-09  Eric Botcazou  <ebotcazou@adacore.com>
 
        PR target/52717
index 3f55cb882fcec8917294320448a7d8882bcff698..d9748887d893298ff7d79367d01675e7927ceeab 100644 (file)
@@ -2106,6 +2106,11 @@ static GTY(()) tree pending_assemble_externals;
    the entire pending_assemble_externals list.  See assemble_external().  */
 static struct pointer_set_t *pending_assemble_externals_set;
 
+/* Some targets delay some output to final using TARGET_ASM_FILE_END.
+   As a result, assemble_external can be called after the list of externals
+   is processed and the pointer set destroyed.  */
+static bool pending_assemble_externals_processed;
+
 #ifdef ASM_OUTPUT_EXTERNAL
 /* True if DECL is a function decl for which no out-of-line copy exists.
    It is assumed that DECL's assembler name has been set.  */
@@ -2155,6 +2160,7 @@ process_pending_assemble_externals (void)
     assemble_external_real (TREE_VALUE (list));
 
   pending_assemble_externals = 0;
+  pending_assemble_externals_processed = true;
   pointer_set_destroy (pending_assemble_externals_set);
 #endif
 }
@@ -2196,6 +2202,12 @@ assemble_external (tree decl ATTRIBUTE_UNUSED)
     weak_decls = tree_cons (NULL, decl, weak_decls);
 
 #ifdef ASM_OUTPUT_EXTERNAL
+  if (pending_assemble_externals_processed)
+    {
+      assemble_external_real (decl);
+      return;
+    }
+
   if (! pointer_set_insert (pending_assemble_externals_set, decl))
     pending_assemble_externals = tree_cons (NULL, decl,
                                            pending_assemble_externals);