X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbemain.c;h=c470ae3170fe1d56a00eeb2ea24a42f8216b6c4a;hb=d7343573ce41f42a614410632b6aff56b4f30015;hp=51df6cbcf77d82448db35aa3a687109c8570aff0;hpb=659fd0d9f19bec605a3637a376a8538f3f763b33;p=libfirm diff --git a/ir/be/bemain.c b/ir/be/bemain.c index 51df6cbcf..c470ae317 100644 --- a/ir/be/bemain.c +++ b/ir/be/bemain.c @@ -155,7 +155,7 @@ static const lc_opt_table_entry_t be_main_options[] = { LC_OPT_ENT_BOOL ("omitleaffp", "omit frame pointer in leaf routines", &be_options.omit_leaf_fp), LC_OPT_ENT_BOOL ("pic", "create PIC code", &be_options.pic), LC_OPT_ENT_BOOL ("gprof", "create gprof profiling code", &be_options.gprof), - LC_OPT_ENT_ENUM_PTR ("vrfy", "verify the backend irg", &vrfy_var), + LC_OPT_ENT_ENUM_PTR ("verify", "verify the backend irg", &vrfy_var), LC_OPT_ENT_BOOL ("time", "get backend timing statistics", &be_options.timing), LC_OPT_ENT_BOOL ("profile", "instrument the code for execution count profiling", &be_options.opt_profile), LC_OPT_ENT_ENUM_PTR ("sched", "select a scheduler", &sched_var), @@ -334,7 +334,7 @@ void be_opt_register(void) int be_parse_arg(const char *arg) { lc_opt_entry_t *be_grp = lc_opt_get_grp(firm_opt_get_root(), "be"); if (strcmp(arg, "help") == 0 || (arg[0] == '?' && arg[1] == '\0')) { - lc_opt_print_help(be_grp, stdout); + lc_opt_print_help_for_entry(be_grp, '-', stdout); return -1; } return lc_opt_from_single_arg(be_grp, NULL, arg, NULL); @@ -473,6 +473,7 @@ static void initialize_birg(be_irg_t *birg, ir_graph *irg, be_main_env_t *env) edges_assure(irg); set_irg_phase_state(irg, phase_backend); + be_info_init_irg(irg); dump(DUMP_INITIAL, irg, "-prepared", dump_ir_block_graph); } @@ -513,14 +514,14 @@ ir_timer_t *t_ra_other; */ static void be_main_loop(FILE *file_handle, const char *cup_name) { - int i; - be_main_env_t env; - char prof_filename[256]; static const char suffix[] = ".prof"; - be_irg_t *birgs; - int num_birgs; - ir_graph **irg_list, **backend_irg_list; - arch_env_t *arch_env; + + int i, num_birgs, stat_active = 0; + be_main_env_t env; + char prof_filename[256]; + be_irg_t *birgs; + ir_graph **irg_list, **backend_irg_list; + arch_env_t *arch_env; be_timing = (be_options.timing == BE_TIME_ON); @@ -565,13 +566,16 @@ static void be_main_loop(FILE *file_handle, const char *cup_name) /* we might need 1 birg more for instrumentation constructor */ num_birgs = backend_irg_list ? ARR_LEN(backend_irg_list) : get_irp_n_irgs(); - birgs = alloca(sizeof(birgs[0]) * (num_birgs + 1)); + birgs = ALLOCAN(be_irg_t, num_birgs + 1); + + be_info_init(); /* First: initialize all birgs */ for(i = 0; i < num_birgs; ++i) { ir_graph *irg = backend_irg_list ? backend_irg_list[i] : get_irp_irg(i); initialize_birg(&birgs[i], irg, &env); } + arch_env_handle_intrinsics(arch_env); DEL_ARR_F(irg_list); /* @@ -594,6 +598,10 @@ static void be_main_loop(FILE *file_handle, const char *cup_name) ir_profile_read(prof_filename); } +#ifdef FIRM_STATISTICS + stat_active = stat_is_active(); +#endif /* FIRM_STATISTICS */ + /* For all graphs */ for (i = 0; i < num_birgs; ++i) { be_irg_t *birg = &birgs[i]; @@ -604,8 +612,6 @@ static void be_main_loop(FILE *file_handle, const char *cup_name) /* set the current graph (this is important for several firm functions) */ current_ir_graph = irg; - be_sched_init_phase(irg); - /* reset the phi handler. */ be_phi_handler_reset(); @@ -689,11 +695,6 @@ static void be_main_loop(FILE *file_handle, const char *cup_name) /* disabled for now, fails for EmptyFor.c and XXEndless.c */ /* be_live_chk_compare(birg); */ - /* let backend prepare scheduling */ - BE_TIMER_PUSH(t_codegen); - arch_code_generator_before_sched(birg->cg); - BE_TIMER_POP(t_codegen); - /* schedule the irg */ BE_TIMER_PUSH(t_sched); switch (be_options.scheduler) { @@ -864,13 +865,19 @@ static void be_main_loop(FILE *file_handle, const char *cup_name) ); #undef LC_EMIT - be_sched_free_phase(irg); - be_free_birg(birg); + + /* switched off due to statistics (statistic module needs all irgs) */ +#ifdef FIRM_STATISTICS + if (! stat_active) +#endif /* FIRM_STATISTICS */ + remove_irp_irg(irg); stat_ev_ctx_pop("bemain_irg"); } ir_profile_free(); be_done_env(&env); + + be_info_free(); } /* Main interface to the frontend. */ @@ -904,7 +911,7 @@ void be_main(FILE *file_handle, const char *cup_name) if (be_options.statev) { const char *dot = strrchr(cup_name, '.'); const char *pos = dot ? dot : cup_name + strlen(cup_name); - char *buf = alloca(pos - cup_name + 1); + char *buf = ALLOCAN(char, pos - cup_name + 1); strncpy(buf, cup_name, pos - cup_name); buf[pos - cup_name] = '\0';