X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbe_t.h;h=7c6283e449698c87f6571a16dcef2ea97d87d829;hb=2cb4a701f143339e07259cf7331c670f5584de63;hp=3629f8b5860d8b5a86fb258e71a6e71d1634d3d2;hpb=2cc256e5c8310acfebb981a3671c78e116a449fb;p=libfirm diff --git a/ir/be/be_t.h b/ir/be/be_t.h index 3629f8b58..7c6283e44 100644 --- a/ir/be/be_t.h +++ b/ir/be/be_t.h @@ -1,42 +1,154 @@ -/** - * Internal backend global data structures. - * @author Sebastian Hack - * @date 8.12.2004 +/* + * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. + * + * This file is part of libFirm. + * + * This file may be distributed and/or modified under the terms of the + * GNU General Public License version 2 as published by the Free Software + * Foundation and appearing in the file LICENSE.GPL included in the + * packaging of this file. + * + * Licensees holding valid libFirm Professional Edition licenses may use + * this file in accordance with the libFirm Commercial License. + * Agreement provided with the Software. + * + * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE + * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE. */ -#ifndef _BE_T_H -#define _BE_T_H +/** + * @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 "bitset.h" +#include "timing.h" +#include "pmap.h" + +#include "be.h" +#include "be_types.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) + +enum { + BE_TIME_OFF, + BE_TIME_ON +}; + +enum { + BE_VRFY_OFF, + BE_VRFY_WARN, + BE_VRFY_ASSERT +}; + +enum { + BE_SCHED_LIST, + BE_SCHED_ILP +}; + +/** 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 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 filtev[128]; /**< filter mask for stat events (regex is supported) */ +}; +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; +}; -#include -#include +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); + + +/** + * Initialize the backend. Must be run first in init_firm(); + */ +void firm_be_init(void); +void firm_be_finish(void); -#include "benode_t.h" +extern int be_timing; -#if 0 -typedef struct _phase_t { - const char *name; - int id; -} phase_t; +#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."); \ + } -int phase_register(phase_t *phase); -void phase_applied(const ir_graph *irg, const phase_t *phase); -int phase_depends_on(const ir_graph *irg, const phase_t *phase, int n, ...); -int phase_invalidates(const ir_graph *irg, const phase_t *phase, int n, ...); -#endif +#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."); \ + } -typedef struct _be_main_env_t { - struct obstack obst; - be_node_factory_t *node_factory; - arch_env_t *arch_env; -} be_main_env_t; +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 */ -typedef struct _be_main_session_env_t { - const be_main_env_t *main_env; - ir_graph *irg; - dom_front_info_t *dom_front; -} be_main_session_env_t; -#endif +#endif /* FIRM_BE_BE_T_H */