X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firgraph_t.h;h=e5b36175a6c4b146ce64c8898ea5ab1dc0d3ca8f;hb=346dfddce9be4420855b06ea40d2bf21dad9bc88;hp=8040fdf84870176fa5f2ba5fe8744e129b64af09;hpb=bdadb741281a7605235767c99d1440ab1edb3848;p=libfirm diff --git a/ir/ir/irgraph_t.h b/ir/ir/irgraph_t.h index 8040fdf84..e5b36175a 100644 --- a/ir/ir/irgraph_t.h +++ b/ir/ir/irgraph_t.h @@ -19,13 +19,21 @@ */ -# ifndef _IRGRAPH_T_H_ -# define _IRGRAPH_T_H_ -# include "obst.h" -# include "pset.h" -# include "irgraph.h" -# include "firm_common_t.h" -# include "irtypeinfo.h" +#ifndef _IRGRAPH_T_H_ +#define _IRGRAPH_T_H_ + +#include "irgraph.h" + +#include "firm_common_t.h" +#include "irtypeinfo.h" +#include "irprog.h" +#include "pseudo_irg.h" + +#include "irloop.h" + +#include "obst.h" +#include "pset.h" +#include "type_t.h" #define FRAME_TP_SUFFIX "frame_tp" @@ -52,6 +60,8 @@ struct ir_graph { struct ir_node *args; /**< methods arguments */ struct ir_node *bad; /**< bad node of this ir_graph, the one and only in this graph */ + struct ir_node *no_mem; /**< NoMem node of this ir_graph, the one and + only in this graph */ /* GL removed: we need unknown with mode for analyses. */ /* struct ir_node *unknown;*/ /**< unknown node of this ir_graph */ struct obstack *obst; /**< obstack where all of the ir_nodes live */ @@ -60,13 +70,13 @@ struct ir_graph { /* -- Fields indicating different states of irgraph -- */ irg_phase_state phase_state; /**< compiler phase */ - op_pinned pinned; /**< Flag for status of nodes */ + op_pin_state op_pin_state_pinned; /**< Flag for status of nodes */ irg_outs_state outs_state; /**< Out edges. */ irg_dom_state dom_state; /**< Dominator information */ - irg_typeinfo_state typeinfo_state; /**< Validity of type information */ + irg_typeinfo_state typeinfo_state; /**< Validity of type information */ irg_callee_info_state callee_info_state; /**< Validity of callee information */ irg_inline_property inline_property; /**< How to handle inlineing. */ - irg_loopinfo_state loopinfo_state; /**< state of loop information */ + irg_loopinfo_state loopinfo_state; /**< state of loop information */ /* -- Fields for construction -- */ #if USE_EXPLICIT_PHI_IN_STACK @@ -81,12 +91,20 @@ struct ir_graph { struct ir_node **outs; /**< Space for the out arrays. */ #ifdef DEBUG_libfirm - int n_outs; /* < Size wasted for outs */ + int n_outs; /* < Size wasted for outs */ #endif /* defined DEBUG_libfirm */ struct ir_loop *loop; /**< The outermost loop */ void *link; /**< A void* field to link any information to the node. */ + ir_graph **callers; /**< For callgraph analyses. */ + int *caller_isbe; /**< For callgraph analyses: set if backedge. */ + ir_graph **callees; /**< For callgraph analyses. */ + int *callee_isbe; /**< For callgraph analyses: set if backedge. */ + int callgraph_loop_depth; + int callgraph_recursion_depth; + ir_loop *l; + /* -- Fields for Walking the graph -- */ unsigned long visited; /**< this flag is an identifier for ir walk. it will be incremented @@ -99,23 +117,29 @@ struct ir_graph { #endif }; +/** + * Initializes the graph construction module + */ void init_irgraph(void); +/* Internal constructor that does not add to irp_irgs or the like. */ +ir_graph *new_r_ir_graph (entity *ent, int n_loc); + /** Make a rudimentary ir graph for the constant code. Must look like a correct irg, spare everything else. */ ir_graph *new_const_code_irg(void); /** - * Set the pinned state of a graph. + * Set the op_pin_state_pinned state of a graph. * - * @irg the IR graph - * @p new pin state + * @param irg the IR graph + * @param p new pin state */ INLINE void -set_irg_pinned (ir_graph *irg, op_pinned p); +set_irg_pinned (ir_graph *irg, op_pin_state p); /** Returns the obstack associated with the graph. */ -struct obstack *get_irg_obstack(ir_graph *irg); +struct obstack *get_irg_obstack(const ir_graph *irg); /** * Returns true if the node n is allocated on the storage of graph irg. @@ -129,189 +153,179 @@ int node_is_in_irgs_storage(ir_graph *irg, ir_node *n); /* inline functions for graphs */ /*-------------------------------------------------------------------*/ +extern int __interprocedural_view; + static INLINE int -__is_ir_graph(void *thing) { +__get_interprocedural_view(void) { + return __interprocedural_view; +} + +static INLINE int +__is_ir_graph(const void *thing) { return (get_kind(thing) == k_ir_graph); } /** Returns the start block of a graph. */ static INLINE ir_node * -__get_irg_start_block(ir_graph *irg) -{ +__get_irg_start_block(const ir_graph *irg) { return irg->start_block; } static INLINE void -__set_irg_start_block(ir_graph *irg, ir_node *node) -{ +__set_irg_start_block(ir_graph *irg, ir_node *node) { irg->start_block = node; } static INLINE ir_node * -__get_irg_start(ir_graph *irg) -{ +__get_irg_start(const ir_graph *irg) { return irg->start; } static INLINE void -__set_irg_start(ir_graph *irg, ir_node *node) -{ +__set_irg_start(ir_graph *irg, ir_node *node) { irg->start = node; } static INLINE ir_node * -__get_irg_end_block(ir_graph *irg) -{ +__get_irg_end_block(const ir_graph *irg) { return irg->end_block; } static INLINE void -__set_irg_end_block(ir_graph *irg, ir_node *node) -{ +__set_irg_end_block(ir_graph *irg, ir_node *node) { irg->end_block = node; } static INLINE ir_node * -__get_irg_end(ir_graph *irg) -{ +__get_irg_end(const ir_graph *irg) { return irg->end; } static INLINE void -__set_irg_end(ir_graph *irg, ir_node *node) -{ +__set_irg_end(ir_graph *irg, ir_node *node) { irg->end = node; } static INLINE ir_node * -__get_irg_end_reg(ir_graph *irg) { +__get_irg_end_reg(const ir_graph *irg) { return irg->end_reg; } static INLINE ir_node * -__get_irg_end_except (ir_graph *irg) { +__get_irg_end_except (const ir_graph *irg) { return irg->end_except; } static INLINE ir_node * -__get_irg_cstore(ir_graph *irg) -{ +__get_irg_cstore(const ir_graph *irg) { return irg->cstore; } static INLINE void -__set_irg_cstore(ir_graph *irg, ir_node *node) -{ +__set_irg_cstore(ir_graph *irg, ir_node *node) { irg->cstore = node; } static INLINE ir_node * -__get_irg_frame(ir_graph *irg) -{ +__get_irg_frame(const ir_graph *irg) { return irg->frame; } static INLINE void -__set_irg_frame(ir_graph *irg, ir_node *node) -{ +__set_irg_frame(ir_graph *irg, ir_node *node) { irg->frame = node; } static INLINE ir_node * -__get_irg_globals(ir_graph *irg) -{ +__get_irg_globals(const ir_graph *irg) { return irg->globals; } static INLINE void -__set_irg_globals(ir_graph *irg, ir_node *node) -{ +__set_irg_globals(ir_graph *irg, ir_node *node) { irg->globals = node; } static INLINE ir_node * -__get_irg_initial_mem(ir_graph *irg) -{ +__get_irg_initial_mem(const ir_graph *irg) { return irg->initial_mem; } static INLINE void -__set_irg_initial_mem(ir_graph *irg, ir_node *node) -{ +__set_irg_initial_mem(ir_graph *irg, ir_node *node) { irg->initial_mem = node; } static INLINE ir_node * -__get_irg_args(ir_graph *irg) -{ +__get_irg_args(const ir_graph *irg) { return irg->args; } static INLINE void -__set_irg_args(ir_graph *irg, ir_node *node) -{ +__set_irg_args(ir_graph *irg, ir_node *node) { irg->args = node; } static INLINE ir_node * -__get_irg_bad(ir_graph *irg) -{ +__get_irg_bad(const ir_graph *irg) { return irg->bad; } static INLINE void -__set_irg_bad(ir_graph *irg, ir_node *node) -{ +__set_irg_bad(ir_graph *irg, ir_node *node) { irg->bad = node; } static INLINE ir_node * -__get_irg_current_block(ir_graph *irg) -{ +__get_irg_no_mem(const ir_graph *irg) { + return irg->no_mem; +} + +static INLINE void +__set_irg_no_mem(ir_graph *irg, ir_node *node) { + irg->no_mem = node; +} +static INLINE ir_node * +__get_irg_current_block(const ir_graph *irg) { return irg->current_block; } static INLINE void -__set_irg_current_block(ir_graph *irg, ir_node *node) -{ +__set_irg_current_block(ir_graph *irg, ir_node *node) { irg->current_block = node; } static INLINE entity * -__get_irg_ent(ir_graph *irg) -{ +__get_irg_entity(const ir_graph *irg) { assert(irg && irg->ent); return irg->ent; } static INLINE void -__set_irg_ent(ir_graph *irg, entity *ent) -{ +__set_irg_entity(ir_graph *irg, entity *ent) { irg->ent = ent; } static INLINE type * -__get_irg_frame_type(ir_graph *irg) -{ +__get_irg_frame_type(const ir_graph *irg) { assert(irg && irg->frame_type); return irg->frame_type; } static INLINE void -__set_irg_frame_type(ir_graph *irg, type *ftp) -{ +__set_irg_frame_type(ir_graph *irg, type *ftp) { assert(is_class_type(ftp)); irg->frame_type = ftp; } static INLINE struct obstack * -__get_irg_obstack(ir_graph *irg) { +__get_irg_obstack(const ir_graph *irg) { return irg->obst; } static INLINE irg_phase_state -__get_irg_phase_state(ir_graph *irg) { +__get_irg_phase_state(const ir_graph *irg) { return irg->phase_state; } @@ -320,13 +334,13 @@ __set_irg_phase_low(ir_graph *irg) { irg->phase_state = phase_low; } -static INLINE op_pinned -__get_irg_pinned(ir_graph *irg) { - return irg->pinned; +static INLINE op_pin_state +__get_irg_pinned(const ir_graph *irg) { + return irg->op_pin_state_pinned; } static INLINE irg_outs_state -__get_irg_outs_state(ir_graph *irg) { +__get_irg_outs_state(const ir_graph *irg) { return irg->outs_state; } @@ -336,7 +350,7 @@ __set_irg_outs_inconsistent(ir_graph *irg) { } static INLINE irg_dom_state -__get_irg_dom_state(ir_graph *irg) { +__get_irg_dom_state(const ir_graph *irg) { return irg->dom_state; } @@ -346,7 +360,7 @@ __set_irg_dom_inconsistent(ir_graph *irg) { } static INLINE irg_loopinfo_state -__get_irg_loopinfo_state(ir_graph *irg) { +__get_irg_loopinfo_state(const ir_graph *irg) { return irg->loopinfo_state; } @@ -356,22 +370,29 @@ __set_irg_loopinfo_state(ir_graph *irg, irg_loopinfo_state s) { } static INLINE void -__set_irg_pinned(ir_graph *irg, op_pinned p) { - irg->pinned = p; +__set_irg_pinned(ir_graph *irg, op_pin_state p) { + irg->op_pin_state_pinned = p; } static INLINE irg_callee_info_state -__get_irg_callee_info_state(ir_graph *irg) { +__get_irg_callee_info_state(const ir_graph *irg) { return irg->callee_info_state; } static INLINE void __set_irg_callee_info_state(ir_graph *irg, irg_callee_info_state s) { + irg_callee_info_state irp_state = get_irp_callee_info_state(); + irg->callee_info_state = s; + + /* I could compare ... but who knows? */ + if ((irp_state == irg_callee_info_consistent) || + ((irp_state == irg_callee_info_inconsistent) && (s == irg_callee_info_none))) + set_irp_callee_info_state(s); } static INLINE irg_inline_property -__get_irg_inline_property(ir_graph *irg) { +__get_irg_inline_property(const ir_graph *irg) { return irg->inline_property; } @@ -386,34 +407,31 @@ __set_irg_link(ir_graph *irg, void *thing) { } static INLINE void * -__get_irg_link(ir_graph *irg) { +__get_irg_link(const ir_graph *irg) { return irg->link; } static INLINE unsigned long -__get_irg_visited(ir_graph *irg) -{ +__get_irg_visited(const ir_graph *irg) { return irg->visited; } static INLINE unsigned long -__get_irg_block_visited(ir_graph *irg) -{ +__get_irg_block_visited(const ir_graph *irg) { return irg->block_visited; } static INLINE void -__set_irg_block_visited(ir_graph *irg, unsigned long visited) -{ +__set_irg_block_visited(ir_graph *irg, unsigned long visited) { irg->block_visited = visited; } static INLINE void -__inc_irg_block_visited(ir_graph *irg) -{ +__inc_irg_block_visited(ir_graph *irg) { ++irg->block_visited; } +#define get_interprocedural_view() __get_interprocedural_view() #define is_ir_graph(thing) __is_ir_graph(thing) #define get_irg_start_block(irg) __get_irg_start_block(irg) #define set_irg_start_block(irg, node) __set_irg_start_block(irg, node) @@ -437,10 +455,12 @@ __inc_irg_block_visited(ir_graph *irg) #define set_irg_args(irg, node) __set_irg_args(irg, node) #define get_irg_bad(irg) __get_irg_bad(irg) #define set_irg_bad(irg, node) __set_irg_bad(irg, node) +#define get_irg_no_mem(irg) __get_irg_no_mem(irg) +#define set_irg_no_mem(irg, node) __set_irg_no_mem(irg, node) #define get_irg_current_block(irg) __get_irg_current_block(irg) #define set_irg_current_block(irg, node) __set_irg_current_block(irg, node) -#define get_irg_ent(irg) __get_irg_ent(irg) -#define set_irg_ent(irg, ent) __set_irg_ent(irg, ent) +#define get_irg_entity(irg) __get_irg_entity(irg) +#define set_irg_entity(irg, ent) __set_irg_entity(irg, ent) #define get_irg_frame_type(irg) __get_irg_frame_type(irg) #define set_irg_frame_type(irg, ftp) __set_irg_frame_type(irg, ftp) #define get_irg_obstack(irg) __get_irg_obstack(irg)