From 3edf64aa919b9bf725672bd0ad91bfd30c6a31df Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Tue, 21 Oct 2014 16:55:38 +0000 Subject: State cleanups from jit branch gcc/ChangeLog: * cgraph.c (cgraph_c_finalize): New function. * cgraph.h (cgraph_c_finalize): New prototype. (cgraphunit_c_finalize): New prototype. * cgraphunit.c (first_analyzed): Move from analyze_functions to file-scope. (first_analyzed_var): Likewise. (analyze_functions): Move static variables into file-scope. (cgraphunit_c_finalize): New function. * diagnostic.c (diagnostic_finish): Free the memory for context->classify_diagnostic and context->printer, running the destructor for the latter. (bt_stop): Use toplev::main. * dwarf2out.c (dwarf2out_finalize): New function. * dwarf2out.h (dwarf2out_c_finalize): New prototype. * gcse.c (gcse_c_finalize): New function. * gcse.h (gcse_c_finalize): New prototype. * ggc-page.c (init_ggc): Make idempotent. * input.c (input_location): Initialize to UNKNOWN_LOCATION. * ipa-cp.c (ipa_cp_c_finalize): New function. * ipa-prop.h (ipa_cp_c_finalize): New prototype. * ipa-pure-const.c (function_insertion_hook_holder): Move to be a field of class pass_ipa_pure_const. (node_duplication_hook_holder): Likewise. (node_removal_hook_holder): Likewise. (register_hooks): Convert to method... (pass_ipa_pure_const::register_hooks): ...here, converting static variable init_p into... (pass_ipa_pure_const::init_p): ...new field. (pure_const_generate_summary): Update invocation of register_hooks to invoke as a method of current_pass. (pure_const_read_summary): Likewise. (propagate): Convert to... (pass_ipa_pure_const::execute): ...method. * ipa-reference.c (ipa_init): Move static bool init_p from here to... (ipa_init_p): New file-scope variable, so that it can be reset when repeatedly invoking the compiler within one process by... (ipa_reference_c_finalize): New function. * ipa-reference.h (ipa_reference_c_finalize): New. * main.c (main): Replace invocation of toplev_main with construction of a toplev instance, and call its "main" method. * params.c (global_init_params): Add an assert that params_finished is false. (params_c_finalize): New. * params.h (params_c_finalize): New. * passes.c (execute_ipa_summary_passes): Set "current_pass" before invoking generate_summary, for the benefit of pass_ipa_pure_const. (ipa_write_summaries_2): Assign "pass" to "current_pass" global before calling write_summary hook. (ipa_write_optimization_summaries_1): Likewise when calling write_optimization_summary hook. (ipa_read_summaries_1): Likewise for read_summary hook. (ipa_read_optimization_summaries_1): Likewise for read_optimization_summary hook. (execute_ipa_stmt_fixups): Likewise. * stringpool.c (init_stringpool): Clean up if we're called more than once. * timevar.c (timevar_init): Ignore repeated calls. * toplev.c: Include "dwarf2out.h", "ipa-reference.h", "gcse.h", "ipa-prop.h". (general_init): Reset "input_location" to UNKNOWN_LOCATION. (initialize_rtl): Move static local "initialized_once" into file scope, and rename to... (rtl_initialized): New variable. (do_compile): Move timevar initialization from here to toplev::start_timevars. (toplev::toplev, toplev::~toplev, toplev::start_timevars, toplev::finalize): New functions. (toplev_main): Rename to... (toplev::main): ...this. * toplev.h (class toplev): New class. From-SVN: r216522 --- gcc/toplev.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 53 insertions(+), 15 deletions(-) (limited to 'gcc/toplev.c') diff --git a/gcc/toplev.c b/gcc/toplev.c index 7df9cc7..a87ff9a 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -83,6 +83,10 @@ along with GCC; see the file COPYING3. If not see #include "diagnostic-color.h" #include "context.h" #include "pass_manager.h" +#include "dwarf2out.h" +#include "ipa-reference.h" +#include "ipa-prop.h" +#include "gcse.h" #include "optabs.h" #if defined(DBX_DEBUGGING_INFO) || defined(XCOFF_DEBUGGING_INFO) @@ -101,7 +105,7 @@ along with GCC; see the file COPYING3. If not see #include static void general_init (const char *); -static void do_compile (void); +static void do_compile (); static void process_options (void); static void backend_init (void); static int lang_dependent_init (const char *); @@ -1161,6 +1165,7 @@ general_init (const char *argv0) table. */ init_ggc (); init_stringpool (); + input_location = UNKNOWN_LOCATION; line_table = ggc_alloc (); linemap_init (line_table, BUILTINS_LOCATION); line_table->reallocator = realloc_for_line_map; @@ -1708,16 +1713,16 @@ lang_dependent_init_target (void) /* Perform initializations that are lang-dependent or target-dependent. but matters only for late optimizations and RTL generation. */ +static int rtl_initialized; + void initialize_rtl (void) { - static int initialized_once; - /* Initialization done just once per compilation, but delayed till code generation. */ - if (!initialized_once) + if (!rtl_initialized) ira_init_once (); - initialized_once = true; + rtl_initialized = true; /* Target specific RTL backend initialization. */ if (!this_target_rtl->target_specific_initialized) @@ -1922,14 +1927,8 @@ standard_type_bitsize (int bitsize) /* Initialize the compiler, and compile the input file. */ static void -do_compile (void) +do_compile () { - /* Initialize timing first. The C front ends read the main file in - the post_options hook, and C++ does file timings. */ - if (time_report || !quiet_flag || flag_detailed_statistics) - timevar_init (); - timevar_start (TV_TOTAL); - process_options (); /* Don't do any more if an error has already occurred. */ @@ -1987,12 +1986,30 @@ do_compile (void) timevar_stop (TV_PHASE_FINALIZE); } +} - /* Stop timing and print the times. */ +toplev::toplev (bool use_TV_TOTAL) + : m_use_TV_TOTAL (use_TV_TOTAL) +{ + if (!m_use_TV_TOTAL) + start_timevars (); +} + +toplev::~toplev () +{ timevar_stop (TV_TOTAL); timevar_print (stderr); } +void +toplev::start_timevars () +{ + if (time_report || !quiet_flag || flag_detailed_statistics) + timevar_init (); + + timevar_start (TV_TOTAL); +} + /* Entry point of cc1, cc1plus, jc1, f771, etc. Exit code is FATAL_EXIT_CODE if can't open files or if there were any errors, or SUCCESS_EXIT_CODE if compilation succeeded. @@ -2000,7 +2017,7 @@ do_compile (void) It is not safe to call this function more than once. */ int -toplev_main (int argc, char **argv) +toplev::main (int argc, char **argv) { /* Parsing and gimplification sometimes need quite large stack. Increase stack size limits if possible. */ @@ -2050,7 +2067,11 @@ toplev_main (int argc, char **argv) /* Exit early if we can (e.g. -help). */ if (!exit_after_options) - do_compile (); + { + if (m_use_TV_TOTAL) + start_timevars (); + do_compile (); + } if (warningcount || errorcount || werrorcount) print_ignored_options (); @@ -2068,3 +2089,20 @@ toplev_main (int argc, char **argv) return (SUCCESS_EXIT_CODE); } + +/* For those that want to, this function aims to clean up enough state that + you can call toplev::main again. */ +void +toplev::finalize (void) +{ + rtl_initialized = false; + this_target_rtl->target_specific_initialized = false; + + cgraph_c_finalize (); + cgraphunit_c_finalize (); + dwarf2out_c_finalize (); + gcse_c_finalize (); + ipa_cp_c_finalize (); + ipa_reference_c_finalize (); + params_c_finalize (); +} -- cgit v1.1