return 0;
}
+
+/* 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(type *low, type *high) {
+ while (is_Pointer_type(low) && is_Pointer_type(high)) {
+ low = get_pointer_points_to_type(low);
+ high = get_pointer_points_to_type(high);
+ }
+
+ if (is_Class_type(low) && is_Class_type(high))
+ return is_subclass_of(low, high);
+ return 0;
+}
+
int is_superclass_of(type *high, type *low) {
return is_subclass_of(low, high);
}
+int is_superclass_ptr_of(type *high, type *low) {
+ return is_subclass_ptr_of(low, high);
+}
+
int is_overwritten_by(entity *high, entity *low) {
int i, n_overwrittenby;
assert(is_entity(low) && is_entity(high));
ccs_env *ccs = (ccs_env *)env;
ir_class_cast_state this_state = ir_class_casts_any;
+ if (get_irn_op(n) != op_Cast) return;
+
type *fromtype = get_irn_typeinfo_type(get_Cast_op(n));
type *totype = get_Cast_type(n);
int ref_depth = 0;
* subclasses of high. */
int is_subclass_of(type *low, 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(type *low, type *high);
+
/** Returns true if high is superclass of low.
*
* Low is a subclass of high if low == high or if low is a subclass of
* subclasses of high. */
int is_superclass_of(type *high, type *low);
+/** 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. */
+int is_subclass_ptr_of(type *low, type *high);
+
/** Returns true if high is (transitive) overwritten by low.
*
* Returns false if high == low. */
/* */
/* 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.