#include "firm_config.h"
#include "bemachine.h"
+#include "beirg.h"
-typedef struct _ilp_sched_selector_t ilp_sched_selector_t;
+typedef struct _ilp_sched_selector_t ilp_sched_selector_t;
+typedef struct _ilp_sched_selector_if_t ilp_sched_selector_if_t;
/**
* A selector interface which is used by the ILP schedule framework.
* from the backend or they pass back information to the backend about
* the state of scheduling.
*/
-struct _ilp_sched_selector_t {
+struct _ilp_sched_selector_if_t {
/**
* This function is called before the scheduling of the irg.
void (*node_scheduled)(const void *self, ir_node *irn, unsigned cycle, void *block_env);
};
-#define BE_ILP_SCHED_CALL(func, self, obj, env) \
- do { \
- if ((self)->func) \
- (self)->func((self), (obj), (env)); \
+/**
+ * The actual ILP schedule selector.
+ */
+struct _ilp_sched_selector_t {
+ ilp_sched_selector_if_t *impl;
+};
+
+/**
+ * Some helper macros.
+ */
+#define BE_ILP_SCHED_CALL(func, self, obj, env) \
+ do { \
+ if ((self) && (self)->impl->func) \
+ (self)->impl->func((self), (obj), (env)); \
} while (0)
-#define BE_ILP_SCHED_CALL2(func, self, obj, obj2, env) \
- do { \
- if ((self)->func) \
- (self)->func((self), (obj), (obj2), (env)); \
+#define BE_ILP_SCHED_CALL2(func, self, obj, obj2, env) \
+ do { \
+ if ((self) && (self)->impl->func) \
+ (self)->impl->func((self), (obj), (obj2), (env)); \
} while (0)
#define BE_ILP_SCHED_CALL_ENVRET(func, self, obj, defret) \
- ((self)->func ? (self)->func((self), (obj)) : (defret))
+ ((self) && (self)->impl->func ? (self)->impl->func((self), (obj)) : (defret))
#define BE_ILP_SCHED_CALL_RET(func, self, obj, env, defret) \
- ((self)->func ? (self)->func((self), (obj), (env)) : (defret))
+ ((self) && (self)->impl->func ? (self)->impl->func((self), (obj), (env)) : (defret))
/**
* Convenience macros for all functions.
/**
* Perform ILP scheduling on given birg.
*/
-void be_ilp_sched(const be_irg_t *birg);
-
-#ifdef WITH_LIBCORE
-
-#include <libcore/lc_opts.h>
-#include <libcore/lc_opts_enum.h>
-
-/**
- * Register ILP scheduler options.
- */
-void ilpsched_register_options(lc_opt_entry_t *grp);
-
-#endif /* WITH_LIBCORE */
+void be_ilp_sched(const be_irg_t *birg, be_options_t *be_opts);
#endif /* _BEILPSCHED_H_ */