Hello, GCC calls free_after_parsing in rest_of_clean_state. That's way too late, it can be done in free_lang_data_in_cgraph instead.
While there, I noticed a silly loop in final.c, and cleaned that up too. Bootstrapped&tested on x86_64-unknown-linux-gnu. OK for trunk? Ciao! Steven * final.c (final): Don't loop to find max_uid. (rest_of_clean_state): Don't call free_after_parsing here. * tree.c (free_lang_data_in_cgraph): Call free_after_parsing here. Index: final.c =================================================================== --- final.c (revision 189423) +++ final.c (working copy) @@ -1826,7 +1826,6 @@ void final (rtx first, FILE *file, int optimize_p) { rtx insn, next; - int max_uid = 0; int seen = 0; /* Used for -dA dump. */ @@ -1837,11 +1836,9 @@ final (rtx first, FILE *file, int optimi last_ignored_compare = 0; +#ifdef HAVE_cc0 for (insn = first; insn; insn = NEXT_INSN (insn)) { - if (INSN_UID (insn) > max_uid) /* Find largest UID. */ - max_uid = INSN_UID (insn); -#ifdef HAVE_cc0 /* If CC tracking across branches is enabled, record the insn which jumps to each branch only reached from one place. */ if (optimize_p && JUMP_P (insn)) @@ -1852,8 +1849,8 @@ final (rtx first, FILE *file, int optimi LABEL_REFS (lab) = insn; } } -#endif } +#endif init_recog (); @@ -4500,7 +4497,6 @@ rest_of_clean_state (void) init_recog_no_volatile (); /* We're done with this function. Free up memory if we can. */ - free_after_parsing (cfun); free_after_compilation (cfun); return 0; } Index: tree.c =================================================================== --- tree.c (revision 189423) +++ tree.c (working copy) @@ -5167,16 +5167,19 @@ assign_assembler_name_if_neeeded (tree t /* Free language specific information for every operand and expression - in every node of the call graph. This process operates in three stages: + in every node of the call graph. This process operates in four stages: - 1- Every callgraph node and varpool node is traversed looking for + 1- Every function is traversed to free any front-end specific + data hung from the function's struct function->language. + + 2- Every callgraph node and varpool node is traversed looking for decls and types embedded in them. This is a more exhaustive search than that done by find_referenced_vars, because it will also collect individual fields, decls embedded in types, etc. - 2- All the decls found are sent to free_lang_data_in_decl. + 3- All the decls found are sent to free_lang_data_in_decl. - 3- All the types found are sent to free_lang_data_in_type. + 4- All the types found are sent to free_lang_data_in_type. The ordering between decls and types is important because free_lang_data_in_decl sets assembler names, which includes @@ -5193,6 +5196,10 @@ free_lang_data_in_cgraph (void) unsigned i; alias_pair *p; + /* Clear out function->language. */ + FOR_EACH_FUNCTION (n) + free_after_parsing (DECL_STRUCT_FUNCTION (n->symbol.decl)); + /* Initialize sets and arrays to store referenced decls and types. */ fld.pset = pointer_set_create (); fld.worklist = NULL;