??? On the tree-ssa genericizing should take place here and we will avoid
need for these hooks (replacing them by genericizing hook)
- - expand_function callback
-
- This function is used to expand function and pass it into RTL back-end.
- Front-end should not make any assumptions about when this function can be
- called. In particular cgraph_assemble_pending_functions,
- varpool_assemble_pending_variables, cgraph_finalize_function,
- varpool_finalize_function, cgraph_optimize can cause arbitrarily
- previously finalized functions to be expanded.
-
We implement two compilation modes.
- unit-at-a-time: In this mode analyzing of all functions is deferred
static void
cgraph_expand_function (struct cgraph_node *node)
{
- enum debug_info_type save_write_symbols = NO_DEBUG;
- const struct gcc_debug_hooks *save_debug_hooks = NULL;
tree decl = node->decl;
/* We ought to not compile any inline clones. */
gcc_assert (node->lowered);
- if (DECL_IGNORED_P (decl))
- {
- save_write_symbols = write_symbols;
- write_symbols = NO_DEBUG;
- save_debug_hooks = debug_hooks;
- debug_hooks = &do_nothing_debug_hooks;
- }
-
/* Generate RTL for the body of DECL. */
- lang_hooks.callgraph.expand_function (decl);
+ if (lang_hooks.callgraph.emit_associated_thunks)
+ lang_hooks.callgraph.emit_associated_thunks (decl);
+ tree_rest_of_compilation (decl);
/* Make sure that BE didn't give up on compiling. */
/* ??? Can happen with nested function of extern inline. */
gcc_assert (TREE_ASM_WRITTEN (node->decl));
- if (DECL_IGNORED_P (decl))
- {
- write_symbols = save_write_symbols;
- debug_hooks = save_debug_hooks;
- }
-
current_function_decl = NULL;
if (!cgraph_preserve_function_body_p (node->decl))
{
resdecl = build_decl (RESULT_DECL, NULL_TREE, void_type_node);
DECL_ARTIFICIAL (resdecl) = 1;
- DECL_IGNORED_P (resdecl) = 1;
DECL_RESULT (decl) = resdecl;
allocate_struct_function (decl);
TREE_STATIC (decl) = 1;
TREE_USED (decl) = 1;
DECL_ARTIFICIAL (decl) = 1;
- DECL_IGNORED_P (decl) = 1;
DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (decl) = 1;
DECL_SAVED_TREE (decl) = body;
TREE_PUBLIC (decl) = ! targetm.have_ctors_dtors;