/**
- *
- * @file tp_inheritance.h
+ * @file tr_inheritance.h
*
* Project: libFIRM <br>
* File name: ir/tr/tp_inheritance.h <br>
#ifndef _TR_INHERITANCE_H_
#define _TR_INHERITANCE_H_
+#include "firm_types.h"
#include "type.h"
-/*#include "entity.h"*/
#include "ident.h"
-
-/* to resolve recursion between entity.h and irgraph.h */
-#ifndef _IR_GRAPH_TYPEDEF_
-#define _IR_GRAPH_TYPEDEF_
-typedef struct ir_graph ir_graph;
-#endif
-
/* ----------------------------------------------------------------------- */
/* Classify pairs of types/entities in the inheritance relations. */
/* ----------------------------------------------------------------------- */
* a subclass of high. I.e, we search in all subtypes of high for low.
* @@@ this can be implemented more efficient if we know the set of all
* subclasses of high. */
-int is_subclass_of(type *low, type *high);
+int is_SubClass_of(ir_type *low, ir_type *high);
+
+/** Subclass check for pointers to classes.
+ *
+ * Dereferences at both types the same amount of pointer types (as
+ * many as possible). If the remaining types are both class types
+ * and subclasses, returns true, else false. Can also be called with
+ * two class types. */
+int is_SubClass_ptr_of(ir_type *low, ir_type *high);
/** Returns true if high is superclass of low.
*
* a subclass of high. I.e, we search in all subtypes of high for low.
* @@@ this can be implemented more efficient if we know the set of all
* subclasses of high. */
-int is_superclass_of(type *high, type *low);
+#define is_SuperClass_of(high, low) is_SubClass_of(low, high)
+
+/** Superclass check for pointers to classes.
+ *
+ * Dereferences at both types the same amount of pointer types (as
+ * many as possible). If the remaining types are both class types
+ * and superclasses, returns true, else false. Can also be called with
+ * two class types. */
+#define is_SuperClass_ptr_of(low, high) is_SubClass_ptr_of(high, low)
/** Returns true if high is (transitive) overwritten by low.
*
* Returns false if high == low. */
int is_overwritten_by(entity *high, entity *low);
-/** Resolve polymorphy in the inheritance relation.
+/** Resolve polymorphism in the inheritance relation.
*
* Returns the dynamically referenced entity if the static entity and the
* dynamic type are given.
* Searches downwards in overwritten tree. */
-entity *resolve_ent_polymorphy(type *dynamic_class, entity* static_ent);
+entity *resolve_ent_polymorphy(ir_type *dynamic_class, entity* static_ent);
/* ----------------------------------------------------------------------- */
/* Resolve implicit inheritance. */
*
* 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(entity *super, type *clss);
+ident *default_mangle_inherited_name(entity *super, ir_type *clss);
/** Type of argument functions for inheritance resolver.
*
* used.
* @param clss The class type in which the new entity will be placed.
*/
-typedef ident *mangle_inherited_name_func(entity *super, type *clss);
+typedef ident *mangle_inherited_name_func(entity *super, ir_type *clss);
/** Resolve implicit inheritance.
*
/* */
/* The transitive edges are held in a set, not in an array as the */
/* underlying relation. */
+/* */
+/* Do the sets contain the node itself? I assume NOT! */
/* ----------------------------------------------------------------------- */
/** The state of the transitive closure.
*
- * @TODO: we could manage the state for each relation separately. Invalidating
+ * @todo: we could manage the state for each relation separately. Invalidating
* the entity relations does not mean invalidating the class relation. */
typedef enum {
inh_transitive_closure_none, /**< Closure is not computed, can not be accessed. */
/* - subtype ------------------------------------------------------------- */
/** Iterate over all transitive subtypes. */
-type *get_class_trans_subtype_first(type *tp);
-type *get_class_trans_subtype_next (type *tp);
-int is_class_trans_subtype (type *tp, type *subtp);
+ir_type *get_class_trans_subtype_first(ir_type *tp);
+ir_type *get_class_trans_subtype_next (ir_type *tp);
+int is_class_trans_subtype (ir_type *tp, ir_type *subtp);
/* - supertype ----------------------------------------------------------- */
/** Iterate over all transitive supertypes. */
-type *get_class_trans_supertype_first(type *tp);
-type *get_class_trans_supertype_next (type *tp);
+ir_type *get_class_trans_supertype_first(ir_type *tp);
+ir_type *get_class_trans_supertype_next (ir_type *tp);
/* - overwrittenby ------------------------------------------------------- */
the class hierarchy. @@@ So far this does not happen in Firm. */
ir_class_casts_transitive = 1, /**< Class casts conform to transitive inheritance edges. Default. */
ir_class_casts_normalized = 2, /**< Class casts conform to inheritance edges. */
- ir_class_casts_state_max,
+ ir_class_casts_state_max
} ir_class_cast_state;
char *get_class_cast_state_string(ir_class_cast_state s);