+
+void be_pre_spill_prepare_constr(ir_graph *irg,
+ const arch_register_class_t *cls)
+{
+ be_pre_spill_env_t env;
+ memset(&env, 0, sizeof(env));
+ env.irg = irg;
+ env.cls = cls;
+
+ be_assure_live_sets(irg);
+
+ irg_block_walk_graph(irg, pre_spill_prepare_constr_walker, NULL, &env);
+}
+
+
+
+int be_coalesce_spill_slots = 1;
+int be_do_remats = 1;
+
+static const lc_opt_table_entry_t be_spill_options[] = {
+ LC_OPT_ENT_BOOL ("coalesce_slots", "coalesce the spill slots", &be_coalesce_spill_slots),
+ LC_OPT_ENT_BOOL ("remat", "try to rematerialize values instead of reloading", &be_do_remats),
+ LC_OPT_LAST
+};
+
+static be_module_list_entry_t *spillers = NULL;
+static const be_spiller_t *selected_spiller = NULL;
+
+void be_register_spiller(const char *name, be_spiller_t *spiller)
+{
+ if (selected_spiller == NULL)
+ selected_spiller = spiller;
+ be_add_module_to_list(&spillers, name, spiller);
+}
+
+void be_do_spill(ir_graph *irg, const arch_register_class_t *cls)
+{
+ assert(selected_spiller != NULL);
+
+ selected_spiller->spill(irg, cls);
+}
+
+BE_REGISTER_MODULE_CONSTRUCTOR(be_init_spilloptions)
+void be_init_spilloptions(void)
+{
+ lc_opt_entry_t *be_grp = lc_opt_get_grp(firm_opt_get_root(), "be");
+ lc_opt_entry_t *spill_grp = lc_opt_get_grp(be_grp, "spill");
+
+ lc_opt_add_table(spill_grp, be_spill_options);
+ be_add_module_list_opt(be_grp, "spiller", "spill algorithm",
+ &spillers, (void**) &selected_spiller);
+
+ FIRM_DBG_REGISTER(dbg, "firm.be.spillprepare");
+}