The attached patch fixes a regression introduced on the trunk to
fix PR middle-end/52640.  The fix was previously applied to the 4.6
and 4.7 branches.

Tested on hppa-unknown-linux-gnu with full bootstrap.

OK for trunk?

Dave
-- 
J. David Anglin                                  dave.ang...@nrc-cnrc.gc.ca
National Research Council of Canada              (613) 990-0752 (FAX: 952-6602)

2012-12-16  John David Anglin  <dave.ang...@nrc-cnrc.gc.ca>

        PR middle-end/55709
        Forward port from 4.7 branch:
        2012-04-10  John David Anglin  <dave.ang...@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.

Index: varasm.c
===================================================================
--- varasm.c    (revision 194441)
+++ varasm.c    (working copy)
@@ -2088,6 +2088,11 @@
    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 @@
     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 @@
     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);

Reply via email to