Include limits.h for LONG_{MAX,MIN}.
[libfirm] / ir / ir / irtypes.h
index 52dd2a2..6e3715e 100644 (file)
@@ -37,6 +37,7 @@
 #include "execution_frequency.h"
 #include "irmemory.h"
 #include "callgraph.h"
+#include "irprog.h"
 #include "field_temperature.h"
 #include "irphases_t.h"
 
@@ -70,9 +71,9 @@ struct ir_op {
  * and comparisons of values of a such described mode.
  *
  * ATTRIBUTES:
- *  -  modecode code:           An unambiguous int (enum) for the mode
+ *  -  ir_modecode code:        An unambiguous int (enum) for the mode
  *  -  ident *name:             Name of this mode. Two modes are different if the name is different.
- *  -  mode_sort sort:          sort of mode specifying possible usage categories
+ *  -  ir_mode_sort sort:       sort of mode specifying possible usage categories
  *  -  int    size:             size of the mode in Bits.
  *  -  unsigned sign:1:         signedness of this mode
  *  -  ... more to come
@@ -85,15 +86,16 @@ struct ir_op {
  */
 struct ir_mode {
        firm_kind         kind;       /**< distinguishes this node from others */
-       modecode          code;       /**< unambiguous identifier of a mode */
+       ir_modecode       code;       /**< unambiguous identifier of a mode */
        ident             *name;      /**< Name ident of this mode */
 
        /* ----------------------------------------------------------------------- */
        /* On changing this struct you have to evaluate the mode_are_equal function!*/
-       mode_sort         sort;          /**< coarse classification of this mode:
+       ir_mode_sort      sort;          /**< coarse classification of this mode:
                                           int, float, reference ...
                                           (see irmode.h) */
-       mode_arithmetic   arithmetic;    /**< different arithmetic operations possible with a mode */
+       ir_mode_arithmetic
+                         arithmetic;    /**< different arithmetic operations possible with a mode */
        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 */
@@ -126,6 +128,7 @@ typedef struct {
        unsigned is_dead:1;         /**< If set, the block is dead (and could be replace by a Bad. */
        unsigned is_mb_head:1;      /**< Set if this block is a macroblock head. */
        unsigned has_label:1;       /**< Set if this block has a label assigned. */
+       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 */
        ir_dom_info dom;            /**< Datastructure that holds information about dominators.
@@ -331,6 +334,14 @@ typedef struct _irn_edge_kind_info_t {
 
 typedef irn_edge_info_t irn_edges_info_t[EDGE_KIND_LAST];
 
+/**
+ * A Def-Use edge.
+ */
+typedef struct _ir_def_use_edge {
+       ir_node *use;            /** The use node of that edge. */
+       int     pos;             /** The position of this edge in use's input array. */
+} ir_def_use_edge;
+
 /**
  * The common structure of an irnode.
  * If the node has some attributes, they are stored in the attr field.
@@ -348,7 +359,7 @@ struct ir_node {
                                      during optimization to link to nodes that
                                      shall replace a node. */
        /* ------- Fields for optimizations / analysis information ------- */
-       struct ir_node **out;    /**< @deprecated array of out edges. */
+       ir_def_use_edge *out;    /**< array of def-use edges. */
        struct dbg_info *dbi;    /**< A pointer to information for debug support. */
        /* ------- For debugging ------- */
 #ifdef DEBUG_libfirm
@@ -462,7 +473,7 @@ struct ir_graph {
        /* -- Fields for optimizations / analysis information -- */
        pset *value_table;                 /**< Hash table for global value numbering (cse)
                                                for optimizing use in iropt.c */
-       ir_node **outs;                    /**< Space for the out arrays. */
+       ir_def_use_edge *outs;             /**< Space for the Def-Use arrays. */
 
        ir_loop *loop;                     /**< The outermost loop for this graph. */
        void *link;                        /**< A void* field to link any information to
@@ -502,6 +513,7 @@ struct ir_graph {
        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 */
 #endif
 };
 
@@ -517,12 +529,7 @@ 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. */