X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firtypes.h;h=9baed2a6f8105f1d85e2c7e7e0618bc805b6f02a;hb=672b5c243e900427b5dcae01441d4fa3327d692c;hp=1bd39e1932ebde6cb32b63b1ddd7a7cfda89d33c;hpb=77460435c4aea9d9afcd9583d903c164980cecd4;p=libfirm diff --git a/ir/ir/irtypes.h b/ir/ir/irtypes.h index 1bd39e193..9baed2a6f 100644 --- a/ir/ir/irtypes.h +++ b/ir/ir/irtypes.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved. + * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. * * This file is part of libFirm. * @@ -38,17 +38,21 @@ #include "irmemory.h" #include "callgraph.h" #include "field_temperature.h" +#include "irphases_t.h" #include "pset.h" #include "set.h" #include "list.h" +#include "obst.h" + +struct ir_phase; /** The type of an ir_op. */ struct ir_op { unsigned code; /**< The unique opcode of the op. */ ident *name; /**< The name of the op. */ size_t attr_size; /**< Space needed in memory for private attributes. */ - op_pin_state op_pin_state_pinned; /**< How to deal with the node in CSE, PRE. */ + op_pin_state pin_state; /**< How to deal with the node in CSE, PRE. */ op_arity opar; /**< The arity of operator. */ int op_index; /**< The index of the first data operand, 0 for most cases, 1 for Div etc. */ unsigned flags; /**< Flags describing the behavior of the ir_op, a bitmasks of irop_flags. */ @@ -90,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 @@ -139,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; @@ -159,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. */ @@ -188,14 +193,14 @@ 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. */ - 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. */ typedef struct { ir_type *type; /**< Type of the allocated object. */ - where_alloc where; /**< stack, heap or other managed part of memory */ + ir_where_alloc where; /**< stack, heap or other managed part of memory */ } free_attr; /** InstOf attributes. */ @@ -213,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. */ @@ -224,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. */ @@ -237,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 { @@ -270,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. */ @@ -297,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 */ @@ -328,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 @@ -360,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]; @@ -380,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 */ @@ -407,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. */ @@ -417,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. */ @@ -457,9 +469,9 @@ struct ir_graph { the node. */ ir_graph **callers; /**< For callgraph analysis: list of caller graphs. */ - unsigned *caller_isbe; /**< For callgraph analysis: raw bitset if backedge. */ + unsigned *caller_isbe; /**< For callgraph analysis: raw bitset if backedge info calculated. */ cg_callee_entry **callees; /**< For callgraph analysis: list of callee calls */ - unsigned char *callee_isbe; /**< For callgraph analysis: set if backedge. */ + unsigned *callee_isbe; /**< For callgraph analysis: raw bitset if backedge info calculated. */ int callgraph_loop_depth; /**< For callgraph analysis */ int callgraph_recursion_depth; /**< For callgraph analysis */ double method_execution_frequency; /**< For callgraph analysis */ @@ -479,6 +491,7 @@ struct ir_graph { ir_node **idx_irn_map; /**< Array mapping node indexes to nodes. */ int index; /**< a unique number for each graph */ + ir_phase *phases[PHASE_LAST]; /**< Phase information. */ #ifdef DEBUG_libfirm int n_outs; /**< Size wasted for outs */ long graph_nr; /**< a unique graph number for each @@ -486,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 @@ -508,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. */ @@ -536,9 +551,7 @@ struct ir_prog { double max_method_execution_frequency; /**< needed in callgraph. */ irp_temperature_state temperature_state; /**< accumulated temperatures computed? */ exec_freq_state execfreq_state; /**< The state of execution frequency information */ -#ifdef INTERPROCEDURAL_VIEW loop_nesting_depth_state lnd_state; /**< The state of loop nesting depth information. */ -#endif ir_class_cast_state class_cast_state; /**< The state of cast operations in code. */ ir_address_taken_computed_state globals_adr_taken_state; /**< Address taken state of the globals. */ @@ -550,5 +563,4 @@ struct ir_prog { #endif }; - #endif