]> 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>
Wed, 11 Apr 2012 04:18:40 +0000 (04:18 +0000)
committerJohn David Anglin <danglin@gcc.gnu.org>
Wed, 11 Apr 2012 04:18:40 +0000 (04:18 +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: r186302

gcc/ChangeLog
gcc/varasm.c

index 05179e9f7c353af4332d7d02f73a39cafe650783..66c627f08b80d27e88d9046a9b530d4ce0d0ba08 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 e18606a3e22eb59a08fc6d6184bf8388342c49c3..835b74f721dc6fac1c2726887ba304d9c6c9f1ab 100644 (file)
@@ -2311,6 +2311,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.  */
@@ -2360,6 +2365,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
 }
@@ -2401,6 +2407,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);