From: John David Anglin Date: Wed, 11 Apr 2012 04:18:40 +0000 (+0000) Subject: re PR middle-end/52894 (Stage1 bootstrap fails with gcc-4.6.3: Infinite loop in point... X-Git-Tag: releases/gcc-4.5.4~145 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=584131deeb10444d57a0e21585e5ed81ac7b897c;p=thirdparty%2Fgcc.git 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: r186302 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 05179e9f7c35..66c627f08b80 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2012-04-10 John David Anglin + + 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 PR target/52717 diff --git a/gcc/varasm.c b/gcc/varasm.c index e18606a3e22e..835b74f721dc 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -2311,6 +2311,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. */ @@ -2360,6 +2365,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 } @@ -2401,6 +2407,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);