X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firtypes.h;h=194084c7115b825da5a0caefb06a2c667643a1f1;hb=671ced672859c875de7c1d9c4a4750a29514446f;hp=d071aab2645010e52d6c0cced81dbbe1152763ac;hpb=3646e58f46f85a17537e89483d6b0c279df4a4d2;p=libfirm diff --git a/ir/ir/irtypes.h b/ir/ir/irtypes.h index d071aab26..194084c71 100644 --- a/ir/ir/irtypes.h +++ b/ir/ir/irtypes.h @@ -39,14 +39,22 @@ #include "callgraph.h" #include "irprog.h" #include "field_temperature.h" -#include "irphases_t.h" +#include "irphase.h" #include "pset.h" #include "set.h" #include "list.h" #include "obst.h" +#include "vrp.h" -struct ir_phase; +/** + * List of phases. (We will add a register/unregister interface if managing + * this gets too tedious) + */ +typedef enum ir_phase_id { + PHASE_VRP, + PHASE_LAST = PHASE_VRP +} ir_phase_id; /** The type of an ir_op. */ struct ir_op { @@ -86,6 +94,7 @@ struct ir_op { struct ir_mode { firm_kind kind; /**< distinguishes this node from others */ ident *name; /**< Name ident of this mode */ + ir_type *type; /**< corresponding primitive type */ /* ----------------------------------------------------------------------- */ /* On changing this struct you have to evaluate the mode_are_equal function!*/ @@ -155,15 +164,14 @@ typedef struct { /** Cond attributes. */ typedef struct { - cond_kind kind; /**< flavor of Cond */ long default_proj; /**< only for non-binary Conds: biggest Proj number, i.e. the one used for default. */ cond_jmp_predicate jmp_pred; /**< only for binary Conds: The jump predication. */ } cond_attr; /** Const attributes. */ typedef struct { - tarval *tv; /**< the target value */ - ir_type *tp; /**< the source type, for analyses. default: type_unknown. */ + tarval *tarval; /**< the target value */ + ir_type *tp; /**< the source type, for analyses. default: type_unknown. */ } const_attr; /** SymConst attributes. */ @@ -188,9 +196,10 @@ typedef struct { /** Call attributes. */ typedef struct { - 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 */ + 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. */ @@ -296,11 +305,11 @@ typedef struct { /** 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. */ - ir_asm_constraint *outputs; /**< Output constraints. */ - ident **clobber; /**< List of clobbered registers. */ + op_pin_state pin_state; /**< the pin state for operations that might generate a exception */ + ident *text; /**< The inline assembler text. */ + ir_asm_constraint *input_constraints; /**< Input constraints. */ + ir_asm_constraint *output_constraints; /**< Output constraints. */ + ident **clobbers; /**< List of clobbered registers. */ } asm_attr; /** Some IR-nodes just have one attribute, these are stored here, @@ -338,7 +347,8 @@ typedef union { */ typedef struct _irn_edge_kind_info_t { struct list_head outs_head; /**< The list of all outs. */ - int out_count; /**< Number of outs in the list. */ + unsigned edges_built : 1; /**< Set edges where built for this node. */ + unsigned out_count : 31; /**< Number of outs in the list. */ } irn_edge_info_t; typedef irn_edge_info_t irn_edges_info_t[EDGE_KIND_LAST]; @@ -380,6 +390,7 @@ struct ir_node { struct ir_node **deps; /**< Additional dependencies induced by state. */ void *backend_info; irn_edges_info_t edge_info; /**< Everlasting out edges. */ + /* ------- Opcode depending fields -------- */ attr attr; /**< The set of attributes of this node. Depends on opcode. Must be last field of struct ir_node. */ @@ -451,18 +462,18 @@ struct ir_graph { unsigned additional_properties; /**< Additional graph properties. */ /* -- Fields indicating different states of irgraph -- */ - unsigned state; - irg_phase_state phase_state; /**< Compiler phase. */ - op_pin_state irg_pinned_state; /**< Flag for status of nodes. */ - irg_outs_state outs_state; /**< Out edges. */ - irg_dom_state dom_state; /**< Dominator state information. */ - irg_dom_state pdom_state; /**< Post Dominator state information. */ - ir_typeinfo_state typeinfo_state; /**< Validity of type information. */ + ir_graph_state_t state; + irg_phase_state phase_state; /**< Compiler phase. */ + op_pin_state irg_pinned_state; /**< Flag for status of nodes. */ + irg_outs_state outs_state; /**< Out edges. */ + irg_dom_state dom_state; /**< Dominator state information. */ + irg_dom_state pdom_state; /**< Post Dominator state information. */ + ir_typeinfo_state typeinfo_state; /**< Validity of type information. */ irg_callee_info_state callee_info_state; /**< Validity of callee information. */ - irg_loopinfo_state loopinfo_state; /**< State of loop information. */ - ir_class_cast_state class_cast_state; /**< Kind of cast operations in code. */ + irg_loopinfo_state loopinfo_state; /**< State of loop information. */ + ir_class_cast_state class_cast_state; /**< Kind of cast operations in code. */ irg_extblk_info_state extblk_state; /**< State of extended basic block info. */ - exec_freq_state execfreq_state; /**< Execution frequency state. */ + exec_freq_state execfreq_state; /**< Execution frequency state. */ ir_entity_usage_computed_state entity_usage_state; unsigned mem_disambig_opt; /**< Options for the memory disambiguator. */ unsigned fp_model; /**< floating point model of the graph. */ @@ -506,7 +517,8 @@ 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. */ + ir_phase *phases[PHASE_LAST+1]; /**< Phase information. */ + void *be_data; /**< backend can put in private data here */ #ifdef DEBUG_libfirm int n_outs; /**< Size wasted for outs */ long graph_nr; /**< a unique graph number for each @@ -544,7 +556,7 @@ struct ir_prog { to allocate nodes the represent values of constant entities. It is not meant as a procedure. */ - ir_type *segment_types[IR_SEGMENT_COUNT]; + 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. */