X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbeirg.h;h=dc5f7cb74b205e7305b62aa797bd6be64a38d63b;hb=bdc59608633f59b0541a04883c24d19b1bc0ffae;hp=3bf81520b2299f01d1d1ff3d3e72dfe93d82f568;hpb=2922c6d1781518f7b564f28fad474d0e1c7aa7f2;p=libfirm diff --git a/ir/be/beirg.h b/ir/be/beirg.h index 3bf81520b..dc5f7cb74 100644 --- a/ir/be/beirg.h +++ b/ir/be/beirg.h @@ -43,6 +43,32 @@ void be_invalidate_dom_front(ir_graph *irg); */ void be_free_birg(ir_graph *irg); +/** The number of parts of the stack layout. */ +#define N_FRAME_TYPES 3 + +/** + * This type describes the stack layout. + * The stack is divided into 3 parts: + * - arg_type: A struct type describing the stack arguments and its order. + * - between_type: A struct type describing the stack layout between arguments + * and frame type. In architectures that put the return address + * automatically on the stack, the return address is put here. + * - frame_type: A class type describing the frame layout. + */ +struct be_stack_layout_t { + ir_type *arg_type; /**< A type describing the stack argument layout. */ + ir_type *between_type; /**< A type describing the "between" layout. */ + ir_type *frame_type; /**< The frame type. */ + + ir_type *order[N_FRAME_TYPES]; /**< arg, between and frame types ordered. */ + + ir_entity **param_map; /**< An array mapping type parameters to arg_type entries */ + int initial_offset; /**< the initial difference between stack pointer and frame pointer */ + int initial_bias; /**< the initial stack bias */ + bool sp_relative : 1; /**< entities are addressed relative to + stack pointer (omit-fp mode) */ +}; + /** * An ir_graph with additional analysis data about this irg. Also includes some * backend structures @@ -51,14 +77,19 @@ typedef struct be_irg_t { ir_graph *irg; be_main_env_t *main_env; be_abi_irg_t *abi; - arch_code_generator_t *cg; ir_exec_freq *exec_freq; be_dom_front_info_t *dom_front; be_lv_t *lv; + be_stack_layout_t stack_layout; + unsigned *allocatable_regs; /**< registers available for the + allocator */ + arch_register_req_t *sp_req; /**< requirements for stackpointer producing + nodes. */ struct obstack obst; /**< birg obstack (mainly used to keep register constraints which we can't keep - in the irg obst, because it gets replace + in the irg obst, because it gets replaced during code selection) */ + void *isa_link; /**< architecture specific per-graph data*/ } be_irg_t; static inline be_irg_t *be_birg_from_irg(const ir_graph *irg) @@ -91,14 +122,14 @@ static inline be_abi_irg_t *be_get_irg_abi(const ir_graph *irg) return be_birg_from_irg(irg)->abi; } -static inline be_options_t *be_get_irg_options(const ir_graph *irg) +static inline void be_set_irg_abi(ir_graph *irg, be_abi_irg_t *abi) { - return be_birg_from_irg(irg)->main_env->options; + be_birg_from_irg(irg)->abi = abi; } -static inline arch_code_generator_t *be_get_irg_cg(const ir_graph *irg) +static inline be_options_t *be_get_irg_options(const ir_graph *irg) { - return be_birg_from_irg(irg)->cg; + return be_birg_from_irg(irg)->main_env->options; } /** deprecated */ @@ -118,4 +149,9 @@ static inline struct obstack *be_get_be_obst(const ir_graph *irg) return &birg->obst; } -#endif /* FIRM_BE_BEIRG_H */ +static inline be_stack_layout_t *be_get_irg_stack_layout(const ir_graph *irg) +{ + return &be_birg_from_irg(irg)->stack_layout; +} + +#endif