[PATCH] Fix Infinite loop in pointer_set_insert

2012-12-16 Thread John David Anglin
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);


Re: [PATCH] Fix Infinite loop in pointer_set_insert

2012-12-16 Thread Richard Biener
On Sun, Dec 16, 2012 at 5:33 PM, John David Anglin
d...@hiauly1.hia.nrc.ca wrote:
 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?

Ok.

Thanks,
Richard.

 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);


Re: [PATCH] Fix Infinite loop in pointer_set_insert

2012-12-16 Thread Dominique Dhumieres
 The attached patch fixes a regression introduced on the trunk to ...

This breaks bootstrap on x86_64-apple-darwin10:

../../work/gcc/varasm.c:2094:13: error: 'pending_assemble_externals_processed' 
defined but not used [-Werror=unused-variable]
 static bool pending_assemble_externals_processed;

I fixed it by moving

+/* 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;
+

after

 #ifdef ASM_OUTPUT_EXTERNAL

instead of having it before.

TIA

Dominique