Commit 61802098 by John David Anglin Committed by John David Anglin

re PR middle-end/55709 (Infinite loop in pointer_set_insert compiling cp/pt.c)

	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
parent df0b360e
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> 2012-12-16 Eric Botcazou <ebotcazou@adacore.com>
Tomash Brechko <tomash.brechko@gmail.com> Tomash Brechko <tomash.brechko@gmail.com>
...@@ -2088,6 +2088,11 @@ contains_pointers_p (tree type) ...@@ -2088,6 +2088,11 @@ contains_pointers_p (tree type)
it all the way to final. See PR 17982 for further discussion. */ it all the way to final. See PR 17982 for further discussion. */
static GTY(()) tree pending_assemble_externals; 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 #ifdef ASM_OUTPUT_EXTERNAL
/* Avoid O(external_decls**2) lookups in the pending_assemble_externals /* Avoid O(external_decls**2) lookups in the pending_assemble_externals
TREE_LIST in assemble_external. */ TREE_LIST in assemble_external. */
...@@ -2144,6 +2149,7 @@ process_pending_assemble_externals (void) ...@@ -2144,6 +2149,7 @@ process_pending_assemble_externals (void)
assemble_external_real (TREE_VALUE (list)); assemble_external_real (TREE_VALUE (list));
pending_assemble_externals = 0; pending_assemble_externals = 0;
pending_assemble_externals_processed = true;
pointer_set_destroy (pending_assemble_externals_set); pointer_set_destroy (pending_assemble_externals_set);
#endif #endif
} }
...@@ -2196,6 +2202,12 @@ assemble_external (tree decl ATTRIBUTE_UNUSED) ...@@ -2196,6 +2202,12 @@ assemble_external (tree decl ATTRIBUTE_UNUSED)
weak_decls = tree_cons (NULL, decl, weak_decls); weak_decls = tree_cons (NULL, decl, weak_decls);
#ifdef ASM_OUTPUT_EXTERNAL #ifdef ASM_OUTPUT_EXTERNAL
if (pending_assemble_externals_processed)
{
assemble_external_real (decl);
return;
}
if (! pointer_set_insert (pending_assemble_externals_set, decl)) if (! pointer_set_insert (pending_assemble_externals_set, decl))
pending_assemble_externals = tree_cons (NULL, decl, pending_assemble_externals = tree_cons (NULL, decl,
pending_assemble_externals); pending_assemble_externals);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment