X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firtypes.h;h=060ce3254f4a4492006559a9c5dad8fc0b3e05b7;hb=8c9aa24a1f17891325986165a58434cf75f96f6d;hp=b5786a5245a8c4a34150270a932d8746cdde722f;hpb=e3b765fcef0e337f4fe2e17d57d2fbaf1912ec79;p=libfirm diff --git a/ir/ir/irtypes.h b/ir/ir/irtypes.h index b5786a524..060ce3254 100644 --- a/ir/ir/irtypes.h +++ b/ir/ir/irtypes.h @@ -21,7 +21,6 @@ * @file * @brief Definition of the Firm IR base types, concentrated here * @author Michael Beck - * @version $Id$ */ #ifndef FIRM_IR_IRDEFS_H #define FIRM_IR_IRDEFS_H @@ -35,7 +34,6 @@ #include "irgraph.h" #include "iredgekinds.h" #include "irtypeinfo.h" -#include "irextbb.h" #include "irmemory.h" #include "callgraph.h" #include "irprog.h" @@ -61,7 +59,7 @@ struct ir_op { 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. */ - int fragile_mem_index; /**< index of memory input for fragile nodes */ + int memory_index; /**< index of memory input for memory nodes */ int pn_x_regular; /**< for fragile ops the position of the X_regular output */ int pn_x_except; /**< for fragile ops the position of the @@ -168,6 +166,18 @@ struct ir_mode { const void *tv_priv; /**< tarval module will save private data here */ }; +/* note: we use "long" here because that is the type used for Proj-Numbers */ +typedef struct ir_switch_table_entry { + ir_tarval *min; + ir_tarval *max; + long pn; +} ir_switch_table_entry; + +struct ir_switch_table { + size_t n_entries; + ir_switch_table_entry entries[]; +}; + /* ir node attributes */ /** first attribute of Bad, Block, Anchor nodes */ @@ -190,6 +200,7 @@ typedef struct block_attr { ir_visited_t block_visited; /**< For the walker that walks over all blocks. */ /* Attributes private to construction: */ unsigned is_matured:1; /**< If set, all in-nodes of the block are fixed. */ + unsigned dynamic_ins:1; /**< if set in-array is an ARR_F on the heap. */ unsigned marked:1; /**< Can be set/unset to temporary mark a block. */ ir_node **graph_arr; /**< An array to store all parameters. */ /* Attributes holding analyses information */ @@ -199,12 +210,7 @@ typedef struct block_attr { in different phases. Eventually inline the whole datastructure. */ ir_dom_info pdom; /**< Datastructure that holds information about post-dominators. */ - ir_node ** in_cg; /**< array with predecessors in - * interprocedural_view, if they differ - * from intraprocedural predecessors */ bitset_t *backedge; /**< Bitfield n set to true if pred n is backedge.*/ - bitset_t *cg_backedge; /**< Bitfield n set to true if pred n is interprocedural backedge. */ - ir_extblk *extblk; /**< The extended basic block this block belongs to. */ ir_entity *entity; /**< entitiy representing this block */ ir_node *phis; /**< The list of Phi nodes in this block. */ @@ -248,7 +254,6 @@ typedef struct call_attr { except_attr exc; /**< the exception attribute. MUST be the first one. */ ir_type *type; /**< type of called procedure */ ir_entity **callee_arr; /**< result of callee analysis */ - unsigned tail_call:1; /**< if set, can be a tail call */ } call_attr; /** Builtin attributes. */ @@ -363,6 +368,11 @@ typedef struct proj_attr { long proj; /**< position of tuple sub-value which is projected */ } proj_attr; +typedef struct switch_attr { + unsigned n_outs; + ir_switch_table *table; +} switch_attr; + /** Some IR-nodes just have one attribute, these are stored here, some have more. Their name is 'irnodename_attr' */ typedef union ir_attr { @@ -393,6 +403,7 @@ typedef union ir_attr { div_attr div; /**< For Div operation */ mod_attr mod; /**< For Mod operation */ asm_attr assem; /**< For ASM operation. */ + switch_attr switcha; /**< For Switch operation. */ } ir_attr; /** @@ -467,8 +478,10 @@ typedef irg_edge_info_t irg_edges_info_t[EDGE_KIND_LAST]; /** * Index constants for nodes that can be accessed through the graph anchor node. */ -enum irg_anchors { - anchor_end_block = 0, /**< block the end node will belong to, same as Anchors block */ +typedef enum irg_anchors { + anchor_first, + anchor_end_block = anchor_first, /**< block the end node will belong to, + same as Anchors block */ anchor_start_block, /**< block the start node will belong to */ anchor_end, /**< end node of this ir_graph */ anchor_start, /**< start node of this ir_graph */ @@ -477,8 +490,9 @@ enum irg_anchors { anchor_initial_mem, /**< initial memory of this graph */ anchor_args, /**< methods arguments */ anchor_no_mem, /**< NoMem node of this ir_graph, the one and only in this graph */ - anchor_last -}; + anchor_last = anchor_no_mem +} irg_anchors; +ENUM_COUNTABLE(irg_anchors) /** A callgraph entry for callees. */ typedef struct cg_callee_entry { @@ -498,7 +512,7 @@ typedef struct ir_vrp_info { 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. */ + 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. */ @@ -507,19 +521,19 @@ struct ir_graph { ir_node *anchor; /**< Pointer to the anchor node of this graph. */ struct obstack *obst; /**< The obstack where all of the ir_nodes live. */ ir_node *current_block; /**< Current block for newly gen_*()-erated ir_nodes. */ - struct obstack *extbb_obst; /**< The obstack for extended basic block info. */ /* -- Fields for graph properties -- */ irg_inline_property inline_property; /**< How to handle inlineing. */ mtp_additional_properties additional_properties; /**< Additional graph properties. */ /* -- Fields indicating different states of irgraph -- */ - ir_graph_state_t state; - irg_phase_state phase_state; /**< Compiler phase. */ - op_pin_state irg_pinned_state; /**< Flag for status of nodes. */ - ir_typeinfo_state typeinfo_state; /**< Validity of type information. */ - irg_callee_info_state callee_info_state; /**< Validity of callee information. */ - ir_class_cast_state class_cast_state; /**< Kind of cast operations in code. */ + ir_graph_properties_t properties; + ir_graph_constraints_t constraints; + irg_phase_state phase_state; /**< Compiler phase. */ + op_pin_state irg_pinned_state; /**< Flag for status of nodes. */ + ir_typeinfo_state typeinfo_state; /**< Validity of type information. */ + irg_callee_info_state callee_info_state; /**< Validity of callee information. */ + ir_class_cast_state class_cast_state; /**< Kind of cast operations in code. */ unsigned mem_disambig_opt; /**< Options for the memory disambiguator. */ unsigned fp_model; /**< floating point model of the graph. */ @@ -603,10 +617,13 @@ struct ir_prog { to allocate nodes the represent values of constant entities. It is not meant as a procedure. */ + ir_entity *unknown_entity; /**< unique 'unknown'-entity */ ir_type *segment_types[IR_SEGMENT_LAST+1]; 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. */ + ir_type *none_type; /**< unique 'none'-type */ + ir_type *code_type; /**< unique 'code'-type */ + ir_type *unknown_type; /**< unique 'unknown'-type */ + ir_type *byte_type; /**< type for a 'byte' */ ident **global_asms; /**< An array of global ASM insertions. */ /* -- states of and access to generated information -- */ @@ -631,14 +648,12 @@ struct ir_prog { ir_class_cast_state class_cast_state; /**< The state of cast operations in code. */ ir_entity_usage_computed_state globals_entity_usage_state; - ir_exc_region_t last_region_nr; /**< The last exception region number that was assigned. */ ir_label_t last_label_nr; /**< The highest label number for generating unique labels. */ size_t max_irg_idx; /**< highest unused irg index */ long max_node_nr; /**< to generate unique numbers for nodes. */ unsigned dump_nr; /**< number of program info dumps */ - unsigned optimization_dumps :1; /**< dump irg on each optimization */ #ifndef NDEBUG - ir_resources_t reserved_resources; /**< Bitset for tracking used global resources. */ + irp_resources_t reserved_resources; /**< Bitset for tracking used global resources. */ #endif };