From 0878843fd50d1ac01305b963a5b4c52732694f01 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Tue, 10 Apr 2012 11:56:05 +0000 Subject: toplev.h (tree_rest_of_compilation): Remove. 2012-04-10 Richard Guenther * toplev.h (tree_rest_of_compilation): Remove. * tree-optimize.c (tree_rest_of_compilation): Likewise. * cgraph.h (tree_rest_of_compilation): Declare. * tree-optimize.c (tree_rest_of_compilation): Move ... * cgraphunit.c (tree_rest_of_compilation): ... here. * cgraph.c (cgraph_add_new_function): Adjust. * Makefile.in (tree-optimize.o): Adjust. (cgraphunit.o): Likewise. From-SVN: r186274 --- gcc/cgraphunit.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 91 insertions(+), 1 deletion(-) (limited to 'gcc/cgraphunit.c') diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c index 70ac1f3..9d2c46c 100644 --- a/gcc/cgraphunit.c +++ b/gcc/cgraphunit.c @@ -111,6 +111,7 @@ along with GCC; see the file COPYING3. If not see #include "coretypes.h" #include "tm.h" #include "tree.h" +#include "output.h" #include "rtl.h" #include "tree-flow.h" #include "tree-inline.h" @@ -141,6 +142,7 @@ along with GCC; see the file COPYING3. If not see #include "ipa-inline.h" #include "ipa-utils.h" #include "lto-streamer.h" +#include "regset.h" /* FIXME: For reg_obstack. */ static void cgraph_expand_all_functions (void); static void cgraph_mark_functions_to_output (void); @@ -1768,6 +1770,94 @@ assemble_thunks_and_aliases (struct cgraph_node *node) } } +/* For functions-as-trees languages, this performs all optimization and + compilation for FNDECL. */ + +void +tree_rest_of_compilation (struct cgraph_node *node) +{ + tree fndecl = node->decl; + location_t saved_loc; + + timevar_push (TV_REST_OF_COMPILATION); + + gcc_assert (cgraph_global_info_ready); + + /* Initialize the default bitmap obstack. */ + bitmap_obstack_initialize (NULL); + + /* Initialize the RTL code for the function. */ + current_function_decl = fndecl; + saved_loc = input_location; + input_location = DECL_SOURCE_LOCATION (fndecl); + init_function_start (fndecl); + + gimple_register_cfg_hooks (); + + bitmap_obstack_initialize (®_obstack); /* FIXME, only at RTL generation*/ + + execute_all_ipa_transforms (); + + /* Perform all tree transforms and optimizations. */ + + /* Signal the start of passes. */ + invoke_plugin_callbacks (PLUGIN_ALL_PASSES_START, NULL); + + execute_pass_list (all_passes); + + /* Signal the end of passes. */ + invoke_plugin_callbacks (PLUGIN_ALL_PASSES_END, NULL); + + bitmap_obstack_release (®_obstack); + + /* Release the default bitmap obstack. */ + bitmap_obstack_release (NULL); + + set_cfun (NULL); + + /* If requested, warn about function definitions where the function will + return a value (usually of some struct or union type) which itself will + take up a lot of stack space. */ + if (warn_larger_than && !DECL_EXTERNAL (fndecl) && TREE_TYPE (fndecl)) + { + tree ret_type = TREE_TYPE (TREE_TYPE (fndecl)); + + if (ret_type && TYPE_SIZE_UNIT (ret_type) + && TREE_CODE (TYPE_SIZE_UNIT (ret_type)) == INTEGER_CST + && 0 < compare_tree_int (TYPE_SIZE_UNIT (ret_type), + larger_than_size)) + { + unsigned int size_as_int + = TREE_INT_CST_LOW (TYPE_SIZE_UNIT (ret_type)); + + if (compare_tree_int (TYPE_SIZE_UNIT (ret_type), size_as_int) == 0) + warning (OPT_Wlarger_than_, "size of return value of %q+D is %u bytes", + fndecl, size_as_int); + else + warning (OPT_Wlarger_than_, "size of return value of %q+D is larger than %wd bytes", + fndecl, larger_than_size); + } + } + + gimple_set_body (fndecl, NULL); + if (DECL_STRUCT_FUNCTION (fndecl) == 0 + && !cgraph_get_node (fndecl)->origin) + { + /* Stop pointing to the local nodes about to be freed. + But DECL_INITIAL must remain nonzero so we know this + was an actual function definition. + For a nested function, this is done in c_pop_function_context. + If rest_of_compilation set this to 0, leave it 0. */ + if (DECL_INITIAL (fndecl) != 0) + DECL_INITIAL (fndecl) = error_mark_node; + } + + input_location = saved_loc; + + ggc_collect (); + timevar_pop (TV_REST_OF_COMPILATION); +} + /* Expand function specified by NODE. */ static void @@ -1783,7 +1873,7 @@ cgraph_expand_function (struct cgraph_node *node) gcc_assert (node->lowered); /* Generate RTL for the body of DECL. */ - tree_rest_of_compilation (decl); + tree_rest_of_compilation (node); /* Make sure that BE didn't give up on compiling. */ gcc_assert (TREE_ASM_WRITTEN (decl)); -- cgit v1.1