X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbe_t.h;h=705509a4f13208e06148fcaff48efd372479b355;hb=c03098df320995c78fb51798f1933368777e2b24;hp=279f66e472b5c69d9a35214ba1ddb83877c80de7;hpb=1ce363f80e6a204d4011f85813362d9bd1d0e7e4;p=libfirm diff --git a/ir/be/be_t.h b/ir/be/be_t.h index 279f66e47..705509a4f 100644 --- a/ir/be/be_t.h +++ b/ir/be/be_t.h @@ -30,20 +30,22 @@ #include "obst.h" #include "debug.h" #include "bitset.h" +#include "timing.h" +#include "pmap.h" #include "be.h" -#include "bearch.h" -#include "be_dbgout.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 "be_types.h" + +enum { + 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_TIME_OFF, @@ -67,33 +69,102 @@ struct be_options_t { int timing; /**< time the backend phases */ int opt_profile; /**< instrument code for profiling */ int omit_fp; /**< try to omit the frame pointer */ - int stabs_debug_support; /**< enable stabs debugging support */ + int omit_leaf_fp; /**< try to omit the frame pointer in leaf routines */ + 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 printev[128]; + char filtev[128]; /**< filter mask for stat events (regex is supported) */ }; struct be_main_env_t { - struct obstack obst; arch_env_t *arch_env; - be_options_t *options; + be_options_t *options; /**< backend options */ arch_code_generator_t *cg; - arch_irn_handler_t *phi_handler; - dbg_handle *db_handle; - const char *cup_name; + 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 unsigned short asm_constraint_flags[256]; + +void be_init_default_asm_constraint_flags(void); + +/** + * 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); + + /** -* 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); - -#endif /* FIRM_BE_BE_T_H */ + * Initialize the backend. Must be run first in init_firm(); + */ +void firm_be_init(void); +void firm_be_finish(void); + +extern int be_timing; + +typedef enum { + T_ABI, + 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_PROLOG, + 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; +extern ir_timer_t *be_timers[T_LAST+1]; + +static inline void be_timer_push(be_timer_id_t id) +{ + int res; + if (!be_timing) + return; + + assert(id <= T_LAST); + res = ir_timer_push(be_timers[id]); + (void) res; + assert(res && "Timer already on stack, cannot be pushed twice."); +} + +static inline void be_timer_pop(be_timer_id_t id) +{ + ir_timer_t *tmp; + if (!be_timing) + return; + + tmp = ir_timer_pop(); + (void) tmp; + (void) id; + assert(tmp == be_timers[id] && "Attempt to pop wrong timer."); +} + +#endif