re PR middle-end/52894 (Stage1 bootstrap fails with gcc-4.6.3: Infinite loop in pointer_set_insert)
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: r186296
This commit is contained in:
parent
cee20c6cfb
commit
bc2cd95d1d
|
@ -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
|
||||
|
|
12
gcc/varasm.c
12
gcc/varasm.c
|
@ -2108,6 +2108,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. */
|
||||
|
@ -2160,6 +2165,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
|
||||
}
|
||||
|
@ -2201,6 +2207,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);
|
||||
|
|
Loading…
Reference in New Issue