aboutsummaryrefslogtreecommitdiff
path: root/gcc/cgraphunit.c
diff options
context:
space:
mode:
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2012-04-25 14:54:21 +0000
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2012-04-25 14:54:21 +0000
commit9a2639fcdb7f82ff6f0eb7120ee3314cd965158b (patch)
tree9d3f2a88445e1af7a691390a56d3f28b6e0b952e /gcc/cgraphunit.c
parent7e9ba3f31fac3d4e975cf68f8a14aa6252bbfa3d (diff)
PR middle-end/53089
* cgraphunit.c (referred_to_p): Move ahead in file to avoid forward declaration. (cgraph_finalize_function): Finalize them here. * symtab.c (dump_symtab): Dump ctors and dtors. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@186820 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cgraphunit.c')
-rw-r--r--gcc/cgraphunit.c37
1 files changed, 21 insertions, 16 deletions
diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
index f896d1e908d..a58cd08c0d9 100644
--- a/gcc/cgraphunit.c
+++ b/gcc/cgraphunit.c
@@ -320,6 +320,22 @@ cgraph_reset_node (struct cgraph_node *node)
cgraph_node_remove_callees (node);
}
+/* Return true when there are references to NODE. */
+
+static bool
+referred_to_p (symtab_node node)
+{
+ int i;
+ struct ipa_ref *ref;
+
+ for (i = 0; ipa_ref_list_referring_iterate (&node->symbol.ref_list, i, ref);
+ i++)
+ return true;
+ if (symtab_function_p (node) && cgraph (node)->callers)
+ return true;
+ return false;
+}
+
/* DECL has been parsed. Take it, queue it, compile it at the whim of the
logic in effect. If NESTED is true, then our caller cannot stand to have
the garbage collector run at the moment. We would need to either create
@@ -372,6 +388,11 @@ cgraph_finalize_function (tree decl, bool nested)
if (!nested)
ggc_collect ();
+
+ if (cgraph_state == CGRAPH_STATE_CONSTRUCTION
+ && (cgraph_decide_is_function_needed (node, decl)
+ || referred_to_p ((symtab_node)node)))
+ enqueue_node ((symtab_node)node);
}
/* Add the function FNDECL to the call graph.
@@ -1114,22 +1135,6 @@ process_function_and_variable_attributes (struct cgraph_node *first,
}
}
-/* Return true when there are references to NODE. */
-
-static bool
-referred_to_p (symtab_node node)
-{
- int i;
- struct ipa_ref *ref;
-
- for (i = 0; ipa_ref_list_referring_iterate (&node->symbol.ref_list, i, ref);
- i++)
- return true;
- if (symtab_function_p (node) && cgraph (node)->callers)
- return true;
- return false;
-}
-
/* Mark DECL as finalized. By finalizing the declaration, frontend instruct the
middle end to output the variable to asm file, if needed or externally
visible. */