# ifndef _TYPE_H_
# define _TYPE_H_
-# include <stdbool.h>
+#include <stdbool.h>
# include "tpop.h"
# include "firm_common.h"
# include "irmode.h"
# include "dbginfo.h"
-
/* to resolve recursion between entity.h and type.h */
#ifndef _ENTITY_TYPEDEF_
#define _ENTITY_TYPEDEF_
typedef struct ir_node ir_node;
#endif
+# include "tr_inheritance.h"
+
/**
* An abstract data type to represent types.
*
* @link pointer_type pointer @endlink, @link primitive_type primitive @endlink
*
* @todo
- * mode maybe not global field??
+ * mode maybe not global field??
*/
#ifndef _TYPE_TYPEDEF_
#define _TYPE_TYPEDEF_
/** The state of the type layout. */
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, primitive and method types. */
+ Address computation to access fields is not
+ possible, fields must be accessed by Sel
+ nodes. This is the default value except for
+ pointer, primitive and method 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, primitive and method
- types. */
+ have an offset assigned. Size of the type is known.
+ Arrays can be accessed by explicit address
+ computation. Default for pointer, primitive and method
+ types. */
} type_state;
+/** Returns a human readable string for the enum entry. */
+const char *get_type_state_name(type_state s);
+
/** Returns the type layout state of a type. */
type_state get_type_state(const type *tp);
*/
void set_type_size_bits(type *tp, int size);
-/** Returns the alignment of a type in bytes, returns -1 if the alignment is NOT
- * a byte size, ie not dividable by 8. Calls get_type_alignment_bits(). */
+/** Returns the alignment of a type in bytes.
+ *
+ * Returns -1 if the alignment is NOT
+ * a byte size, i.e. not dividable by 8. Calls get_type_alignment_bits(). */
int get_type_alignment_bytes(type *tp);
-/** Returns the alignment of a type in bits. If the alignment of a type is
- * not set, it is calculated here according to the following rules:
- * 1.) if a type has a mode, the alignment is the mode size.
- * 2.) compound types have the alignment of it's biggest member.
- * 3.) array types have the alignment of its element type.
- * 4.) method types return 0 here.
- * 5.) all other types return 8 here (i.e. aligned at byte).
+/** Returns the alignment of a type in bits.
+ *
+ * If the alignment of a type is
+ * not set, it is calculated here according to the following rules:
+ * 1.) if a type has a mode, the alignment is the mode size.
+ * 2.) compound types have the alignment of it's biggest member.
+ * 3.) array types have the alignment of its element type.
+ * 4.) method types return 0 here.
+ * 5.) all other types return 8 here (i.e. aligned at byte).
*/
int get_type_alignment_bits(type *tp);
int is_type (const void *thing);
/**
- * Checks whether two types are structural equal.
+ * Checks whether two types are structurally equal.
*
* @param st pointer type
* @param lt pointer type
* This is to avoid endless recursions; with pointer types circlic
* type graphs are possible.)
*/
-bool equal_type(type *tpy1, type *typ2);
+int equal_type(type *tpy1, type *typ2);
/**
* Checks whether two types are structural comparable.
* @return smaller than the points_to type of lt.
*
*/
-bool smaller_type (type *st, type *lt);
+int smaller_type (type *st, type *lt);
/**
- * @page class_type Representation of a class type
+ * @page class_type Representation of a class type
*
* If the type opcode is set to type_class the type represents class
* types. A list of fields and methods is associated with a class.
int get_class_member_index(type *clss, entity *mem);
/** Finds the member with name 'name'. If several members with the same
- name returns one of them. Returns NULL if no member found. */
+ * name returns one of them. Returns NULL if no member found. */
entity *get_class_member_by_name(type *clss, ident *name);
/** Overwrites the member at position pos, 0 <= pos < n_member with
- the passed entity. */
+ * the passed entity. */
void set_class_member (type *clss, entity *member, int pos);
/** Replaces complete member list in class type by the list passed.
- Copies the list passed. This function is necessary to reduce the number of members.
- members is an array of entities, num the size of this array. Sets all
- owners of the members passed to clss. */
+ *
+ * Copies the list passed. This function is necessary to reduce the number of members.
+ * members is an array of entities, num the size of this array. Sets all
+ * owners of the members passed to clss. */
void set_class_members (type *clss, entity *members[], int arity);
/** Finds member in the list of members and removes it.
- Shrinks the member list, so iterate from the end!!!
- Does not deallocate the entity. */
+ *
+ * Shrinks the member list, so iterate from the end!!!
+ * Does not deallocate the entity. */
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. */
+ *
+ * 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 */
/** Gets the subtype at position pos, 0 <= pos < n_subtype. */
type *get_class_subtype (type *clss, int pos);
+/** Returns the index to access subclass as subtype of class.
+ *
+ * If subclass is no direct subtype of class returns -1.
+ */
+int get_class_subtype_index(type *clss, const type *subclass);
+
/** Sets the subtype at position pos, 0 <= pos < n_subtype.
- Does not set the corresponding supertype relation for subtype: this might
- be a different position! */
+ *
+ * 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 removes it */
/** Adds supertype as supertype to class.
- Checks whether clss is a subtype of supertype. If not
- adds also clss as subtype to supertype. */
+ *
+ * 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_supertypes (const type *clss);
-/** Returns the index of an supertype in a type. */
+/** Returns the index to access superclass as supertype of class.
+ *
+ * If superclass is no direct supertype of class returns -1.
+ */
int get_class_supertype_index(type *clss, type *super_clss);
/** Gets the supertype at position pos, 0 <= pos < n_supertype. */
type *get_class_supertype (type *clss, int pos);
-/** Sets the supertype at position pos, 0 <= pos < n_subtype.
- Does not set the corresponding subtype relation for supertype: this might
- be a different position! */
+/** Sets the supertype at position pos, 0 <= pos < n_supertype.
+ *
+ * Does not set the corresponding subtype relation for supertype: this might
+ * be at a different position! */
void set_class_supertype (type *clss, type *supertype, int pos);
/** Finds supertype in the list of supertypes and removes it */
/** This enumeration flags the peculiarity of entities and types. */
typedef enum peculiarity {
peculiarity_description, /**< Represents only a description. The entity/type is never
- allocated, no code/data exists for this entity/type.
- @@@ eventually rename to descriptive (adjective as the others!)*/
+ allocated, no code/data exists for this entity/type.
+ @@@ eventually rename to descriptive (adjective as the others!)*/
peculiarity_inherited, /**< Describes explicitly that other entities are
- inherited to the owner of this entity.
- Overwrites must refer to at least one other
- entity. If this is a method entity there exists
- no irg for this entity, only for one of the
- overwritten ones.
- Only for entity. */
+ inherited to the owner of this entity.
+ Overwrites must refer to at least one other
+ entity. If this is a method entity there exists
+ no irg for this entity, only for one of the
+ overwritten ones.
+ Only for entity. */
peculiarity_existent /**< The entity/type (can) exist.
- @@@ eventually rename to 'real' i.e., 'echt'
- This serves better as opposition to description _and_ inherited.*/
+ @@@ eventually rename to 'real' i.e., 'echt'
+ This serves better as opposition to description _and_ inherited.*/
} peculiarity;
const char *get_peculiarity_string(peculiarity p);
int get_class_dfn (const type *clss);
/** Returns true if a type is a class type. */
-int is_class_type(const type *clss);
-
-/** Returns true if low is subclass of high. */
-bool is_subclass_of(type *low, type *high);
+int is_Class_type(const type *clss);
/**
- * @page struct_type Representation of a struct type
+ * @page struct_type Representation of a struct type
*
* Type_strct represents aggregate types that consist of a list
* of fields.
* - member: All entities belonging to this class. This are the fields
* that can have any of the following types: type_class,
* type_struct, type_union, type_array, type_enumeration,
- * type_pointer, type_primitive.
+ * 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,
void remove_struct_member (type *strct, entity *member);
/** Returns true if a type is a struct type. */
-int is_struct_type(const type *strct);
+int is_Struct_type(const type *strct);
/**
- * @page method_type Representation of a method type
+ * @page method_type Representation of a method type
*
* A method type represents a method, function or procedure type.
* It contains a list of the parameter and result types, as these
* non_variadic.
*/
typedef enum variadicity {
- variadicity_non_variadic, /**< non variadic */
- variadicity_variadic /**< variadic */
+ variadicity_non_variadic, /**< non variadic */
+ variadicity_variadic /**< variadic */
} variadicity;
/** Returns the null-terminated name of this variadicity. */
void set_method_first_variadic_param_index(type *method, int index);
/** Returns true if a type is a method type. */
-int is_method_type (const type *method);
+int is_Method_type (const type *method);
/**
- * @page union_type Representation of a union type.
+ * @page union_type Representation of a union type.
*
* The union type represents union types.
* - n_types: Number of unioned types.
void remove_union_member (type *uni, entity *member);
/** Returns true if a type is a union type. */
-int is_union_type (const type *uni);
+int is_Union_type (const type *uni);
/**
- * @page array_type Representation of an array type
+ * @page array_type Representation of an array type
*
* The array type represents rectangular multi dimensional arrays.
* The constants representing the bounds must be allocated to
* Set dimension sizes after call to constructor with set_* routines.
*/
type *new_type_array (ident *name, int n_dimensions,
- type *element_type);
+ type *element_type);
/** Create a new type array with debug information.
*
* A legal array type must have at least one dimension set.
*/
type *new_d_type_array (ident *name, int n_dimensions,
- type *element_type, dbg_info* db);
+ type *element_type, dbg_info* db);
/* --- manipulate private fields of array type --- */
/** Returns the number of array dimensions of this type. */
int get_array_n_dimensions (const type *array);
-/** Allocates Const nodes of mode_I for the array dimensions */
+/**
+ * Allocates Const nodes of mode_I for one array dimension.
+ * Upper bound in Firm is the element next to the last, ie [lower,upper[
+ */
void set_array_bounds_int (type *array, int dimension, int lower_bound,
int upper_bound);
+/**
+ * Sets the bounds for one array dimension.
+ * Upper bound in Firm is the element next to the last, ie [lower,upper[
+ */
void set_array_bounds (type *array, int dimension, ir_node *lower_bound,
ir_node *upper_bound);
+/** Sets the lower bound for one array dimension, ie [lower,upper[ */
void set_array_lower_bound (type *array, int dimension, ir_node *lower_bound);
+
+/** Allocates Const nodes of mode_I for the lower bound of an array
+ dimension, ie [lower,upper[ */
void set_array_lower_bound_int (type *array, int dimension, int lower_bound);
+
+/** Sets the upper bound for one array dimension, ie [lower,upper[ */
void set_array_upper_bound (type *array, int dimension, ir_node *upper_bound);
-void set_array_upper_bound_int (type *array, int dimension, int lower_bound);
+
+/** Allocates Const nodes of mode_I for the upper bound of an array
+ dimension, ie [lower,upper[ */
+void set_array_upper_bound_int (type *array, int dimension, int upper_bound);
+
/** returns true if lower bound != Unknown */
int has_array_lower_bound (const type *array, int dimension);
ir_node * get_array_lower_bound (const type *array, int dimension);
/** Works only if bound is Const node with tarval that can be converted to long. */
long get_array_upper_bound_int (const type *array, int dimension);
+/** Sets an array dimension to a specific order. */
void set_array_order (type *array, int dimension, int order);
+
+/** Returns the order of an array dimension. */
int get_array_order (const type *array, int dimension);
+/** Find the array dimension that is placed at order ord. */
+int find_array_dimension(const type *array, int order);
+
+/** Sets the array element type. */
void set_array_element_type (type *array, type *tp);
+
+/** Gets the array element type. */
type *get_array_element_type (type *array);
+/** Sets the array element entity. */
void set_array_element_entity (type *array, entity *ent);
+
+/** Get the array element entity. */
entity *get_array_element_entity (const type *array);
/** Returns true if a type is an array type. */
-int is_array_type(const type *array);
+int is_Array_type(const type *array);
/**
- * @page enumeration_type Representation of an enumeration type
+ * @page enumeration_type Representation of an enumeration type
*
* Enumeration types need not necessarily be represented explicitly
* by Firm types, as the frontend can lower them to integer constants as
* - *enum: The target values representing the constants used to
* represent individual enumerations.
* - *enum_nameid: Idents containing the source program name of the enumeration
- * constants
+ * constants
*/
/** Create a new type enumeration -- set the enumerators independently. */
type *new_type_enumeration (ident *name, int n_enums);
const char *get_enumeration_name(const type *enumeration, int pos);
/** Returns true if a type is a enumeration type. */
-int is_enumeration_type (const type *enumeration);
+int is_Enumeration_type (const type *enumeration);
/**
- * @page pointer_type Representation of a pointer type
+ * @page pointer_type Representation of a pointer type
*
* The mode of the pointer type must be a mode_reference.
*
type *get_pointer_points_to_type (type *pointer);
/** Returns true if a type is a pointer type. */
-int is_pointer_type (const type *pointer);
+int is_Pointer_type (const type *pointer);
/** Returns the first pointer type that has as points_to tp.
* Not efficient: O(#types).
type *new_d_type_primitive (ident *name, ir_mode *mode, dbg_info* db);
/** Returns true if a type is a primitive type. */
-int is_primitive_type (const type *primitive);
+int is_Primitive_type (const type *primitive);
/**
* size: 0
*/
/* A variable that contains the only none type. */
-extern type *none_type;
+extern type *firm_none_type;
/* Returns the none type */
type *get_none_type(void);
* size: 0
*/
/* A variable that contains the only unknown type. */
-extern type *unknown_type;
+extern type *firm_unknown_type;
/* Returns the unknown type */
type *get_unknown_type(void);
/**
* Gets the number of elements in a firm compound type.
*
- * This is just a comforability function, because structs and
+ * This is just a comfortability function, because structs and
* classes can often be treated be the same code, but they have
* different access functions to their members.
*