]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/55709 (Infinite loop in pointer_set_insert compiling cp/pt.c)
authorJohn David Anglin <dave.anglin@nrc-cnrc.gc.ca>
Sun, 16 Dec 2012 17:34:58 +0000 (17:34 +0000)
committerJohn David Anglin <danglin@gcc.gnu.org>
Sun, 16 Dec 2012 17:34:58 +0000 (17:34 +0000)
PR middle-end/55709
Forward port from 4.7 branch:
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.

From-SVN: r194538

gcc/ChangeLog
gcc/varasm.c

index f3583edcbdc5afddc4fba9837495754efb6b9fd0..a64aaec921116098808652efc1d9b9b4d83792f7 100644 (file)
@@ -1,3 +1,15 @@
+2012-12-16  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
+
+       PR middle-end/55709
+       Forward port from 4.7 branch:
+       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-12-16  Eric Botcazou  <ebotcazou@adacore.com>
            Tomash Brechko  <tomash.brechko@gmail.com>
 
index bca852dc4e8cc67adb767980afa7de58db5726fd..daeb6e2a829716684b84f9f343f8ad4fbdbcc623 100644 (file)
@@ -2088,6 +2088,11 @@ contains_pointers_p (tree type)
    it all the way to final.  See PR 17982 for further discussion.  */
 static GTY(()) tree pending_assemble_externals;
 
+/* 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
 /* Avoid O(external_decls**2) lookups in the pending_assemble_externals
    TREE_LIST in assemble_external.  */
@@ -2144,6 +2149,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);