[patch] Call free_after_parsing earlier
Steven Bosscher
stevenb.gcc@gmail.com
Wed Jul 11 19:40:00 GMT 2012
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;
More information about the Gcc-patches
mailing list