+
+enum {
+ BE_IFG_STD = 1,
+ BE_IFG_FAST = 2,
+ BE_IFG_CLIQUE = 3,
+ BE_IFG_POINTER = 4,
+ BE_IFG_LIST = 5,
+ BE_IFG_CHECK = 6
+};
+
+static int ifg_flavor = BE_IFG_STD;
+
+static const lc_opt_enum_int_items_t ifg_flavor_items[] = {
+ { "std", BE_IFG_STD },
+ { "fast", BE_IFG_FAST },
+ { "clique", BE_IFG_CLIQUE },
+ { "pointer", BE_IFG_POINTER },
+ { "list", BE_IFG_LIST },
+ { "check", BE_IFG_CHECK },
+ { NULL, 0 }
+};
+
+static lc_opt_enum_int_var_t ifg_flavor_var = {
+ &ifg_flavor, ifg_flavor_items
+};
+
+static const lc_opt_table_entry_t be_ifg_options[] = {
+ LC_OPT_ENT_ENUM_PTR ("ifg", "interference graph flavour", &ifg_flavor_var),
+ LC_OPT_LAST
+};
+
+void be_init_ifg(void)
+{
+ lc_opt_entry_t *be_grp = lc_opt_get_grp(firm_opt_get_root(), "be");
+ lc_opt_entry_t *ifg_grp = lc_opt_get_grp(be_grp, "ifg");
+
+ lc_opt_add_table(ifg_grp, be_ifg_options);
+}
+
+BE_REGISTER_MODULE_CONSTRUCTOR(be_init_ifg);
+
+static FILE *be_ifg_open(const be_chordal_env_t *env, const char *prefix)
+{
+ FILE *result;
+ char buf[1024];
+
+ ir_snprintf(buf, sizeof(buf), "%s%F_%s.log", prefix, env->irg, env->cls->name);
+ result = fopen(buf, "wt");
+ if(result == NULL) {
+ panic("Couldn't open '%s' for writing.", buf);
+ }
+
+ return result;
+}
+
+static void check_ifg_implementations(const be_chordal_env_t *chordal_env)
+{
+ be_ifg_t *ifg;
+ FILE *f;
+
+ f = be_ifg_open(chordal_env, "std");
+ ifg = be_ifg_std_new(chordal_env);
+ be_ifg_check_sorted_to_file(ifg, f);
+ fclose(f);
+ be_ifg_free(ifg);
+
+ f = be_ifg_open(chordal_env, "list");
+ ifg = be_ifg_list_new(chordal_env);
+ be_ifg_check_sorted_to_file(ifg, f);
+ fclose(f);
+ be_ifg_free(ifg);
+
+ f = be_ifg_open(chordal_env, "clique");
+ ifg = be_ifg_clique_new(chordal_env);
+ be_ifg_check_sorted_to_file(ifg, f);
+ fclose(f);
+ be_ifg_free(ifg);
+
+ f = be_ifg_open(chordal_env, "pointer");
+ ifg = be_ifg_pointer_new(chordal_env);
+ be_ifg_check_sorted_to_file(ifg, f);
+ fclose(f);
+ be_ifg_free(ifg);
+};
+
+be_ifg_t *be_create_ifg(const be_chordal_env_t *chordal_env)
+{
+ be_ifg_t *ifg = NULL;
+
+ switch (ifg_flavor) {
+ default:
+ assert(0);
+ fprintf(stderr, "no valid ifg flavour selected. falling back to std\n");
+ case BE_IFG_STD:
+ case BE_IFG_FAST:
+ ifg = be_ifg_std_new(chordal_env);
+ break;
+ case BE_IFG_CLIQUE:
+ ifg = be_ifg_clique_new(chordal_env);
+ break;
+ case BE_IFG_POINTER:
+ ifg = be_ifg_pointer_new(chordal_env);
+ break;
+ case BE_IFG_LIST:
+ ifg = be_ifg_list_new(chordal_env);
+ break;
+ case BE_IFG_CHECK:
+ check_ifg_implementations(chordal_env);
+ /* Build the interference graph. */
+ ifg = be_ifg_std_new(chordal_env);
+ break;
+ }
+
+ return ifg;
+}