On 3/21/12 3:30 PM, Steven Bosscher wrote:
+/* FIXME: Trunk is at GCC 4.8 now and the above problem still hasn't been + addressed properly. This caused PR 52640 due to O(external_decls**2) + lookups in the pending_assemble_externals queue in assemble_external. + Paper over with this pointer set. (And pending_assemble_externals even + was a TREE_LIST before?!) */ +static struct pointer_set_t *pending_assemble_externals_set;
Can you add some description on what this pointer set does?
+ #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. */ @@ -2146,11 +2153,14 @@ void process_pending_assemble_externals (void) { #ifdef ASM_OUTPUT_EXTERNAL - tree list; - for (list = pending_assemble_externals; list; list = TREE_CHAIN (list)) - assemble_external_real (TREE_VALUE (list)); + size_t i; + tree decl; - pending_assemble_externals = 0; + FOR_EACH_VEC_ELT (tree, pending_assemble_externals, i, decl) + assemble_external_real (decl); + VEC_free (tree, gc, pending_assemble_externals);
Just pending_assemble_externals = NULL; OK for all release branches (if they are open for fixes). Diego.