+#include "beutil.h"
+#include "bechordal.h"
+#include "bearch.h"
+#include "becopyoptmain.h"
+#include "becopystat.h"
+#include "bessadestr.h"
+#include "benode_t.h"
+#include "beirgmod.h"
+#include "bespillilp.h"
+#include "bespillbelady.h"
+
+#include "firm/bearch_firm.h"
+#include "ia32/bearch_ia32.h"
+
+#define DUMP_INITIAL (1 << 0)
+#define DUMP_SCHED (1 << 1)
+#define DUMP_PREPARED (1 << 2)
+#define DUMP_RA (1 << 3)
+#define DUMP_FINAL (1 << 4)
+
+/* options visible for anyone */
+be_options_t be_options = {
+ /* ilp server */
+ "i44pc52.info.uni-karlsruhe.de",
+
+ /* ilp solver */
+ "cplex"
+};
+
+/* dump flags */
+static unsigned dump_flags = DUMP_INITIAL | DUMP_SCHED | DUMP_PREPARED | DUMP_RA | DUMP_FINAL;
+
+/* register allocator to use. */
+static const be_ra_t *ra = &be_ra_chordal_allocator;
+
+/* back end instruction set architecture to use */
+static const arch_isa_if_t *isa_if = &ia32_isa_if;
+
+#ifdef WITH_LIBCORE
+
+static lc_opt_entry_t *be_grp_root = NULL;
+
+/* possible dumping options */
+static const lc_opt_enum_mask_items_t dump_items[] = {
+ { "none", 0 },
+ { "initial", DUMP_INITIAL },
+ { "sched", DUMP_SCHED },
+ { "prepared", DUMP_PREPARED },
+ { "regalloc", DUMP_RA },
+ { "final", DUMP_FINAL },
+ { "all", 2 * DUMP_FINAL - 1 },
+ { NULL, 0 }
+};
+
+/* register allocators */
+static const lc_opt_enum_const_ptr_items_t ra_items[] = {
+ { "chordal", &be_ra_chordal_allocator },
+ { NULL, NULL }
+};
+
+/* instruction set architectures. */
+static const lc_opt_enum_const_ptr_items_t isa_items[] = {
+ { "firm", &firm_isa },
+ { "ia32", &ia32_isa_if },
+ { NULL, NULL }
+};
+
+static lc_opt_enum_mask_var_t dump_var = {
+ &dump_flags, dump_items
+};
+
+static lc_opt_enum_const_ptr_var_t ra_var = {
+ (const void **) &ra, ra_items
+};
+
+static lc_opt_enum_const_ptr_var_t isa_var = {
+ (const void **) &isa_if, isa_items
+};
+
+static const lc_opt_table_entry_t be_main_options[] = {
+ LC_OPT_ENT_ENUM_MASK("dump", "dump irg on several occasions", &dump_var),
+ LC_OPT_ENT_ENUM_PTR("ra", "register allocator", &ra_var),
+ LC_OPT_ENT_ENUM_PTR("isa", "the instruction set architecture", &isa_var),
+
+ LC_OPT_ENT_STR ("ilp.server", "the ilp server name", be_options.ilp_server, sizeof(be_options.ilp_server)),
+ LC_OPT_ENT_STR ("ilp.solver", "the ilp solver name", be_options.ilp_solver, sizeof(be_options.ilp_solver)),
+ { NULL }
+};
+
+#endif /* WITH_LIBCORE */
+
+void be_opt_register(void)
+{
+#ifdef WITH_LIBCORE
+ int i;
+
+ be_grp_root = lc_opt_get_grp(firm_opt_get_root(), "be");
+
+ lc_opt_add_table(be_grp_root, be_main_options);
+
+ /* register register allocator options */
+ for(i = 0; ra_items[i].name != NULL; ++i) {
+ const be_ra_t *ra = ra_items[i].value;
+ ra->register_options(be_grp_root);
+ }
+
+ /* register isa options */
+ for(i = 0; isa_items[i].name != NULL; ++i) {
+ const arch_isa_if_t *isa = isa_items[i].value;
+ isa->register_options(be_grp_root);
+ }
+#endif /* WITH_LIBCORE */
+}
+