#include "config.h"
#endif
+#include "irtools.h"
+
#include "bespilloptions.h"
+#include "bemodule.h"
+#include "be.h"
-#ifdef WITH_LIBCORE
#include <libcore/lc_opts.h>
#include <libcore/lc_opts_enum.h>
#include <libcore/lc_timing.h>
-#endif /* WITH_LIBCORE */
int be_coalesce_spill_slots = 1;
int be_do_remats = 1;
-#ifdef WITH_LIBCORE
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),
{ NULL }
};
-void be_spill_register_options(lc_opt_entry_t *grp)
+static be_module_list_entry_t *spillers = NULL;
+static be_spiller_t *selected_spiller = NULL;
+
+void be_register_spiller(const char *name, be_spiller_t *spiller)
{
- static int run_once = 0;
- lc_opt_entry_t *spill_grp;
+ if(selected_spiller == NULL)
+ selected_spiller = spiller;
+ be_add_module_to_list(&spillers, name, spiller);
+}
- if (run_once)
- return;
+void be_do_spill(be_irg_t *birg, const arch_register_class_t* cls)
+{
+ assert(selected_spiller != NULL);
+ if(selected_spiller != NULL) {
+ selected_spiller->spill(birg, cls);
+ }
+}
- run_once = 1;
- spill_grp = lc_opt_get_grp(grp, "spill");
+void be_init_spill(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(spill_grp, "spiller", "spill algorithm",
+ &spillers, (void**) &selected_spiller);
}
-#endif /* WITH_LIBCORE */
+
+BE_REGISTER_MODULE_CONSTRUCTOR(be_init_spill);