Add 0x prefix for printing ARM IncSP amount in hex.
[libfirm] / ir / be / bemain.c
index e3f546b..b4ccce5 100644 (file)
@@ -89,6 +89,7 @@ static be_options_t be_options = {
        BE_TIME_OFF,                       /* no timing */
        0,                                 /* no opt profile */
        0,                                 /* try to omit frame pointer */
+       0,                                 /* try to omit leaf frame pointer */
        0,                                 /* create PIC code */
        0,                                 /* create gprof compatible profiling code */
        BE_VRFY_WARN,                      /* verification level: warn */
@@ -150,19 +151,20 @@ static lc_opt_enum_int_var_t sched_var = {
 };
 
 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     ("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_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)),
+       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     ("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_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.filtev, sizeof(be_options.filtev)),
+       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
@@ -214,12 +216,14 @@ int be_parse_arg(const char *arg) {
 /** The be parameters returned by default, all off. */
 static const backend_params be_params = {
        0,    /* need dword lowering */
-       0,    /* don't support inlien assembler yet */
+       0,    /* don't support inline assembler yet */
+       0,     /* no immediate floating point mode. */
        NULL, /* no additional opcodes */
        NULL, /* will be set later */
        NULL, /* but yet no creator function */
        NULL, /* context for create_intrinsic_fkt */
        NULL, /* no if conversion settings */
+       NULL   /* no immediate fp mode */
 };
 
 /* Perform schedule verification if requested. */
@@ -231,12 +235,16 @@ static void be_sched_vrfy(be_irg_t *birg, int vrfy_opt) {
        }
 }
 
-/* Initialize the Firm backend. Must be run BEFORE init_firm()! */
-const backend_params *be_init(void)
+/* Initialize the Firm backend. Must be run first in init_firm()! */
+void firm_be_init(void)
 {
        be_opt_register();
        be_init_modules();
+}
 
+/* Returns the backend parameter */
+const backend_params *be_get_backend_param(void)
+{
        if (isa_if->get_params)
                return isa_if->get_params();
        return &be_params;
@@ -274,7 +282,7 @@ 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)
 {
-       env->arch_env->impl->done(env->arch_env);
+       arch_env_done(env->arch_env);
        be_dbg_close();
        be_phi_handler_free();
 
@@ -328,7 +336,7 @@ static void initialize_birg(be_irg_t *birg, ir_graph *irg, be_main_env_t *env)
        normalize_n_returns(irg);
 
        /* Remove critical edges */
-       remove_critical_cf_edges(irg);
+       remove_critical_cf_edges_ex(irg, /*ignore_exception_edges=*/0);
 
        /* Ensure, that the ir_edges are computed. */
        edges_assure(irg);
@@ -492,7 +500,7 @@ static void be_main_loop(FILE *file_handle, const char *cup_name)
                BE_TIMER_POP(t_verify);
 
                /* Get the code generator interface. */
-               cg_if = arch_env->impl->get_code_generator_if(arch_env);
+               cg_if = arch_env_get_code_generator_if(arch_env);
 
                /* get a code generator for this graph. */
                birg->cg = cg_if->init(birg);