From 5f74a0740ef4284ab6d53f079fa304a253abd759 Mon Sep 17 00:00:00 2001 From: hubicka Date: Fri, 30 Aug 2013 07:33:06 +0000 Subject: [PATCH] * lto-symtab.c (lto_cgraph_replace_node): Free decl_in_state. * cgraph.c (cgraph_release_function_body): Free decl_in_state. * lto-section-in.c (lto_free_function_in_decl_state): New function. (lto_free_function_in_decl_state_for_node): New function. * lto.c (read_cgraph_and_symbols): Remove ggc_collect; clear section node; add comment why we do not collect. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@202093 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cgraph.c | 5 ++++- gcc/lto-section-in.c | 35 +++++++++++++++++++++++++++++++++++ gcc/lto-symtab.c | 2 ++ gcc/lto/ChangeLog | 4 ++++ gcc/lto/lto.c | 3 +++ 5 files changed, 48 insertions(+), 1 deletion(-) diff --git a/gcc/cgraph.c b/gcc/cgraph.c index 063c5245fef..feb17bb0dd9 100644 --- a/gcc/cgraph.c +++ b/gcc/cgraph.c @@ -1663,6 +1663,8 @@ cgraph_release_function_body (struct cgraph_node *node) if (!node->used_as_abstract_origin && DECL_INITIAL (node->symbol.decl)) DECL_INITIAL (node->symbol.decl) = error_mark_node; release_function_body (node->symbol.decl); + if (node->symbol.lto_file_data) + lto_free_function_in_decl_state_for_node ((symtab_node) node); } /* Remove the node from cgraph. */ @@ -3107,10 +3109,11 @@ cgraph_get_body (struct cgraph_node *node) gcc_assert (DECL_STRUCT_FUNCTION (decl) == NULL); - lto_input_function_body (file_data, decl, data); + lto_input_function_body (file_data, node->symbol.decl, data); lto_stats.num_function_bodies++; lto_free_section_data (file_data, LTO_section_function_body, name, data, len); + lto_free_function_in_decl_state_for_node ((symtab_node) node); return true; } diff --git a/gcc/lto-section-in.c b/gcc/lto-section-in.c index 0ef421f6167..5821030d4cf 100644 --- a/gcc/lto-section-in.c +++ b/gcc/lto-section-in.c @@ -414,6 +414,41 @@ lto_get_function_in_decl_state (struct lto_file_decl_data *file_data, return slot? ((struct lto_in_decl_state*) *slot) : NULL; } +/* Free decl_states. */ + +void +lto_free_function_in_decl_state (struct lto_in_decl_state *state) +{ + int i; + for (i = 0; i < LTO_N_DECL_STREAMS; i++) + ggc_free (state->streams[i].trees); + ggc_free (state); +} + +/* Free decl_states associated with NODE. This makes it possible to furhter + release trees needed by the NODE's body. */ + +void +lto_free_function_in_decl_state_for_node (symtab_node node) +{ + struct lto_in_decl_state temp; + void **slot; + + if (!node->symbol.lto_file_data) + return; + + temp.fn_decl = node->symbol.decl; + slot = htab_find_slot (node->symbol.lto_file_data->function_decl_states, + &temp, NO_INSERT); + if (slot && *slot) + { + lto_free_function_in_decl_state ((struct lto_in_decl_state*) *slot); + htab_clear_slot (node->symbol.lto_file_data->function_decl_states, + slot); + } + node->symbol.lto_file_data = NULL; +} + /* Report read pass end of the section. */ diff --git a/gcc/lto-symtab.c b/gcc/lto-symtab.c index 9bebd09c832..7c2add7232a 100644 --- a/gcc/lto-symtab.c +++ b/gcc/lto-symtab.c @@ -80,6 +80,8 @@ lto_cgraph_replace_node (struct cgraph_node *node, /* Redirect incomming references. */ ipa_clone_referring ((symtab_node)prevailing_node, &node->symbol.ref_list); + lto_free_function_in_decl_state_for_node ((symtab_node)node); + if (node->symbol.decl != prevailing_node->symbol.decl) cgraph_release_function_body (node); diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog index ab81a7874a3..965a78ce5c8 100644 --- a/gcc/lto/ChangeLog +++ b/gcc/lto/ChangeLog @@ -1,5 +1,9 @@ 2013-08-29 Jan Hubicka + * lto.c (read_cgraph_and_symbols): Free decl states. + +2013-08-29 Jan Hubicka + * lto.c (compare_tree_sccs_1): Compare DECL_FINAL_P, DECL_CXX_CONSTRUCTOR_P, DECL_CXX_DESTRUCTOR_P and TYPE_FINAL_P. diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c index f6e1f970caa..cc0ed69a5f2 100644 --- a/gcc/lto/lto.c +++ b/gcc/lto/lto.c @@ -3502,6 +3502,9 @@ read_cgraph_and_symbols (unsigned nfiles, const char **fnames) gcc_assert (all_file_decl_data[i]->symtab_node_encoder); lto_symtab_encoder_delete (all_file_decl_data[i]->symtab_node_encoder); all_file_decl_data[i]->symtab_node_encoder = NULL; + lto_free_function_in_decl_state (all_file_decl_data[i]->global_decl_state); + all_file_decl_data[i]->global_decl_state = NULL; + all_file_decl_data[i]->current_decl_state = NULL; } /* Finally merge the cgraph according to the decl merging decisions. */ -- 2.11.4.GIT