give Bad nodes a mode
[libfirm] / ir / be / bemain.c
index 77d5337..07afa5d 100644 (file)
@@ -73,6 +73,7 @@
 #include "be_dbgout.h"
 #include "beirg.h"
 #include "bestack.h"
+#include "beemitter.h"
 
 #define NEW_ID(s) new_id_from_chars(s, sizeof(s) - 1)
 
@@ -80,7 +81,8 @@
 static be_options_t be_options = {
        DUMP_NONE,                         /* dump flags */
        BE_TIME_OFF,                       /* no timing */
-       0,                                 /* no opt profile */
+       false,                             /* profile_generate */
+       false,                             /* profile_use */
        0,                                 /* try to omit frame pointer */
        0,                                 /* create PIC code */
        BE_VERIFY_WARN,                    /* verification level: warn */
@@ -129,11 +131,10 @@ static const lc_opt_table_entry_t be_main_options[] = {
        LC_OPT_ENT_BOOL     ("pic",        "create PIC code",                                     &be_options.pic),
        LC_OPT_ENT_ENUM_PTR ("verify",     "verify the backend irg",                              &verify_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),
-#ifdef FIRM_STATISTICS
+       LC_OPT_ENT_BOOL     ("profilegenerate", "instrument the code for execution count profiling",   &be_options.opt_profile_generate),
+       LC_OPT_ENT_BOOL     ("profileuse",      "use existing profile data",                           &be_options.opt_profile_use),
        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.filtev, sizeof(be_options.filtev)),
-#endif
 
 #ifdef WITH_ILP
        LC_OPT_ENT_STR ("ilp.server", "the ilp server name", be_options.ilp_server, sizeof(be_options.ilp_server)),
@@ -362,7 +363,6 @@ static be_main_env_t *be_init_env(be_main_env_t *env, FILE *file_handle)
        memset(asm_constraint_flags, 0, sizeof(asm_constraint_flags));
        env->arch_env = arch_env_init(isa_if, file_handle, env);
 
-       be_dbg_open();
        return env;
 }
 
@@ -371,9 +371,6 @@ static be_main_env_t *be_init_env(be_main_env_t *env, FILE *file_handle)
  */
 static void be_done_env(be_main_env_t *env)
 {
-       arch_env_done(env->arch_env);
-       be_dbg_close();
-
        pmap_destroy(env->ent_trampoline_map);
        pmap_destroy(env->ent_pic_symbol_map);
        free_type(env->pic_trampolines_type);
@@ -480,6 +477,17 @@ void be_lower_for_target(void)
        set_irp_phase_state(phase_low);
 }
 
+static void emit_global_asms(void)
+{
+       size_t n = get_irp_n_asms();
+       size_t i;
+       for (i = 0; i < n; ++i) {
+               be_emit_cstring("#APP\n");
+               be_emit_ident(get_irp_asm(i));
+               be_emit_cstring("\n#NO_APP\n");
+       }
+}
+
 /**
  * The Firm backend main loop.
  * Do architecture specific lowering for all graphs
@@ -511,9 +519,12 @@ static void be_main_loop(FILE *file_handle, const char *cup_name)
        be_init_env(&env, file_handle);
        env.cup_name = cup_name;
 
-       be_dbg_so(cup_name);
+       be_dbg_open();
+       be_dbg_unit_begin(cup_name);
        be_dbg_types();
 
+       emit_global_asms();
+
        arch_env = env.arch_env;
 
        /* backend may provide an ordered list of irgs where code should be
@@ -539,23 +550,24 @@ static void be_main_loop(FILE *file_handle, const char *cup_name)
                Get the filename for the profiling data.
                Beware: '\0' is already included in sizeof(suffix)
        */
-       sprintf(prof_filename, "%.*s%s\n", (int)(sizeof(prof_filename) - sizeof(suffix)), cup_name, suffix);
-
-       /*
-               Next: Either instruments all irgs with profiling code
-               or try to read in profile data for current translation unit.
-       */
-       if (be_options.opt_profile) {
-               ir_graph *prof_init_irg = ir_profile_instrument(prof_filename, profile_default);
+       sprintf(prof_filename, "%.*s%s",
+               (int)(sizeof(prof_filename) - sizeof(suffix)), cup_name, suffix);
+
+       if (be_options.opt_profile_use) {
+               bool res = ir_profile_read(prof_filename);
+               if (!res) {
+                       fprintf(stderr, "Warning: Couldn't read profile data '%s'\n",
+                               prof_filename);
+               }
+       }
+       if (be_options.opt_profile_generate) {
+               ir_graph *prof_init_irg
+                       = ir_profile_instrument(prof_filename);
                initialize_birg(&birgs[num_birgs], prof_init_irg, &env);
                num_birgs++;
-       } else {
-               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) {
@@ -706,9 +718,7 @@ static void be_main_loop(FILE *file_handle, const char *cup_name)
                /* Do register allocation */
                be_allocate_registers(irg);
 
-#ifdef FIRM_STATISTICS
                stat_ev_dbl("bemain_costs_before_ra", be_estimate_irg_costs(irg, birg->exec_freq));
-#endif
 
                dump(DUMP_RA, irg, "ra");
 
@@ -800,6 +810,12 @@ static void be_main_loop(FILE *file_handle, const char *cup_name)
                be_free_birg(irg);
                stat_ev_ctx_pop("bemain_irg");
        }
+
+       arch_env_done(arch_env);
+
+       be_dbg_unit_end();
+       be_dbg_close();
+
        ir_profile_free();
        be_done_env(&env);
 
@@ -821,7 +837,6 @@ void be_main(FILE *file_handle, const char *cup_name)
                ir_timer_reset_and_start(t);
        }
 
-#ifdef FIRM_STATISTICS
        if (be_options.statev) {
                const char *dot = strrchr(cup_name, '.');
                const char *pos = dot ? dot : cup_name + strlen(cup_name);
@@ -833,7 +848,6 @@ void be_main(FILE *file_handle, const char *cup_name)
                stat_ev_begin(buf, be_options.filtev);
                stat_ev_ctx_push_str("bemain_compilation_unit", cup_name);
        }
-#endif
 
        be_main_loop(file_handle, cup_name);
 
@@ -848,12 +862,10 @@ void be_main(FILE *file_handle, const char *cup_name)
                }
        }
 
-#ifdef FIRM_STATISTICS
        if (be_options.statev) {
                stat_ev_ctx_pop("bemain_compilation_unit");
                stat_ev_end();
        }
-#endif
 }
 
 static int do_lower_for_target(ir_prog *irp, void *context)