X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firtypes.h;h=9baed2a6f8105f1d85e2c7e7e0618bc805b6f02a;hb=672b5c243e900427b5dcae01441d4fa3327d692c;hp=481f24ffa56fbbe62153a25c47aa962aa91c6d34;hpb=1ce363f80e6a204d4011f85813362d9bd1d0e7e4;p=libfirm diff --git a/ir/ir/irtypes.h b/ir/ir/irtypes.h index 481f24ffa..9baed2a6f 100644 --- a/ir/ir/irtypes.h +++ b/ir/ir/irtypes.h @@ -43,6 +43,7 @@ #include "pset.h" #include "set.h" #include "list.h" +#include "obst.h" struct ir_phase; @@ -93,7 +94,7 @@ struct ir_mode { int, float, reference ... (see irmode.h) */ mode_arithmetic arithmetic; /**< different arithmetic operations possible with a mode */ - int size; /**< size of the mode in Bits. */ + unsigned size; /**< size of the mode in Bits. */ unsigned sign:1; /**< signedness of this mode */ unsigned int modulo_shift; /**< number of bits a values of this mode will be shifted */ unsigned vector_elem; /**< if this is not equal 1, this is a vector mode with @@ -142,6 +143,7 @@ typedef struct { ir_region *region; /**< The immediate structural region this block belongs to. */ unsigned mb_depth; /**< The macroblock depth: A distance from the macroblock header */ ir_label_t label; /**< The block label if assigned. */ + ir_node *phis; /**< The list of Phi nodes in this block. */ struct list_head succ_head; /**< A list head for all successor edges of a block. */ } block_attr; @@ -162,8 +164,8 @@ typedef struct { /** SymConst attributes. */ typedef struct { symconst_symbol sym; // old tori - symconst_kind num; - ir_type *tp; /**< the source type, for analyses. default: type_unknown. */ + symconst_kind kind; + ir_type *tp; /**< the source type, for analyses. default: type_unknown. */ } symconst_attr; /** Sel attributes. */ @@ -191,8 +193,8 @@ typedef struct { /** Alloc attributes. */ typedef struct { except_attr exc; /**< the exception attribute. MUST be the first one. */ - ir_type *type; /**< Type of the allocated object. */ - ir_where_alloc where; /**< stack, heap or other managed part of memory */ + ir_where_alloc where; /**< stack, heap or other managed part of memory */ + ir_type *type; /**< Type of the allocated object. */ } alloc_attr; /** Free attributes. */ @@ -216,7 +218,7 @@ typedef struct { /** CallBegin attributes. */ typedef struct { - ir_node * call; /**< Associated Call-operation. */ + ir_node *call; /**< Associated Call-operation. */ } callbegin_attr; /** Cast attributes. */ @@ -227,9 +229,9 @@ typedef struct { /** Load attributes. */ typedef struct { except_attr exc; /**< The exception attribute. MUST be the first one. */ + unsigned volatility:1; /**< The volatility of this Load operation. */ + unsigned aligned:1; /**< The align attribute of this Load operation. */ ir_mode *load_mode; /**< The mode of this Load operation. */ - unsigned volatility:1; /**< The volatility of this Load operation. */ - unsigned aligned:1; /**< The align attribute of this Load operation. */ } load_attr; /** Store attributes. */ @@ -240,13 +242,18 @@ typedef struct { } store_attr; typedef struct { - int pos; /**< For Phi0. Used to remember the value defined by - this Phi node. Needed when the Phi is completed - to call get_r_internal_value to find the - predecessors. If this attribute is set, the Phi - node takes the role of the obsolete Phi0 node, - therefore the name. */ -} phi0_attr; + ir_node *next; /**< Points to the next Phi in the Phi list of a block. */ + union { + unsigned *backedge; /**< Raw Bitfield: bit n is set to true if pred n is backedge. */ + int pos; /**< For Phi0. Used to remember the value defined by + this Phi node. Needed when the Phi is completed + to call get_r_internal_value() to find the + predecessors. If this attribute is set, the Phi + node takes the role of the obsolete Phi0 node, + therefore the name. */ + } u; +} phi_attr; + /**< Confirm attribute. */ typedef struct { @@ -273,10 +280,12 @@ typedef struct { typedef struct { except_attr exc; /**< The exception attribute. MUST be the first one. */ ir_mode *res_mode; /**< Result mode for the division. */ + char no_remainder; /**< Set, if known that a division can be done without a remainder. */ } divmod_attr; /** Inline Assembler support attribute. */ typedef struct { + /* BEWARE: pin state MUST be the first attribute */ op_pin_state pin_state; /**< the pin state for operations that might generate a exception */ ident *asm_text; /**< The inline assembler text. */ ir_asm_constraint *inputs; /**< Input constraints. */ @@ -300,9 +309,7 @@ typedef union { cast_attr cast; /**< For Cast. */ load_attr load; /**< For Load. */ store_attr store; /**< For Store. */ - phi0_attr phi0; /**< for Phi0 nodes. */ - unsigned *phi_backedge; /**< For Phi after construction. - Raw Bitfield n set to true if pred n is backedge. */ + phi_attr phi; /**< For Phi. */ long proj; /**< For Proj: contains the result position to project */ confirm_attr confirm; /**< For Confirm: compare operation and region. */ filter_attr filter; /**< For Filter */ @@ -331,11 +338,11 @@ typedef irn_edge_info_t irn_edges_info_t[EDGE_KIND_LAST]; struct ir_node { /* ------- Basics of the representation ------- */ firm_kind kind; /**< Distinguishes this node from others. */ + unsigned node_idx; /**< The node index of this node in its graph. */ ir_op *op; /**< The Opcode of this node. */ ir_mode *mode; /**< The Mode of this node. */ struct ir_node **in; /**< The array of predecessors / operands. */ unsigned long visited; /**< The visited counter for walks of the graph. */ - unsigned node_idx; /**< The node index of this node in its graph. */ void *link; /**< To attach additional information to the node, e.g. used while construction to link Phi0 nodes and during optimization to link to nodes that @@ -363,12 +370,16 @@ struct ir_node { Must be last field of struct ir_node. */ }; +#include "iredgeset.h" + /** * Edge info to put into an irg. */ typedef struct _irg_edge_info_t { - set *edges; /**< a set containing all edges of a graph. */ - unsigned activated : 1; /**< set if edges are activated for the graph. */ + ir_edgeset_t edges; + struct obstack edges_obst; + unsigned allocated : 1; + unsigned activated : 1; /**< set if edges are activated for the graph. */ } irg_edge_info_t; typedef irg_edge_info_t irg_edges_info_t[EDGE_KIND_LAST]; @@ -383,9 +394,8 @@ enum irg_anchors { anchor_start, /**< start node of this ir_graph */ anchor_end_reg, /**< end node of this ir_graph */ anchor_end_except, /**< end node of this ir_graph */ - anchor_frame, /**< method's frame */ - anchor_globals, /**< pointer to the data segment containing all - globals as well as global procedures. */ + anchor_initial_exec, /**< methods initial control flow */ + anchor_frame, /**< methods frame */ anchor_tls, /**< pointer to the thread local storage containing all thread local data. */ anchor_initial_mem, /**< initial memory of this graph */ @@ -410,6 +420,7 @@ typedef struct cg_callee_entry { struct ir_graph { firm_kind kind; /**< Always set to k_ir_graph. */ /* -- Basics of the representation -- */ + unsigned last_node_idx; /**< The last IR node index for this graph. */ ir_entity *ent; /**< The entity of this procedure, i.e., the type of the procedure and the class it belongs to. */ @@ -420,8 +431,6 @@ struct ir_graph { ir_node *current_block; /**< Current block for newly gen_*()-erated ir_nodes. */ struct obstack *extbb_obst; /**< The obstack for extended basic block info. */ - unsigned last_node_idx; /**< The last IR node index for this graph. */ - /* -- Fields for graph properties -- */ irg_inline_property inline_property; /**< How to handle inlineing. */ unsigned additional_properties; /**< Additional graph properties. */ @@ -490,7 +499,7 @@ struct ir_graph { #endif #ifndef NDEBUG - unsigned using_visited : 1; /**< set to 1 if we are currently using the visited flag */ + unsigned using_irn_visited : 1; /**< set to 1 if we are currently using the visited flag */ unsigned using_block_visited : 1; /**< set to 1 if we are currently using the block_visited flag */ unsigned using_irn_link : 1; /**< set to 1 if we are currently using the irn_link fields */ #endif @@ -512,6 +521,8 @@ struct ir_prog { have fields and procedures. */ ir_type *tls_type; /**< The thread local storage type. Must be a struct as it can only have fields. */ + ir_type *constructors_type; /**< contains links to module constructor + functions. Must be a struct */ ir_type **types; /**< A list of all types in the ir. */ ir_mode **modes; /**< A list of all modes in the ir. */ ir_op **opcodes; /**< A list of all opcodes in the ir. */