Some access routines for visited flags in entity.h, irnode.h,
[libfirm] / ir / tr / type.h
index e76734b..fa310c2 100644 (file)
@@ -27,6 +27,9 @@
  *   tpop.h
  *****
  */
+
+/* $Id$ */
+
 # ifndef _TYPE_H_
 # define _TYPE_H_
 
 typedef struct entity entity;
 #endif
 
+#ifndef _IR_NODE_TYPEDEF_
+#define _IR_NODE_TYPEDEF_
+typedef struct ir_node ir_node;
+#endif
+
 /****s* type/type
  *
  * NAME
@@ -75,7 +83,17 @@ typedef struct entity entity;
  *               occupy size bytes in memory.  In several cases this is
  *               determined when fixing the layout of this type (class,
  *               struct, union, array, enumeration).
+ *  state        The state of the type.  The state represents whether the
+ *               layout of the type is undefined or fixed (values: layout_undefined
+ *               or layout_fixed).  Compound types can have an undefined
+ *               layout.  The layout of the basic types primitive and pointer
+ *               is always layout_fixed.  If the layout of
+ *               compound types is fixed all entities must have an offset
+ *               and the size of the type must be set.
+ *               A fixed layout for enumeration types means that each enumeration
+ *               is associated with an implementation value.
  *  visit        A counter for walks of the type information.
+ *  link         A void* to associate some additional inforamtion with the type.
  *
  *  These fields can only be accessed via access functions.
  *
@@ -87,6 +105,8 @@ typedef struct entity entity;
  */
 typedef struct type type;
 
+void*       get_type_link(type *tp);
+void        set_type_link(type *tp, void *l);
 tp_op*      get_type_tpop(type *tp);
 ident*      get_type_tpop_nameid(type *tp);
 const char* get_type_tpop_name(type *tp);
@@ -95,13 +115,33 @@ tp_opcode   get_type_tpop_code(type *tp);
 ir_mode*    get_type_mode(type *tp);
 void        set_type_mode(type *tp, ir_mode* m);
 
-ident*      get_type_nameid(type *tp);
-void        set_type_nameid(type *tp, ident* id);
+ident*      get_type_ident(type *tp);
+void        set_type_ident(type *tp, ident* id);
 const char* get_type_name(type *tp);
 
 int         get_type_size(type *tp);
+/* For primitives and pointer types the size is always fixed.
+   This call is legal but has no effect. */
 void        set_type_size(type *tp, int size);
 
+typedef enum {
+  layout_undefined,    /* The layout of this type is not defined.
+                         Address computation to access fields is not
+                         possible, fields must be accessed by Sel nodes.
+                         This is the default value except for pointer and
+                         primitive types. */
+  layout_fixed         /* The layout is fixed, all component/member entities
+                         have an offset assigned.  Size of the type is known.
+                         Arrays can be accessed by explicit address
+                         computation. Default for pointer and primitive types.
+                      */
+} type_state;
+
+type_state  get_type_state(type *tp);
+/* For primitives and pointer types the layout is always fixed.
+   This call is legal but has no effect. */
+void        set_type_state(type *tp, type_state state);
+
 unsigned long get_type_visited(type *tp);
 void        set_type_visited(type *tp, unsigned long num);
 /* Sets visited field in type to type_visited. */
@@ -165,21 +205,53 @@ int is_type            (void *thing);
 /* create a new class type */
 type   *new_type_class (ident *name);
 
-/* manipulate private fields of class type  */
+/** manipulate private fields of class type  **/
+/* Adds the entity as member of the class.  */
 void    add_class_member   (type *clss, entity *member);
+/* Returns the number of members of this class. */
 int     get_class_n_member (type *clss);
+/* Returns the member at position pos, 0 <= pos < n_member */
 entity *get_class_member   (type *clss, int pos);
+/* Overwrites the member at position pos, 0 <= pos < n_member with
+   the passed entity. */
 void    set_class_member   (type *clss, entity *member, int pos);
+/* Finds member in the list of members and overwrites it with NULL
+ @@@ Doesn't work properly. */
+void    remove_class_member(type *clss, entity *member);
 
+
+/* Adds subtype as subtype to clss.
+   Checks whether clss is a supertype of subtype.  If not
+   adds also clss as supertype to subtype.  */
 void    add_class_subtype   (type *clss, type *subtype);
+/* Returns the number of subtypes */
 int     get_class_n_subtype (type *clss);
+/* Gets the subtype at position pos, 0 <= pos < n_subtype. */
 type   *get_class_subtype   (type *clss, int pos);
+/* Sets the subtype at positioin pos, 0 <= pos < n_subtype.  Does not
+   set the corresponding supertype relation for subtype: this might
+   be a different position! */
 void    set_class_subtype   (type *clss, type *subtype, int pos);
+/* Finds subtype in the list of subtypes and overwrites it with NULL
+ @@@ Doesn't work properly. */
+void    remove_class_subtype(type *clss, type *subtype);
+
 
+/* Adds supertype as supertype to class.
+   Checks whether clss is a subtype of supertype.  If not
+   adds also clss as subtype to supertype.  */
 void    add_class_supertype   (type *clss, type *supertype);
+/* Returns the number of supertypes */
 int     get_class_n_supertype (type *clss);
+/* Gets the supertype at position pos,  0 <= pos < n_supertype. */
 type   *get_class_supertype   (type *clss, int pos);
+/* Sets the supertype at postition pos, 0 <= pos < n_subtype.  Does not
+   set the corresponding subtype relation for supertype: this might
+   be a different position! */
 void    set_class_supertype   (type *clss, type *supertype, int pos);
+/* Finds supertype in the list of supertypes and overwrites it with NULL
+ @@@ Doesn't work properly. */
+void    remove_class_supertype(type *clss, type *supertype);
 
 /* typecheck */
 bool    is_class_type(type *clss);
@@ -198,6 +270,8 @@ bool    is_class_type(type *clss);
  *          type_pointer, type_primitive.
  *           This is a dynamic list that can be grown with an "add_" function,
  *           but not shrinked.
+ *           This is a dynamic list that can be grown with an "add_" function,
+ *           but not shrinked.
  * SOURCE
  */
 /* create a new type struct */
@@ -208,6 +282,9 @@ void    add_struct_member   (type *strct, entity *member);
 int     get_struct_n_member (type *strct);
 entity *get_struct_member   (type *strct, int pos);
 void    set_struct_member   (type *strct, int pos, entity *member);
+/* Finds member in the list of memberss and overwrites it with NULL
+ @@@ Doesn't work properly. */
+void    remove_struct_member (type *strct, entity *member);
 
 /* typecheck */
 bool    is_struct_type(type *strct);
@@ -267,56 +344,81 @@ bool  is_method_type     (type *method);
  *   The union type represents union types.
  * ATTRIBUTES
  *   n_types        Number of unioned types.
- *   unioned_type   A list of unioned types.
- *   delim_names    Idents for the names of the union delimiters.
+ *   members        Entities for unioned types.  Fixed length array.
+ *                  This is a dynamic list that can be grown with an "add_" function,
+ *                  but not shrinked.
  * SOURCE
  */
-/* create a new type union
-   The arrays for the types and idents are not initialized by the
-   constructor. */
-type  *new_type_union (ident *name, int n_types);
+/* create a new type union  */
+type   *new_type_union (ident *name);
 
 /* manipulate private fields of struct */
-int    get_union_n_types      (type *uni);
+int     get_union_n_members      (type *uni);
+void    add_union_member (type *uni, entity *member);
+entity *get_union_member (type *uni, int pos);
+void    set_union_member (type *uni, int pos, entity *member);
+/* Finds member in the list of members and overwrites it with NULL
+   @@@ Doesn't work properly. */
+void    remove_union_member (type *uni, entity *member);
 
+/* typecheck */
+bool    is_union_type          (type *uni);
+/*****/
+
+#if 0
+/* We don't need these if the union has entities, which it now
+   does. The entities are necessary for the analysis algorithms. */
 type  *get_union_unioned_type (type *uni, int pos);
 void   set_union_unioned_type (type *uni, int pos, type *type);
 
 ident *get_union_delim_nameid (type *uni, int pos);
 const char *get_union_delim_name (type *uni, int pos);
 void   set_union_delim_nameid (type *uni, int pos, ident *id);
-
-/* typecheck */
-bool   is_union_type          (type *uni);
-/*****/
+#endif
 
 /****** type/array
  * NAME
  *   Representation of an array type.
  * NOTE
  *   The array type represents rectangular multi dimensional arrays.
+ *   The constants representing the bounds must be allocated to
+ *   get_const_code_irg() by setting current_ir_graph accordingly.
  * ATTRIBUTES
  *   n_dimensions     Number of array dimensions.
  *   *lower_bound     Lower bounds of dimensions.  Usually all 0.
  *   *upper_bound     Upper bounds or dimensions.
  *   *element_type    The type of the array elements.
+ *   *element_ent     An entity for the array elements to be used for
+ *                    element selection with Sel.
+ *                    @@@ Do we need several entities?  One might want
+ *                    to select a dimension and not a single element in
+ *                    case of multidim arrays.
  * SOURCE
  */
-/* create a new type array -- set dimension sizes independently */
-type *new_type_array         (ident *name, int n_dimensions);
+/* create a new type array --
+   Set dimension sizes after call to constructor with set_* routines.
+   Entity for array elements is built automatically. */
+type *new_type_array         (ident *name, int n_dimensions,
+                             type *element_type);
 
 /* manipulate private fields of array type */
 int   get_array_n_dimensions (type *array);
-void  set_array_bounds       (type *array, int dimension, int lower_bound,
+/* Allocates Const nodes of mode_I for the array dimensions */
+void  set_array_bounds_int   (type *array, int dimension, int lower_bound,
                                                           int upper_bound);
-void  set_array_lower_bound  (type *array, int dimension, int lower_bound);
-void  set_array_upper_bound  (type *array, int dimension, int upper_bound);
-int   get_array_lower_bound  (type *array, int dimension);
-int   get_array_upper_bound  (type *array, int dimension);
+void  set_array_bounds       (type *array, int dimension, ir_node *lower_bound,
+                                                          ir_node *upper_bound);
+void  set_array_lower_bound  (type *array, int dimension, ir_node *lower_bound);
+void  set_array_upper_bound  (type *array, int dimension, ir_node *upper_bound);
+ir_node * get_array_lower_bound  (type *array, int dimension);
+ir_node * get_array_upper_bound  (type *array, int dimension);
 
 void  set_array_element_type (type *array, type *type);
 type *get_array_element_type (type *array);
 
+void  set_array_element_entity (type *array, entity *ent);
+entity *get_array_element_entity (type *array);
+
 /* typecheck */
 bool   is_array_type         (type *array);
 /*****/
@@ -389,4 +491,34 @@ type *new_type_primitive (ident *name, ir_mode *mode);
 bool  is_primitive_type  (type *primitive);
 /*****/
 
+
+
+/****f* type/is_atomic_type
+ *
+ * NAME
+ *   is_atomic_type - Checks whether a type is atomic.
+ * SYNOPSIS
+ *   int is_atomic_type(type *tp);
+ * INPUTS
+ *   tp - any type
+ * RESULT
+ *   true if type is primitive, pointer or enumeration
+ ***
+ */
+int is_atomic_type(type *tp);
+
+/****f* type/is_compound_type
+ *
+ * NAME
+ *   is_compound_type - Checks whether a type is compound.
+ * SYNOPSIS
+ *   int is_compound_type(type *tp)
+ * INPUTS
+ *   tp - any type
+ * RESULT
+ *   true if the type is class, structure, union or array type.
+ ***
+ */
+int is_compound_type(type *tp);
+
 # endif /* _TYPE_H_ */