BugFix: fixed conversion for x < lo || x >|>= hi
[libfirm] / include / libfirm / typerep.h
index a56834c..9b081f8 100644 (file)
  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  * PURPOSE.
  */
+
+/**
+ * @file
+ * @brief Declarations for functions and datastructures to represent types
+ */
 #ifndef FIRM_TYPEREP_H
 #define FIRM_TYPEREP_H
 
@@ -46,7 +51,9 @@
  *
  *   - owner:      A compound type this entity is a part of.
  *   - type:       The type of this entity.
- *   - name:       The string that represents this entity in the source program. *   - allocation: A flag saying whether the entity is dynamically or statically *                 allocated (values: dynamic_allocated,  static_allocated,
+ *   - name:       The string that represents this entity in the source program.
+ *   - allocation: A flag saying whether the entity is dynamically or statically
+ *                 allocated (values: dynamic_allocated,  static_allocated,
  *                 automatic_allocated).
  *   - visibility: A flag indicating the visibility of this entity (values: local,
  *                 external_visible,  external_allocated)
@@ -120,40 +127,6 @@ typedef enum {
                              This serves better as opposition to description _and_ inherited.*/
 } ir_peculiarity;
 
-/**
- * Additional method type properties:
- * Tell about special properties of a method type. Some
- * of these may be discovered by analyses.
- */
-typedef enum {
-       mtp_no_property        = 0x00000000, /**< no additional properties, default */
-       mtp_property_const     = 0x00000001, /**< This method did not access memory and calculates
-                                              its return values solely from its parameters.
-                                              GCC: __attribute__((const)). */
-       mtp_property_pure      = 0x00000002, /**< This method did NOT write to memory and calculates
-                                              its return values solely from its parameters and
-                                              the memory they points to (or global vars).
-                                              GCC: __attribute__((pure)). */
-       mtp_property_noreturn  = 0x00000004, /**< This method did not return due to an aborting system
-                                              call.
-                                              GCC: __attribute__((noreturn)). */
-       mtp_property_nothrow   = 0x00000008, /**< This method cannot throw an exception.
-                                              GCC: __attribute__((nothrow)). */
-       mtp_property_naked     = 0x00000010, /**< This method is naked.
-                                              GCC: __attribute__((naked)). */
-       mtp_property_malloc    = 0x00000020, /**< This method returns newly allocate memory.
-                                              GCC: __attribute__((malloc)). */
-       mtp_property_weak      = 0x00000040, /**< This method is weak. It is expected that
-                                              GCC: __attribute__((weak)). */
-       mtp_property_intrinsic = 0x00000080, /**< This method is intrinsic. It is expected that
-                                              a lowering phase will remove all calls to it. */
-       mtp_property_runtime   = 0x00000100, /**< This method represents a runtime routine. */
-       mtp_property_private   = 0x00000200, /**< All method invocations are known, the backend is free to
-                                              optimize the call in any possible way. */
-       mtp_property_inherited = (1<<31)     /**< Internal. Used only in irg's, means property is
-                                              inherited from type. */
-} mtp_additional_property;
-
 /**
  * Creates a new entity.
  *
@@ -265,7 +238,7 @@ ir_allocation get_entity_allocation(const ir_entity *ent);
 void set_entity_allocation(ir_entity *ent, ir_allocation al);
 
 /** Return the name of the allocation type. */
-const char *get_allocation_name(ir_allocation vis);
+const char *get_allocation_name(ir_allocation al);
 
 /** Returns the visibility of an entity. */
 ir_visibility get_entity_visibility(const ir_entity *ent);
@@ -311,17 +284,23 @@ void set_entity_volatility(ir_entity *ent, ir_volatility vol);
 /** Return the name of the volatility. */
 const char *get_volatility_name(ir_volatility var);
 
+/** Returns alignment of entity in bytes */
+unsigned get_entity_alignment(const ir_entity *entity);
+
+/** Sets alignment for entity in bytes */
+void set_entity_alignment(ir_entity *entity, unsigned alignment);
+
 /** This enumeration flags the align of Loads/Stores. */
 typedef enum {
        align_non_aligned,    /**< The entity is not aligned. */
        align_is_aligned      /**< The entity is aligned. Default */
 } ir_align;
 
-/** Returns the alignment of an entity. */
-ir_align get_entity_align(const ir_entity *ent);
+/** Returns indication wether entity is aligned in memory. */
+ir_align get_entity_aligned(const ir_entity *ent);
 
-/** Sets the alignment of an entity. */
-void  set_entity_align(ir_entity *ent, ir_align a);
+/** Sets indication wether entity is aligned in memory */
+void set_entity_aligned(ir_entity *ent, ir_align a);
 
 /** Return the name of the alignment. */
 const char *get_align_name(ir_align a);
@@ -386,6 +365,11 @@ int is_entity_final(const ir_entity *ent);
 /** Sets/resets the final flag of an entity. */
 void set_entity_final(ir_entity *ent, int final);
 
+/** Set label number of an entity with code type */
+void set_entity_label(ir_entity *ent, ir_label_t label);
+/** Return label number of an entity with code type */
+ir_label_t get_entity_label(const ir_entity *ent);
+
 /** Checks if an entity is compiler generated. */
 int is_entity_compiler_generated(const ir_entity *ent);
 
@@ -402,10 +386,13 @@ void set_entity_backend_marked(ir_entity *ent, int flag);
  * Bitfield type indicating the way an entity is used.
  */
 typedef enum {
-       ir_usage_address_taken    = 1 << 0,
-       ir_usage_write            = 1 << 1,
-       ir_usage_read             = 1 << 2,
-       ir_usage_reinterpret_cast = 1 << 3,
+       ir_usage_none             = 0,      /**< This entity is unused. */
+       ir_usage_address_taken    = 1 << 0, /**< The address of this entity was taken. */
+       ir_usage_write            = 1 << 1, /**< The entity was written to. */
+       ir_usage_read             = 1 << 2, /**< The entity was read. */
+       ir_usage_reinterpret_cast = 1 << 3, /**< The entity was read but with a wrong mode
+                                                (an implicit reinterpret cast) */
+       /** Unknown access */
        ir_usage_unknown
                = ir_usage_address_taken | ir_usage_write | ir_usage_read
                | ir_usage_reinterpret_cast
@@ -473,6 +460,9 @@ typedef enum ir_initializer_kind_t {
 /** returns kind of an initializer */
 ir_initializer_kind_t get_initializer_kind(const ir_initializer_t *initializer);
 
+/** Return the name of the initializer kind. */
+const char *get_initializer_kind_name(ir_initializer_kind_t ini);
+
 /**
  * returns the null initializer (there's only one instance of it in a program )
  */
@@ -507,107 +497,15 @@ void set_initializer_compound_value(ir_initializer_t *initializer,
 ir_initializer_t *get_initializer_compound_value(
                const ir_initializer_t *initializer, unsigned index);
 
-/** Creates a new compound graph path of given length. */
-compound_graph_path *new_compound_graph_path(ir_type *tp, int length);
-
-/** Returns non-zero if an object is a compound graph path */
-int is_compound_graph_path(const void *thing);
-
-/** Frees a graph path object */
-void free_compound_graph_path(compound_graph_path *gr);
-
-/** Returns the length of a graph path */
-int get_compound_graph_path_length(const compound_graph_path *gr);
-
-/** Get the entity node of an compound graph path at position pos. */
-ir_entity *get_compound_graph_path_node(const compound_graph_path *gr, int pos);
-/** Set the entity node of an compound graph path at position pos. */
-void      set_compound_graph_path_node(compound_graph_path *gr, int pos, ir_entity *node);
-/** Get the index of an compound graph path at position pos. */
-int       get_compound_graph_path_array_index(const compound_graph_path *gr, int pos);
-/** Set the index of an compound graph path at position pos. */
-void      set_compound_graph_path_array_index(compound_graph_path *gr, int pos, int index);
-/** Get the type of an compound graph path. */
-ir_type   *get_compound_graph_path_type(const compound_graph_path *gr);
-
-/** Checks whether the path up to pos is correct. If the path contains a NULL,
- *  assumes the path is not complete and returns non-zero. */
-int is_proper_compound_graph_path(compound_graph_path *gr, int pos);
-
-/* A value of a compound entity is a pair of a value and the description of the
-   corresponding access path to the member of the compound.  */
-void add_compound_ent_value_w_path(ir_entity *ent, ir_node *val, compound_graph_path *path);
-void set_compound_ent_value_w_path(ir_entity *ent, ir_node *val, compound_graph_path *path, int pos);
-
-/** Returns the number of constant values needed to initialize the entity.
- *
- *  Asserts if the entity has variability_uninitialized.
- * */
-int get_compound_ent_n_values(ir_entity *ent);
-/** Returns a constant value given the position. */
-ir_node *get_compound_ent_value(ir_entity *ent, int pos);
-/** Returns the access path for value at position pos. */
-compound_graph_path *get_compound_ent_value_path(ir_entity *ent, int pos);
-/** Returns a constant value given the access path.
- *  The path must contain array indices for all array element entities. */
-ir_node *get_compound_ent_value_by_path(ir_entity *ent, compound_graph_path *path);
-
-/** Removes all constant entries where the path ends at value_ent. Does not
-   free the memory of the paths.  (The same path might be used for several
-   constant entities. */
-void remove_compound_ent_value(ir_entity *ent, ir_entity *value_ent);
-
-/* Some languages support only trivial access paths, i.e., the member is a
-   direct, atomic member of the constant entities type. In this case the
-   corresponding entity can be accessed directly.  The following functions
-   allow direct access. */
-
-/** Generates a Path with length 1.
-    Beware: Has a bad runtime for array elements (O(|array|) and should be
-    avoided there. Use add_compound_ent_value_w_path() instead and create
-    the path manually. */
-void add_compound_ent_value(ir_entity *ent, ir_node *val, ir_entity *member);
-
-/** Returns the last member in the path */
-ir_entity *get_compound_ent_value_member(ir_entity *ent, int pos);
-
-/** Sets the path at pos 0 */
-void set_compound_ent_value(ir_entity *ent, ir_node *val, ir_entity *member, int pos);
-
 /** Sets the new style initializers of an entity. */
 void set_entity_initializer(ir_entity *entity, ir_initializer_t *initializer);
 
+/** Returns true, if an entity has new style initializers. */
+int has_entity_initializer(const ir_entity *entity);
+
 /** Return the new style initializers of an entity. */
 ir_initializer_t *get_entity_initializer(const ir_entity *entity);
 
-/** Initializes the entity ent which must be of a one dimensional
-   array type with the values given in the values array.
-   The array must have a lower and an upper bound.  Keeps the
-   order of values. Does not test whether the number of values
-   fits into the given array size.  Does not test whether the
-   values have the proper mode for the array. */
-void set_array_entity_values(ir_entity *ent, tarval **values, int num_vals);
-
-/**
- * Return the offset in bits from the last byte address.
- *
- * This requires that the layout of all concerned types is fixed.
- *
- * @param ent Any entity of compound type with at least pos initialization values.
- * @param pos The position of the value for which the offset is requested.
- */
-unsigned get_compound_ent_value_offset_bit_remainder(ir_entity *ent, int pos);
-
-/** Return the overall offset of value at position pos in bytes.
- *
- * This requires that the layout of all concerned types is fixed.
- * Asserts if bit offset is not byte aligned.
- *
- * @param ent Any entity of compound type with at least pos initialization values.
- * @param pos The position of the value for which the offset is requested.
- */
-unsigned get_compound_ent_value_offset_bytes(ir_entity *ent, int pos);
-
 /* --- Fields of entities with a class type as owner --- */
 /* Overwrites is a field that specifies that an access to the overwritten
    entity in the supertype must use this entity.  It's a list as with
@@ -645,7 +543,7 @@ int is_entity(const void *thing);
 /** Returns true if the type of the entity is a primitive, pointer
  * enumeration or method type.
  *
- * @Note This is a different classification than from is_primitive_type().
+ * @note This is a different classification than from is_primitive_type().
  */
 int is_atomic_entity(ir_entity *ent);
 /** Returns true if the type of the entity is a class, structure,
@@ -654,13 +552,6 @@ int is_compound_entity(ir_entity *ent);
 /** Returns true if the type of the entity is a Method type. */
 int is_method_entity(ir_entity *ent);
 
-/** Returns non-zero if ent1 and ent2 have are equal except for their owner.
-   Two entities are equal if
-    - they have the same type (the same C-struct)
-    - ...?
-*/
-int equal_entity(ir_entity *ent1, ir_entity *ent2);
-
 /** Outputs a unique number for this entity if libfirm is compiled for
  *  debugging, (configure with --enable-debug) else returns the address
  *  of the type cast to long.
@@ -737,7 +628,8 @@ ir_type *get_entity_repr_class(const ir_entity *ent);
  * - irg           = NULL
  * - link          = NULL
  */
-/* A variable that contains the only unknown entity. */
+
+/** A variable that contains the only unknown entity. */
 extern ir_entity *unknown_entity;
 
 /** Returns the @link unknown_entity unknown entity @endlink. */
@@ -765,8 +657,6 @@ typedef enum acc_bits {
  *  arrays, enumerations, pointers and primitive types.
  *  Special types with own opcodes are the id type, a type representing an unknown
  *  type and a type used to specify that something has no type.
- *
- *  @see type.h
  */
 
 /**
@@ -783,10 +673,10 @@ typedef enum {
        tpo_enumeration,         /**< An enumeration type. */
        tpo_pointer,             /**< A pointer type. */
        tpo_primitive,           /**< A primitive type. */
-       tpo_id,                  /**< Special Id tag used for type replacement. */
+       tpo_code,                /**< a piece of code (a basic block) */
        tpo_none,                /**< Special type for the None type. */
        tpo_unknown,             /**< Special code for the Unknown type. */
-       tpo_max                  /* not a type opcode */
+       tpo_last = tpo_unknown   /* not a type opcode */
 } tp_opcode;
 
 /**
@@ -795,7 +685,7 @@ typedef enum {
  * this is only the kind name, an enum for case-switching and some
  * internal values.
  *
- * @see  get_tpop_name(), get_tpop_code(), get_tpop_ident()
+ * @see  get_tpop_name(), get_tpop_code()
  */
 typedef struct tp_op tp_op;
 
@@ -816,14 +706,6 @@ const char *get_tpop_name(const tp_op *op);
  */
 tp_opcode get_tpop_code(const tp_op *op);
 
-/**
- * Returns the ident for the type opcode.
- *
- * @param op   The type opcode to get the ident from.
- * @return The ident.
- */
-ident *get_tpop_ident(const tp_op *op);
-
 /**
  * This type opcode marks that the corresponding type is a class type.
  *
@@ -833,8 +715,8 @@ ident *get_tpop_ident(const tp_op *op);
  * This struct is dynamically allocated but constant for the lifetime
  * of the library.
  */
-extern tp_op *type_class;
-tp_op *get_tpop_class(void);
+extern const tp_op *type_class;
+const tp_op *get_tpop_class(void);
 
 /**
  * This type opcode marks that the corresponding type is a compound type
@@ -845,8 +727,8 @@ tp_op *get_tpop_class(void);
  * This struct is dynamically allocated but constant for the lifetime
  * of the library.
  */
-extern tp_op *type_struct;
-tp_op *get_tpop_struct(void);
+extern const tp_op *type_struct;
+const tp_op *get_tpop_struct(void);
 
 /**
  * This type opcode marks that the corresponding type is a method type.
@@ -855,8 +737,8 @@ tp_op *get_tpop_struct(void);
  * This struct is dynamically allocated but constant for the lifetime
  * of the library.
  */
-extern tp_op *type_method;
-tp_op *get_tpop_method(void);
+extern const tp_op *type_method;
+const tp_op *get_tpop_method(void);
 
 /**
  * This type opcode marks that the corresponding type is a union type.
@@ -865,8 +747,8 @@ tp_op *get_tpop_method(void);
  * This struct is dynamically allocated but constant for the lifetime
  * of the library.
  */
-extern tp_op *type_union;
-tp_op *get_tpop_union(void);
+extern const tp_op *type_union;
+const tp_op *get_tpop_union(void);
 
 /**
  * This type opcode marks that the corresponding type is an array type.
@@ -876,8 +758,8 @@ tp_op *get_tpop_union(void);
  * This struct is dynamically allocated but constant for the lifetime
  * of the library.
  */
-extern tp_op *type_array;
-tp_op *get_tpop_array(void);
+extern const tp_op *type_array;
+const tp_op *get_tpop_array(void);
 
 /**
  * This type opcode marks that the corresponding type is an enumeration type.
@@ -888,8 +770,8 @@ tp_op *get_tpop_array(void);
  * This struct is dynamically allocated but constant for the lifetime
  * of the library.
  */
-extern tp_op *type_enumeration;
-tp_op *get_tpop_enumeration(void);
+extern const tp_op *type_enumeration;
+const tp_op *get_tpop_enumeration(void);
 
 /**
  * This type opcode marks that the corresponding type is a pointer type.
@@ -898,8 +780,8 @@ tp_op *get_tpop_enumeration(void);
  * This struct is dynamically allocated but constant for the lifetime
  * of the library.
  */
-extern tp_op *type_pointer;
-tp_op *get_tpop_pointer(void);
+extern const tp_op *type_pointer;
+const tp_op *get_tpop_pointer(void);
 
 /**
  * This type opcode marks that the corresponding type is a primitive type.
@@ -909,28 +791,14 @@ tp_op *get_tpop_pointer(void);
  * This struct is dynamically allocated but constant for the lifetime
  * of the library.
  */
-extern tp_op *type_primitive;
-tp_op *get_tpop_primitive(void);
+extern const tp_op *type_primitive;
+const tp_op *get_tpop_primitive(void);
 
 /**
- * This type opcode is an auxiliary opcode dedicated to support transformations
- * of the type structure.
- *
- * If a type is changed to another type with another
- * opcode the new type will be allocated with new memory.  All nodes refering
- * to the old type need to be changed to refer to the new one.  This is simplified
- * by turning the old type into an id type that merely forwards to the new type
- * that now replaces the old one.
- * type_ids should never be visible out of the type module.  All access routines
- * should automatically check for type_id and eventually follow the forward in
- * type_id.  Two types are exchanged by a call to exchange_types.
- * If a type_id is visible externally report this as bug.  If it is assured that
- * this never happens this extern variable can be moved to tpop_t.h.
- * This struct is dynamically allocated but constant for the lifetime
- * of the library.
+ * The code type is used to mark pieces of code (basic blocks)
  */
-extern tp_op *type_id;
-tp_op *get_tpop_id(void);
+extern const tp_op *tpop_code;
+const tp_op *get_tpop_code_type(void);
 
 /**
  * This type opcode is an auxiliary opcode dedicated to support type analyses.
@@ -940,8 +808,8 @@ tp_op *get_tpop_id(void);
  * contain a type or that are initialized for an analysis. There exists exactly
  * one type with this opcode.
  */
-extern tp_op *tpop_none;
-tp_op *get_tpop_none(void);
+extern const tp_op *tpop_none;
+const tp_op *get_tpop_none(void);
 
 /**
  * This type opcode is an auxiliary opcode dedicated to support type analyses.
@@ -951,8 +819,8 @@ tp_op *get_tpop_none(void);
  * yet) or to represent the top of a lattice (could not be determined).  There exists
  * exactly one type with this opcode.
  */
-extern tp_op *tpop_unknown;
-tp_op *get_tpop_unknown(void);
+extern const tp_op *tpop_unknown;
+const tp_op *get_tpop_unknown(void);
 
 /* ----------------------------------------------------------------------- */
 /* Classify pairs of types/entities in the inheritance relations.          */
@@ -1010,7 +878,7 @@ ir_entity *resolve_ent_polymorphy(ir_type *dynamic_class, ir_entity* static_ent)
  *
  *  Returns an ident that consists of the name of type followed by an
  *  underscore and the name (not ld_name) of the entity. */
-ident *default_mangle_inherited_name(ir_entity *ent, ir_type *clss);
+ident *default_mangle_inherited_name(const ir_entity *ent, const ir_type *clss);
 
 /** Type of argument functions for inheritance resolver.
  *
@@ -1019,7 +887,7 @@ ident *default_mangle_inherited_name(ir_entity *ent, ir_type *clss);
  *                used.
  * @param clss    The class type in which the new entity will be placed.
  */
-typedef ident *mangle_inherited_name_func(ir_entity *ent, ir_type *clss);
+typedef ident *mangle_inherited_name_func(const ir_entity *ent, const ir_type *clss);
 
 /** Resolve implicit inheritance.
  *
@@ -1074,7 +942,7 @@ inh_transitive_closure_state get_irp_inh_transitive_closure_state(void);
 /** Compute transitive closure of the subclass/superclass and
  * overwrites/overwrittenby relation.
  *
- * This function walks over the ir (O(#types+#entities)) to compute the
+ * This function walks over the ir (O(\#types+\#entities)) to compute the
  * transitive closure.    */
 void compute_inh_transitive_closure(void);
 
@@ -1126,8 +994,6 @@ ir_entity *get_entity_trans_overwrites_next(const ir_entity *ent);
  *   relation. Example: (A)(new C()).
  * any:  Cast operations do not conform with the transitive inheritance
  *   relation.  Example: (B2)(new B1())
- *
- *  @see: tropt.h
  */
 /* ----------------------------------------------------------------------- */
 
@@ -1144,16 +1010,16 @@ typedef enum {
        ir_class_casts_normalized = 2, /**< Class casts conform to inheritance edges. */
        ir_class_casts_state_max
 } ir_class_cast_state;
-char *get_class_cast_state_string(ir_class_cast_state s);
+const char *get_class_cast_state_string(ir_class_cast_state s);
 
 void                set_irg_class_cast_state(ir_graph *irg, ir_class_cast_state s);
-ir_class_cast_state get_irg_class_cast_state(ir_graph *irg);
+ir_class_cast_state get_irg_class_cast_state(const ir_graph *irg);
 void                set_irp_class_cast_state(ir_class_cast_state s);
 ir_class_cast_state get_irp_class_cast_state(void);
 
 /** Verify the class cast state of an irg.
  *
- *  Asserts if state is to high, outputs warning if state is to low
+ *  Asserts if state is to high, outputs debug warning if state is to low
  *  and firm verbosity is set.
  */
 void verify_irg_class_cast_state(ir_graph *irg);
@@ -1215,38 +1081,6 @@ int tr_vrfy(void);
 #define TR_VRFY()      tr_vrfy()
 #endif
 
-/**
- *
- * @file typegmod.h
- *  This module supplies routines that support changing the type graph.
- */
-
-/** Replaces one type by the other.
- *
- *  Old type is replaced by new_type.  All references to old_type
- *  now point to new_type.  The memory for the old type is destroyed,
- *  but still used.  Therefore it is not freed.
- *  All referenced to this memory will be lost after a certain while.
- *  An exception is the list of types in irp (irprog.h).
- *  In the future there might be a routine to recover the memory, but
- *  this will be at considerable runtime cost.
- *
- *  @param old_type  - The old type that shall be replaced by the new type.
- *  @param new_type  - The new type that will replace old_type.
- *
- */
-void exchange_types(ir_type *old_type, ir_type *new_type);
-
-/** Skip id types until a useful type is reached.
- *
- *  @param tp - A type of arbitrary kind.
- *
- *  @return
- *    tp if it is not an id type.
- *    If tp is an id type returns the real type it stands for.
- */
-ir_type *skip_tid(ir_type *tp);
-
 /**
  * @page type   representation of types
  *
@@ -1266,12 +1100,8 @@ ir_type *skip_tid(ir_type *tp);
  *  Types are different from the modes defined in irmode:  Types are
  *  on the level of the programming language, modes at the level of
  *  the target processor.
- *
- *  @see  tpop.h
  */
 
-#include "typerep.h"
-
 /** Frees all entities associated with a type.
  *  Does not free the array entity.
  *  Warning: ensure these entities are not referenced anywhere else.
@@ -1494,7 +1324,7 @@ int is_type(const void *thing);
  *      - the same element type
  *    - they are enumeration types and have the same enumerator names
  *    - they are pointer types and have the identical points_to type
- *      (i.e., the same C-struct to represent the type, type_id is skipped.
+ *      (i.e., the same C-struct to represent the type.
  *       This is to avoid endless recursions; with pointer types cyclic
  *       type graphs are possible.)
  */
@@ -1704,14 +1534,6 @@ void remove_class_supertype(ir_type *clss, ir_type *supertype);
 #define set_class_base_type(clss, basetype, pos)   set_class_supertype(clss, basetype, pos)
 #define remove_class_base_type(clss, basetype)     remove_class_supertype(clss, basetype)
 
-/** Convenience macro */
-#define add_class_base_type(clss, basetype)        add_class_supertype(clss, basetype)
-#define get_class_n_base_types(clss)               get_class_n_supertypes(clss)
-#define get_class_base_type_index(clss, base_clss) get_class_supertype_index(clss, base_clss)
-#define get_class_base_type(clss, pos)             get_class_supertype(clss, pos)
-#define set_class_base_type(clss, basetype, pos)   set_class_supertype(clss, basetype, pos)
-#define remove_class_base_type(clss, basetype)     remove_class_supertype(clss, basetype)
-
 /** Returns a human readable string for a peculiarity. */
 const char *get_peculiarity_name(ir_peculiarity p);
 
@@ -1889,6 +1711,10 @@ void set_method_param_type(ir_type *method, int pos, ir_type *tp);
 /** Returns an entity that represents the copied value argument.  Only necessary
    for compounds passed by value. This information is constructed only on demand. */
 ir_entity *get_method_value_param_ent(ir_type *method, int pos);
+/**
+ * Sets the type that represents the copied value arguments.
+ */
+void set_method_value_param_type(ir_type *method, ir_type *tp);
 /**
  * Returns a type that represents the copied value arguments if one
  * was allocated, else NULL.
@@ -1925,19 +1751,19 @@ ir_type *get_method_value_res_type(const ir_type *method);
  * variable amount of arguments (e.g. C's printf). Default is
  * non_variadic.
  */
-typedef enum variadicity {
-  variadicity_non_variadic, /**< non variadic */
-  variadicity_variadic      /**< variadic */
-} variadicity;
+typedef enum ir_variadicity {
+       variadicity_non_variadic, /**< non variadic */
+       variadicity_variadic      /**< variadic */
+} ir_variadicity;
 
 /** Returns the null-terminated name of this variadicity. */
-const char *get_variadicity_name(variadicity vari);
+const char *get_variadicity_name(ir_variadicity vari);
 
 /** Returns the variadicity of a method. */
-variadicity get_method_variadicity(const ir_type *method);
+ir_variadicity get_method_variadicity(const ir_type *method);
 
 /** Sets the variadicity of a method. */
-void set_method_variadicity(ir_type *method, variadicity vari);
+void set_method_variadicity(ir_type *method, ir_variadicity vari);
 
 /**
  * Returns the first variadic parameter index of a type.
@@ -2270,7 +2096,7 @@ ir_type *get_pointer_points_to_type(ir_type *pointer);
 int is_Pointer_type(const ir_type *pointer);
 
 /** Returns the first pointer type that has as points_to tp.
- *  Not efficient: O(#types).
+ *  Not efficient: O(\#types).
  *  If not found returns firm_unknown_type. */
 ir_type *find_pointer_type_to_type(ir_type *tp);
 
@@ -2316,8 +2142,13 @@ void set_primitive_base_type(ir_type *tp, ir_type *base_tp);
 /** A variable that contains the only none type. */
 extern ir_type *firm_none_type;
 
+/** A variable that contains the only code type. */
+extern ir_type *firm_code_type;
+
 /** Returns the none type. */
 ir_type *get_none_type(void);
+/** Returns the code type. */
+ir_type *get_code_type(void);
 
 /**
  * @page unknown_type  The Unknown type
@@ -2389,6 +2220,11 @@ int get_compound_member_index(const ir_type *tp, ir_entity *member);
  */
 int is_compound_type(const ir_type *tp);
 
+/**
+ * Checks wether a type is a code type.
+ */
+int is_code_type(const ir_type *tp);
+
 /**
  * Checks, whether a type is a frame type.
  */
@@ -2404,6 +2240,13 @@ int is_value_param_type(const ir_type *tp);
  */
 int is_lowered_type(const ir_type *tp);
 
+/**
+ * Makes a new value type. Value types are struct types,
+ * so all struct access functions work.
+ * Value types are not in the global list of types.
+ */
+ir_type *new_type_value(ident *name);
+
 /**
  * Makes a new frame type. Frame types are class types,
  * so all class access functions work.
@@ -2544,26 +2387,6 @@ ir_type *mature_type_free(ir_type *tp);
  */
 ir_type *mature_type_free_entities(ir_type *tp);
 
-/**
- * The interface type for the type identify module;
- */
-typedef struct _type_identify_if_t {
-       compare_types_func_t *cmp;    /**< The function that should be used to compare two types.
-                                          If NULL, compare_strict() will be used. */
-       hash_types_func_t *hash;      /**< The function that should be used to calculate a hash
-                                          value of a type. If NULL, hash_name() will be used. */
-} type_identify_if_t;
-
-/**
- * Initialise the type identifier module.
- *
- * @param ti_if    The interface functions for this module.
- *
- * If the parameter ti_if is NULL, the default functions compare_strict() and
- * firm_hash_name() will be used.
- */
-void init_type_identify(type_identify_if_t *ti_if);
-
 /** A data type to treat types and entities as the same. */
 typedef union {
        ir_type   *typ;   /**< points to a type */
@@ -2590,6 +2413,10 @@ typedef void class_walk_func(ir_type *clss, void *env);
  *  Does not touch frame types or types for value params ... */
 void type_walk(type_walk_func *pre, type_walk_func *post, void *env);
 
+/** Touches every type, entity, frame type, and value param type in
+ *  unspecified order (also all segment types). */
+void type_walk_prog(type_walk_func *pre, type_walk_func *post, void *env);
+
 /** Walks over all type information reachable from an ir graph.
  *
  *  Walks over all type information reachable from irg, i.e., starts a
@@ -2630,8 +2457,6 @@ void type_walk_super(type_walk_func *pre, type_walk_func *post, void *env);
    Then iterates to subclasses.  Executes post after return from
    subclass.
    Does not visit global type, frame types.
-
-   @bug ?? something is wrong with this.
 */
 void class_walk_super2sub(class_walk_func *pre, class_walk_func *post,
                           void *env);