X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbemain.c;h=6a29f868aafe385fe97c3bbbfdc6571839fba717;hb=d300330b1e6df8c8914b8fb70cf38ee1c8ca2634;hp=cd0ba3f263fb42fb7b295896740b96ee9d40fbc7;hpb=57fb9fc8605ae538d91ca191301e0d3c111cc3ba;p=libfirm diff --git a/ir/be/bemain.c b/ir/be/bemain.c index cd0ba3f26..6a29f868a 100644 --- a/ir/be/bemain.c +++ b/ir/be/bemain.c @@ -31,9 +31,8 @@ #include #include -#include -#include -#include +#include "lc_opts.h" +#include "lc_opts_enum.h" #include "obst.h" #include "bitset.h" @@ -88,9 +87,9 @@ static be_options_t be_options = { BE_TIME_OFF, /* no timing */ 0, /* no opt profile */ 0, /* try to omit frame pointer */ - 0, /* no stabs debugging output */ BE_VRFY_WARN, /* verification level: warn */ BE_SCHED_LIST, /* scheduler: list scheduler */ + "linux", /* target OS name */ "i44pc52.info.uni-karlsruhe.de", /* ilp server */ "cplex", /* ilp solver */ 0, /* enable statistic event dumping */ @@ -150,11 +149,11 @@ static const lc_opt_table_entry_t be_main_options[] = { LC_OPT_ENT_STR ("config", "read another config file containing backend options", config_file, sizeof(config_file)), LC_OPT_ENT_ENUM_MASK("dump", "dump irg on several occasions", &dump_var), LC_OPT_ENT_BOOL ("omitfp", "omit frame pointer", &be_options.omit_fp), - LC_OPT_ENT_BOOL ("stabs", "enable stabs debug support", &be_options.stabs_debug_support), LC_OPT_ENT_ENUM_PTR ("vrfy", "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), + LC_OPT_ENT_STR ("os", "specify target operating system", &be_options.target_os, sizeof(be_options.target_os)), #ifdef FIRM_STATISTICS LC_OPT_ENT_BOOL ("statev", "dump statistic events", &be_options.statev), LC_OPT_ENT_STR ("filtev", "filter for stat events (regex if support is active", &be_options.printev, sizeof(be_options.printev)), @@ -266,14 +265,14 @@ static be_main_env_t *be_init_env(be_main_env_t *env, FILE *file_handle) env->phi_handler = be_phi_handler_new(env->arch_env); arch_env_push_irn_handler(env->arch_env, env->phi_handler); - env->db_handle = be_options.stabs_debug_support ? be_stabs_open(file_handle) : be_nulldbg_open(); + be_dbg_open(); return env; } static void be_done_env(be_main_env_t *env) { env->arch_env->isa->impl->done(env->arch_env->isa); - be_dbg_close(env->db_handle); + be_dbg_close(); be_phi_handler_free(env->phi_handler); obstack_free(&env->obst, NULL); } @@ -335,27 +334,28 @@ static void initialize_birg(be_irg_t *birg, ir_graph *irg, be_main_env_t *env) #define BE_TIMER_ONLY(code) do { if (be_timing) { code; } } while(0) int be_timing; -lc_timer_t *t_abi; -lc_timer_t *t_codegen; -lc_timer_t *t_sched; -lc_timer_t *t_constr; -lc_timer_t *t_finish; -lc_timer_t *t_emit; -lc_timer_t *t_other; -lc_timer_t *t_verify; -lc_timer_t *t_heights; -lc_timer_t *t_live; -lc_timer_t *t_ssa_constr; -lc_timer_t *t_ra_constr; -lc_timer_t *t_ra_prolog; -lc_timer_t *t_ra_epilog; -lc_timer_t *t_ra_spill; -lc_timer_t *t_ra_spill_apply; -lc_timer_t *t_ra_color; -lc_timer_t *t_ra_ifg; -lc_timer_t *t_ra_copymin; -lc_timer_t *t_ra_ssa; -lc_timer_t *t_ra_other; +ir_timer_t *t_abi; +ir_timer_t *t_codegen; +ir_timer_t *t_sched; +ir_timer_t *t_constr; +ir_timer_t *t_finish; +ir_timer_t *t_emit; +ir_timer_t *t_other; +ir_timer_t *t_verify; +ir_timer_t *t_heights; +ir_timer_t *t_live; +ir_timer_t *t_execfreq; +ir_timer_t *t_ssa_constr; +ir_timer_t *t_ra_constr; +ir_timer_t *t_ra_prolog; +ir_timer_t *t_ra_epilog; +ir_timer_t *t_ra_spill; +ir_timer_t *t_ra_spill_apply; +ir_timer_t *t_ra_color; +ir_timer_t *t_ra_ifg; +ir_timer_t *t_ra_copymin; +ir_timer_t *t_ra_ssa; +ir_timer_t *t_ra_other; /** * The Firm backend main loop. @@ -379,28 +379,29 @@ static void be_main_loop(FILE *file_handle, const char *cup_name) be_timing = (be_options.timing == BE_TIME_ON); if (be_timing) { - t_abi = lc_timer_register("time_beabi", "be abi introduction"); - t_codegen = lc_timer_register("time_codegen", "codegeneration"); - t_sched = lc_timer_register("time_sched", "scheduling"); - t_constr = lc_timer_register("time_constr", "assure constraints"); - t_finish = lc_timer_register("time_finish", "graph finish"); - t_emit = lc_timer_register("time_emiter", "code emiter"); - t_verify = lc_timer_register("time_verify", "graph verification"); - t_other = lc_timer_register("time_other", "other"); - t_heights = lc_timer_register("time_heights", "heights"); - t_live = lc_timer_register("time_liveness", "be liveness"); - t_ssa_constr = lc_timer_register("time_ssa_constr", "ssa reconstruction"); - t_ra_prolog = lc_timer_register("time_ra_prolog", "regalloc prolog"); - t_ra_epilog = lc_timer_register("time_ra_epilog", "regalloc epilog"); - t_ra_constr = lc_timer_register("time_ra_constr", "regalloc constraints"); - t_ra_spill = lc_timer_register("time_ra_spill", "spiller"); + t_abi = ir_timer_register("time_beabi", "be abi introduction"); + t_codegen = ir_timer_register("time_codegen", "codegeneration"); + t_sched = ir_timer_register("time_sched", "scheduling"); + t_constr = ir_timer_register("time_constr", "assure constraints"); + t_finish = ir_timer_register("time_finish", "graph finish"); + t_emit = ir_timer_register("time_emiter", "code emiter"); + t_verify = ir_timer_register("time_verify", "graph verification"); + t_other = ir_timer_register("time_other", "other"); + t_heights = ir_timer_register("time_heights", "heights"); + t_live = ir_timer_register("time_liveness", "be liveness"); + t_execfreq = ir_timer_register("time_execfreq", "execfreq"); + t_ssa_constr = ir_timer_register("time_ssa_constr", "ssa reconstruction"); + t_ra_prolog = ir_timer_register("time_ra_prolog", "regalloc prolog"); + t_ra_epilog = ir_timer_register("time_ra_epilog", "regalloc epilog"); + t_ra_constr = ir_timer_register("time_ra_constr", "regalloc constraints"); + t_ra_spill = ir_timer_register("time_ra_spill", "spiller"); t_ra_spill_apply - = lc_timer_register("time_ra_spill_apply", "apply spills"); - t_ra_color = lc_timer_register("time_ra_color", "graph coloring"); - t_ra_ifg = lc_timer_register("time_ra_ifg", "interference graph"); - t_ra_copymin = lc_timer_register("time_ra_copymin", "copy minimization"); - t_ra_ssa = lc_timer_register("time_ra_ssadestr", "ssa destruction"); - t_ra_other = lc_timer_register("time_ra_other", "regalloc other"); + = ir_timer_register("time_ra_spill_apply", "apply spills"); + t_ra_color = ir_timer_register("time_ra_color", "graph coloring"); + t_ra_ifg = ir_timer_register("time_ra_ifg", "interference graph"); + t_ra_copymin = ir_timer_register("time_ra_copymin", "copy minimization"); + t_ra_ssa = ir_timer_register("time_ra_ssadestr", "ssa destruction"); + t_ra_other = ir_timer_register("time_ra_other", "regalloc other"); } be_init_env(&env, file_handle); @@ -408,8 +409,8 @@ static void be_main_loop(FILE *file_handle, const char *cup_name) isa = arch_env_get_isa(env.arch_env); - be_dbg_so(env.db_handle, cup_name); - be_dbg_types(env.db_handle); + be_dbg_so(cup_name); + be_dbg_types(); /* backend may provide an ordered list of irgs where code should be generated for */ irg_list = NEW_ARR_F(ir_graph *, 0); @@ -465,16 +466,6 @@ static void be_main_loop(FILE *file_handle, const char *cup_name) stat_ev_ctx_push_fobj("bemain_irg", irg); /* stop and reset timers */ - BE_TIMER_ONLY( - LC_STOP_AND_RESET_TIMER(t_abi); - LC_STOP_AND_RESET_TIMER(t_codegen); - LC_STOP_AND_RESET_TIMER(t_sched); - LC_STOP_AND_RESET_TIMER(t_constr); - LC_STOP_AND_RESET_TIMER(t_finish); - LC_STOP_AND_RESET_TIMER(t_emit); - LC_STOP_AND_RESET_TIMER(t_verify); - LC_STOP_AND_RESET_TIMER(t_other); - ); BE_TIMER_PUSH(t_other); /* t_other */ /* Verify the initial graph */ @@ -535,6 +526,7 @@ static void be_main_loop(FILE *file_handle, const char *cup_name) assert(be_check_dominance(irg) && "Dominance verification failed"); } + BE_TIMER_PUSH(t_execfreq); /** * Create execution frequencies from profile data or estimate some */ @@ -542,6 +534,7 @@ static void be_main_loop(FILE *file_handle, const char *cup_name) birg->exec_freq = ir_create_execfreqs_from_profile(irg); else birg->exec_freq = compute_execfreq(irg, 10); + BE_TIMER_POP(t_execfreq); /* disabled for now, fails for EmptyFor.c and XXEndless.c */ @@ -686,15 +679,21 @@ static void be_main_loop(FILE *file_handle, const char *cup_name) BE_TIMER_POP(t_other); +#define STOP_AND_RESET_TIMER(timer) do { ir_timer_stop(timer); ir_timer_reset(timer); } while(0) + #define LC_EMIT(timer) \ stat_ev_if { \ - stat_ev_dbl(lc_timer_get_name(timer), lc_timer_elapsed_msec(timer)); \ + stat_ev_dbl(ir_timer_get_name(timer), ir_timer_elapsed_msec(timer)); \ } else { \ - printf("%-20s: %.3lf msec\n", lc_timer_get_description(timer), (double)lc_timer_elapsed_usec(timer) / 1000.0); \ - } + printf("%-20s: %8.3lf msec\n", ir_timer_get_description(timer), (double)ir_timer_elapsed_usec(timer) / 1000.0); \ + } \ + STOP_AND_RESET_TIMER(timer); BE_TIMER_ONLY( - printf("==>> IRG %s <<==\n", get_entity_name(get_irg_entity(irg))); + stat_ev_if { + } else { + printf("==>> IRG %s <<==\n", get_entity_name(get_irg_entity(irg))); + } LC_EMIT(t_abi); LC_EMIT(t_codegen); LC_EMIT(t_sched); @@ -702,6 +701,7 @@ static void be_main_loop(FILE *file_handle, const char *cup_name) LC_EMIT(t_heights); LC_EMIT(t_ssa_constr); LC_EMIT(t_constr); + LC_EMIT(t_execfreq); LC_EMIT(t_ra_prolog); LC_EMIT(t_ra_spill); LC_EMIT(t_ra_spill_apply); @@ -739,7 +739,7 @@ static void be_main_loop(FILE *file_handle, const char *cup_name) /* Main interface to the frontend. */ void be_main(FILE *file_handle, const char *cup_name) { - lc_timer_t *t = NULL; + ir_timer_t *t = NULL; /* The user specified another config file to read. do that now. */ if(strlen(config_file) > 0) { @@ -752,13 +752,13 @@ void be_main(FILE *file_handle, const char *cup_name) } if (be_options.timing == BE_TIME_ON) { - t = lc_timer_register("bemain", "measure complete bemain loop"); + t = ir_timer_register("bemain", "measure complete bemain loop"); - if (lc_timer_enter_high_priority()) { + if (ir_timer_enter_high_priority()) { fprintf(stderr, "Warning: Could not enter high priority mode.\n"); } - lc_timer_reset_and_start(t); + ir_timer_reset_and_start(t); } #ifdef FIRM_STATISTICS @@ -782,12 +782,12 @@ void be_main(FILE *file_handle, const char *cup_name) be_main_loop(file_handle, cup_name); if (be_options.timing == BE_TIME_ON) { - lc_timer_stop(t); - lc_timer_leave_high_priority(); + ir_timer_stop(t); + ir_timer_leave_high_priority(); stat_ev_if { - stat_ev_dbl("backend_time", lc_timer_elapsed_msec(t)); + stat_ev_dbl("backend_time", ir_timer_elapsed_msec(t)); } else { - printf("%-20s: %lu msec\n", "BEMAINLOOP", lc_timer_elapsed_msec(t)); + printf("%-20s: %lu msec\n", "BEMAINLOOP", ir_timer_elapsed_msec(t)); } }