X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firtypes.h;h=2652e14769839117a045824871766876ae154485;hb=41eca21e7add2e4f30f14c46600a23839852b3fc;hp=823b4039755ac47f2714ede4f7bb6469add14e7e;hpb=6aac59aee3a4d2c1ec050af2b9a2ac12ded488f7;p=libfirm diff --git a/ir/ir/irtypes.h b/ir/ir/irtypes.h index 823b40397..2652e1476 100644 --- a/ir/ir/irtypes.h +++ b/ir/ir/irtypes.h @@ -34,9 +34,11 @@ #include "irgraph.h" #include "iredgekinds.h" #include "irtypeinfo.h" +#include "irextbb.h" #include "execution_frequency.h" #include "irmemory.h" #include "callgraph.h" +#include "irprog.h" #include "field_temperature.h" #include "irphases_t.h" @@ -121,7 +123,7 @@ struct ir_mode { typedef struct { /* General attributes */ ir_graph *irg; /**< The graph this block belongs to. */ - unsigned long block_visited; /**< For the walker that walks over all blocks. */ + 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 is_dead:1; /**< If set, the block is dead (and could be replace by a Bad. */ @@ -152,9 +154,9 @@ 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 pred; /**< only for binary Conds: The jump predication. */ + 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. */ @@ -192,6 +194,13 @@ typedef struct { ir_entity ** callee_arr; /**< result of callee analysis */ } call_attr; +/** Builtin attributes. */ +typedef struct { + except_attr exc; /**< the exception attribute. MUST be the first one. */ + ir_builtin_kind kind; /**< kind of the called builtin procedure */ + ir_type *builtin_tp; /**< type of called builtin procedure */ +} builtin_attr; + /** Alloc attributes. */ typedef struct { except_attr exc; /**< the exception attribute. MUST be the first one. */ @@ -303,7 +312,8 @@ typedef union { const_attr con; /**< For Const: contains the value of the constant and a type */ symconst_attr symc; /**< For SymConst. */ sel_attr sel; /**< For Sel. */ - call_attr call; /**< For Call: pointer to the type of the method to call */ + call_attr call; /**< For Call. */ + builtin_attr builtin; /**< For Builtin. */ callbegin_attr callbegin; /**< For CallBegin. */ alloc_attr alloc; /**< For Alloc. */ free_attr free; /**< For Free. */ @@ -348,15 +358,15 @@ typedef struct _ir_def_use_edge { 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. */ + 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. */ + ir_visited_t visited; /**< The visited counter for walks of the 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 + used during optimization to link to nodes that shall replace a node. */ + long node_nr; /**< A globally unique node number for each node. */ /* ------- Fields for optimizations / analysis information ------- */ ir_def_use_edge *out; /**< array of def-use edges. */ struct dbg_info *dbi; /**< A pointer to information for debug support. */ @@ -364,16 +374,11 @@ struct ir_node { #ifdef DEBUG_libfirm unsigned out_valid : 1; unsigned flags : 31; - long node_nr; /**< A unique node number for each node to make output - readable. */ #endif /* ------- For analyses -------- */ ir_loop *loop; /**< the loop the node is in. Access routines in irloop.h */ -#ifdef DO_HEAPANALYSIS - struct abstval *av; /**< Heapanalysis: The abstract value of this node. */ - struct section *sec; /**< Heapanalysis: The section of this node. */ -#endif 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. @@ -386,10 +391,11 @@ struct ir_node { * Edge info to put into an irg. */ typedef struct _irg_edge_info_t { - ir_edgeset_t edges; - struct obstack edges_obst; - unsigned allocated : 1; - unsigned activated : 1; /**< set if edges are activated for the graph. */ + ir_edgeset_t edges; /**< A set containing all edges of the current graph. */ + struct list_head free_edges; /**< list of all free edges. */ + struct obstack edges_obst; /**< Obstack, where edges are allocated on. */ + unsigned allocated : 1; /**< Set if edges are allocated on the obstack. */ + 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]; @@ -410,7 +416,6 @@ enum irg_anchors { thread local data. */ anchor_initial_mem, /**< initial memory of this graph */ anchor_args, /**< methods arguments */ - anchor_value_param_base, /**< method value param base */ anchor_bad, /**< bad node of this ir_graph, the one and only in this graph */ anchor_no_mem, /**< NoMem node of this ir_graph, the one and only in this graph */ @@ -457,14 +462,11 @@ struct ir_graph { 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. */ - ir_address_taken_computed_state adr_taken_state; /**< Address taken 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. */ /* -- Fields for construction -- */ -#if USE_EXPLICIT_PHI_IN_STACK - struct Phi_in_stack *Phi_in_stack; /**< Needed for automatic Phi construction. */ -#endif int n_loc; /**< Number of local variables in this procedure including procedure parameters. */ void **loc_descriptions; /**< Storage for local variable descriptions. */ @@ -482,18 +484,20 @@ struct ir_graph { unsigned *caller_isbe; /**< For callgraph analysis: raw bitset if backedge info calculated. */ cg_callee_entry **callees; /**< For callgraph analysis: list of callee calls */ unsigned *callee_isbe; /**< For callgraph analysis: raw bitset if backedge info calculated. */ + ir_loop *l; /**< For callgraph analysis. */ int callgraph_loop_depth; /**< For callgraph analysis */ int callgraph_recursion_depth; /**< For callgraph analysis */ double method_execution_frequency; /**< For callgraph analysis */ - ir_loop *l; /**< For callgraph analysis. */ /* -- Fields for Walking the graph -- */ - unsigned long visited; /**< this flag is an identifier for + ir_visited_t visited; /**< this flag is an identifier for ir walk. it will be incremented every time someone walks through the graph */ - unsigned long block_visited; /**< same as visited, for a complete block */ + ir_visited_t block_visited; /**< same as visited, for a complete block */ + + ir_visited_t self_visited; /**< visited flag of the irg */ unsigned estimated_node_count; /**< estimated number of nodes in this graph, updated after every walk */ @@ -509,10 +513,7 @@ struct ir_graph { #endif #ifndef NDEBUG - 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 */ - unsigned using_block_mark : 1; /**< set to 1 if we are currently using the block mark flags */ + ir_resources_t reserved_resources; /**< Bitset for tracking used local resources. */ #endif }; @@ -528,15 +529,11 @@ struct ir_prog { to allocate nodes the represent values of constant entities. It is not meant as a procedure. */ - ir_type *glob_type; /**< The global type. Must be a class as it can - 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 *segment_types[IR_SEGMENT_COUNT]; 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. */ + ident **global_asms; /**< An array of global ASM insertions. */ /* -- states of and access to generated information -- */ irg_phase_state phase_state; /**< The state of construction. */ @@ -564,13 +561,14 @@ struct ir_prog { exec_freq_state execfreq_state; /**< The state of execution frequency information */ loop_nesting_depth_state lnd_state; /**< The state of loop nesting depth information. */ 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. */ + 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. */ int max_irg_idx; /**< highest unused irg index */ -#ifdef DEBUG_libfirm long max_node_nr; /**< to generate unique numbers for nodes. */ +#ifndef NDEBUG + ir_resources_t reserved_resources; /**< Bitset for tracking used global resources. */ #endif };