X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbe_t.h;h=336950198a9d28de6cb777eeb40fffda7f210384;hb=199ea1a4479a4d8dcbebfde81820286935e64b0c;hp=af6a0b5ac624d535b53da53018f3e09af8eb3a2a;hpb=38efd2ac16aa827ae9f07acc9ebfc7d74422290e;p=libfirm diff --git a/ir/be/be_t.h b/ir/be/be_t.h index af6a0b5ac..336950198 100644 --- a/ir/be/be_t.h +++ b/ir/be/be_t.h @@ -21,129 +21,131 @@ * @file * @brief Internal backend global data structures. * @author Sebastian Hack - * @version $Id$ */ #ifndef FIRM_BE_BE_T_H #define FIRM_BE_BE_T_H -#include "firm_types.h" -#include "obst.h" -#include "debug.h" +#include "be.h" +#include "be_types.h" #include "bitset.h" -#include "timing.h" +#include "firm_types.h" #include "pmap.h" - -#include "be.h" -#include "bearch_t.h" -#include "beirg.h" - -#define DUMP_NONE 0 -#define DUMP_INITIAL (1 << 0) -#define DUMP_ABI (1 << 1) -#define DUMP_SCHED (1 << 2) -#define DUMP_PREPARED (1 << 3) -#define DUMP_RA (1 << 4) -#define DUMP_FINAL (1 << 5) -#define DUMP_BE (1 << 6) +#include "timing.h" enum { - BE_TIME_OFF, - BE_TIME_ON + DUMP_NONE = 0, + DUMP_INITIAL = 1 << 0, + DUMP_ABI = 1 << 1, + DUMP_SCHED = 1 << 2, + DUMP_PREPARED = 1 << 3, + DUMP_RA = 1 << 4, + DUMP_FINAL = 1 << 5, + DUMP_BE = 1 << 6 }; enum { - BE_VRFY_OFF, - BE_VRFY_WARN, - BE_VRFY_ASSERT + BE_TIME_OFF, + BE_TIME_ON }; enum { - BE_SCHED_LIST, - BE_SCHED_ILP + BE_VERIFY_OFF, + BE_VERIFY_WARN, + BE_VERIFY_ASSERT }; /** Backend options */ struct be_options_t { - unsigned dump_flags; /**< backend dumping flags */ - int timing; /**< time the backend phases */ - int opt_profile; /**< instrument code for profiling */ - int omit_fp; /**< try to omit the frame pointer */ - int pic; /**< create position independent code */ - int gprof; /**< create gprof compatible profiling code */ - int vrfy_option; /**< backend verify option */ - int scheduler; /**< the scheduler */ - char target_os[128]; /**< target operating system name */ - char ilp_server[128]; /**< the ilp server name */ - char ilp_solver[128]; /**< the ilp solver name */ - int statev; /**< enable stat event dumping */ - char filtev[128]; /**< filter mask for stat events (regex is supported) */ + unsigned dump_flags; /**< backend dumping flags */ + int timing; /**< time the backend phases */ + int opt_profile_generate; /**< instrument code for profiling */ + int opt_profile_use; /**< use existing profile data */ + int omit_fp; /**< try to omit the frame pointer */ + int pic; /**< create position independent code */ + int verify_option; /**< backend verify option */ + char ilp_server[128]; /**< the ilp server name */ + char ilp_solver[128]; /**< the ilp solver name */ + int statev; /**< enable stat event dumping */ + char filtev[128]; /**< filter mask for stat events */ + int verbose_asm; /**< dump verbose assembler */ }; - -typedef struct { - arch_irn_ops_t irn_ops; - const arch_env_t *arch_env; - pmap *phi_attrs; -} phi_handler_t; +extern be_options_t be_options; struct be_main_env_t { - arch_env_t arch_env; - be_options_t *options; /**< backend options */ - arch_code_generator_t *cg; - const char *cup_name; /**< name of the compilation unit */ - pmap *ent_trampoline_map; /**< A map containing PIC trampolines for methods. */ - ir_type *pic_trampolines_type; /**< Class type containing all trampolines */ - pmap *ent_pic_symbol_map; - ir_type *pic_symbols_type; - phi_handler_t phi_handler; + arch_env_t *arch_env; + FILE *file_handle; + const char *cup_name; /**< name of the compilation unit */ + pmap *ent_trampoline_map; /**< A map containing PIC trampolines for methods. */ + ir_type *pic_trampolines_type; /**< Class type containing all trampolines */ + pmap *ent_pic_symbol_map; + ir_type *pic_symbols_type; }; +extern asm_constraint_flags_t asm_constraint_flags[256]; + +void be_init_default_asm_constraint_flags(void); + +void be_put_allocatable_regs(const ir_graph *irg, + const arch_register_class_t *cls, bitset_t *bs); + +void be_set_allocatable_regs(const ir_graph *irg, + const arch_register_class_t *cls, + unsigned *raw_bitset); + +unsigned be_get_n_allocatable_regs(const ir_graph *irg, + const arch_register_class_t *cls); + /** -* Put the registers to be ignored in this IRG into a bitset. -* @param birg The backend IRG data structure. -* @param cls The register class. -* @param bs The bitset (may be NULL). -* @return The number of registers to be ignored. -*/ -unsigned be_put_ignore_regs(const be_irg_t *birg, - const arch_register_class_t *cls, bitset_t *bs); + * Initialize the backend. Must be run first in init_firm(); + */ +void firm_be_init(void); +void firm_be_finish(void); extern int be_timing; -#define BE_TIMER_PUSH(timer) \ - if (be_timing) { \ - int res = ir_timer_push(timer); \ - (void) res; \ - assert(res && "Timer already on stack, cannot be pushed twice."); \ - } - -#define BE_TIMER_POP(timer) \ - if (be_timing) { \ - ir_timer_t *tmp = ir_timer_pop(); \ - (void) tmp; \ - assert(tmp == timer && "Attempt to pop wrong timer."); \ - } - -extern ir_timer_t *t_abi; -extern ir_timer_t *t_codegen; -extern ir_timer_t *t_sched; -extern ir_timer_t *t_constr; -extern ir_timer_t *t_finish; -extern ir_timer_t *t_emit; -extern ir_timer_t *t_other; -extern ir_timer_t *t_execfreq; -extern ir_timer_t *t_verify; -extern ir_timer_t *t_heights; -extern ir_timer_t *t_live; /**< timer for liveness calculation */ -extern ir_timer_t *t_ssa_constr; /**< timer for ssa reconstruction */ -extern ir_timer_t *t_ra_prolog; /**< timer for prolog */ -extern ir_timer_t *t_ra_epilog; /**< timer for epilog */ -extern ir_timer_t *t_ra_constr; /**< timer for spill constraints */ -extern ir_timer_t *t_ra_spill; /**< timer for spilling */ -extern ir_timer_t *t_ra_spill_apply; -extern ir_timer_t *t_ra_color; /**< timer for graph coloring */ -extern ir_timer_t *t_ra_ifg; /**< timer for building interference graph */ -extern ir_timer_t *t_ra_copymin; /**< timer for copy minimization */ -extern ir_timer_t *t_ra_ssa; /**< timer for ssa destruction */ -extern ir_timer_t *t_ra_other; /**< timer for remaining stuff */ - -#endif /* FIRM_BE_BE_T_H */ +typedef enum { + T_FIRST, + T_ABI = T_FIRST, + T_CODEGEN, + T_RA_PREPARATION, + T_SCHED, + T_CONSTR, + T_FINISH, + T_EMIT, + T_VERIFY, + T_OTHER, + T_HEIGHTS, + T_LIVE, + T_EXECFREQ, + T_SSA_CONSTR, + T_RA_EPILOG, + T_RA_CONSTR, + T_RA_SPILL, + T_RA_SPILL_APPLY, + T_RA_COLOR, + T_RA_IFG, + T_RA_COPYMIN, + T_RA_SSA, + T_RA_OTHER, + T_LAST = T_RA_OTHER +} be_timer_id_t; +ENUM_COUNTABLE(be_timer_id_t) +extern ir_timer_t *be_timers[T_LAST+1]; + +static inline void be_timer_push(be_timer_id_t id) +{ + assert(id <= T_LAST); + if (!be_timing) + return; + ir_timer_push(be_timers[id]); +} + +static inline void be_timer_pop(be_timer_id_t id) +{ + assert(id <= T_LAST); + if (!be_timing) + return; + ir_timer_pop(be_timers[id]); +} + +#endif