aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/cgraph.h1
-rw-r--r--gcc/tree.c14
3 files changed, 21 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d60161e..bd846a0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2013-08-01 Jan Hubicka <jh@suse.cz>
+
+ * cgraph.h (release_function_body): Declare.
+ * tree.c (free_lang_data_in_decl): Free, parameters and return values
+ of unused delcarations.
+
2013-08-01 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* config/arm/arm.md (minmax_arithsi_non_canon): Emit canonical RTL form
diff --git a/gcc/cgraph.h b/gcc/cgraph.h
index 99acb62..9b76b67 100644
--- a/gcc/cgraph.h
+++ b/gcc/cgraph.h
@@ -606,6 +606,7 @@ void debug_cgraph_node (struct cgraph_node *);
void cgraph_remove_edge (struct cgraph_edge *);
void cgraph_remove_node (struct cgraph_node *);
void cgraph_release_function_body (struct cgraph_node *);
+void release_function_body (tree);
void cgraph_node_remove_callees (struct cgraph_node *node);
struct cgraph_edge *cgraph_create_edge (struct cgraph_node *,
struct cgraph_node *,
diff --git a/gcc/tree.c b/gcc/tree.c
index ab11735..c9f47d2 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -4886,6 +4886,20 @@ free_lang_data_in_decl (tree decl)
if (TREE_CODE (decl) == FUNCTION_DECL)
{
+ struct cgraph_node *node;
+ if (!(node = cgraph_get_node (decl))
+ || (!node->symbol.definition && !node->clones))
+ {
+ if (node)
+ cgraph_release_function_body (node);
+ else
+ {
+ release_function_body (decl);
+ DECL_ARGUMENTS (decl) = NULL;
+ DECL_RESULT (decl) = NULL;
+ DECL_INITIAL (decl) = error_mark_node;
+ }
+ }
if (gimple_has_body_p (decl))
{
tree t;