-static void compute_down_closure(type *tp) {
- pset *myset, *subset;
- int i, n_subtypes, n_members, n_supertypes;
- unsigned long master_visited = get_master_type_visited();
-
- assert(is_Class_type(tp));
-
- set_type_visited(tp, master_visited-1);
-
- /* Recursive descend. */
- n_subtypes = get_class_n_subtypes(tp);
- for (i = 0; i < n_subtypes; ++i) {
- type *stp = get_class_subtype(tp, i);
- if (type_not_visited(stp)) {
- assert(get_type_visited(tp) < master_visited-1);
- compute_down_closure(stp);
- }
- }
-
- /* types */
- myset = get_type_map(tp, d_down);
- for (i = 0; i < n_subtypes; ++i) {
- type *stp = get_class_subtype(tp, i);
- subset = get_type_map(stp, d_down);
- pset_insert_ptr(myset, stp);
- pset_insert_pset_ptr(myset, subset);
- }
-
- /* entities */
- n_members = get_class_n_members(tp);
- for (i = 0; i < n_members; ++i) {
- entity *mem = get_class_member(tp, i);
- int j, n_overwrittenby = get_entity_n_overwrittenby(mem);
-
- myset = get_entity_map(mem, d_down);
- for (j = 0; j > n_overwrittenby; ++j) {
- entity *ov = get_entity_overwrittenby(mem, j);
- subset = get_entity_map(ov, d_down);
- pset_insert_pset_ptr(myset, subset);
- pset_insert_ptr(myset, ov);
- }
- }
-
- mark_type_visited(tp);
-
- /* Walk up. */
- n_supertypes = get_class_n_supertypes(tp);
- for (i = 0; i < n_supertypes; ++i) {
- type *stp = get_class_supertype(tp, i);
- if (get_type_visited(tp) < master_visited-1) {
- compute_down_closure(stp);
- }
- }
-}
-
-static void compute_up_closure(type *tp) {
- pset *myset, *subset;
- int i, n_subtypes, n_members, n_supertypes;
- int master_visited = get_master_type_visited();
-
- assert(is_Class_type(tp));
-
- set_type_visited(tp, master_visited-1);
-
- /* Recursive descend. */
- n_supertypes = get_class_n_supertypes(tp);
- for (i = 0; i < n_supertypes; ++i) {
- type *stp = get_class_supertype(tp, i);
- if (type_not_visited(stp)) {
- assert(get_type_visited(tp) < get_master_type_visited()-1);
- compute_up_closure(stp);
- }
- }
-
- /* types */
- myset = get_type_map(tp, d_up);
- for (i = 0; i < n_supertypes; ++i) {
- type *stp = get_class_supertype(tp, i);
- subset = get_type_map(stp, d_up);
- pset_insert_ptr(myset, stp);
- pset_insert_pset_ptr(myset, subset);
- }
-
- /* entities */
- n_members = get_class_n_members(tp);
- for (i = 0; i < n_members; ++i) {
- entity *mem = get_class_member(tp, i);
- int j, n_overwrites = get_entity_n_overwrites(mem);
-
- myset = get_entity_map(mem, d_up);
- for (j = 0; j > n_overwrites; ++j) {
- entity *ov = get_entity_overwrites(mem, j);
- subset = get_entity_map(ov, d_up);
- pset_insert_pset_ptr(myset, subset);
- pset_insert_ptr(myset, ov);
- }
- }
-
- mark_type_visited(tp);
-
- /* Walk down. */
- n_subtypes = get_class_n_subtypes(tp);
- for (i = 0; i < n_subtypes; ++i) {
- type *stp = get_class_subtype(tp, i);
- if (get_type_visited(tp) < master_visited-1) {
- compute_up_closure(stp);
- }
- }
-}
-
-/** Compute the transitive closure of the subclass/superclass and
- * overwrites/overwrittenby relation.
- *
- * This function walks over the ir (O(#types+#entities)) to compute the
- * transitive closure. */
-void compute_inh_transitive_closure(void) {
- int i, n_types = get_irp_n_types();
- free_inh_transitive_closure();
-
- /* The 'down' relation */
- inc_master_type_visited(); /* Inc twice: one if on stack, second if values computed. */
- inc_master_type_visited();
- for (i = 0; i < n_types; ++i) {
- type *tp = get_irp_type(i);
- if (is_Class_type(tp) && type_not_visited(tp)) { /* For others there is nothing to accumulate. */
- int j, n_subtypes = get_class_n_subtypes(tp);
- int has_unmarked_subtype = false;
-
- assert(get_type_visited(tp) < get_master_type_visited()-1);
- for (j = 0; j < n_subtypes && !has_unmarked_subtype; ++j) {
- type *stp = get_class_subtype(tp, j);
- if (type_not_visited(stp)) has_unmarked_subtype = true;
- }
-
- /* This is a good starting point. */
- if (!has_unmarked_subtype)
- compute_down_closure(tp);
- }
- }
-
- /* The 'up' relation */
- inc_master_type_visited();
- inc_master_type_visited();
- for (i = 0; i < n_types; ++i) {
- type *tp = get_irp_type(i);
- if (is_Class_type(tp) && type_not_visited(tp)) { /* For others there is nothing to accumulate. */
- int j, n_supertypes = get_class_n_supertypes(tp);
- int has_unmarked_supertype = false;
-
- assert(get_type_visited(tp) < get_master_type_visited()-1);
- for (j = 0; j < n_supertypes && !has_unmarked_supertype; ++j) {
- type *stp = get_class_supertype(tp, j);
- if (type_not_visited(stp)) has_unmarked_supertype = true;
- }
-
- /* This is a good starting point. */
- if (!has_unmarked_supertype)
- compute_up_closure(tp);
- }
- }
-
- irp->inh_trans_closure_state = inh_transitive_closure_valid;
-}
-
-/** Free memory occupied by the transitive closure information. */
-void free_inh_transitive_closure(void) {
- if (tr_inh_trans_set) {
- tr_inh_trans_tp *elt;
- for (elt = set_first(tr_inh_trans_set); elt; elt = set_next(tr_inh_trans_set)) {
- del_pset(elt->up);
- del_pset(elt->down);
- }
- del_set(tr_inh_trans_set);
- tr_inh_trans_set = NULL;
- }
- irp->inh_trans_closure_state = inh_transitive_closure_none;
+static void compute_down_closure(ir_type *tp)
+{
+ pset *myset, *subset;
+ size_t i, n_subtypes, n_members, n_supertypes;
+ ir_visited_t master_visited = get_master_type_visited();
+
+ assert(is_Class_type(tp));
+
+ set_type_visited(tp, master_visited-1);
+
+ /* Recursive descend. */
+ n_subtypes = get_class_n_subtypes(tp);
+ for (i = 0; i < n_subtypes; ++i) {
+ ir_type *stp = get_class_subtype(tp, i);
+ if (get_type_visited(stp) < master_visited-1) {
+ compute_down_closure(stp);
+ }
+ }
+
+ /* types */
+ myset = get_type_map(tp, d_down);
+ for (i = 0; i < n_subtypes; ++i) {
+ ir_type *stp = get_class_subtype(tp, i);
+ subset = get_type_map(stp, d_down);
+ pset_insert_ptr(myset, stp);
+ pset_insert_pset_ptr(myset, subset);
+ }
+
+ /* entities */
+ n_members = get_class_n_members(tp);
+ for (i = 0; i < n_members; ++i) {
+ ir_entity *mem = get_class_member(tp, i);
+ size_t j, n_overwrittenby = get_entity_n_overwrittenby(mem);
+
+ myset = get_entity_map(mem, d_down);
+ for (j = 0; j < n_overwrittenby; ++j) {
+ ir_entity *ov = get_entity_overwrittenby(mem, j);
+ subset = get_entity_map(ov, d_down);
+ pset_insert_ptr(myset, ov);
+ pset_insert_pset_ptr(myset, subset);
+ }
+ }
+
+ mark_type_visited(tp);
+
+ /* Walk up. */
+ n_supertypes = get_class_n_supertypes(tp);
+ for (i = 0; i < n_supertypes; ++i) {
+ ir_type *stp = get_class_supertype(tp, i);
+ if (get_type_visited(stp) < master_visited-1) {
+ compute_down_closure(stp);
+ }
+ }
+}
+
+static void compute_up_closure(ir_type *tp)
+{
+ pset *myset, *subset;
+ size_t i, n_subtypes, n_members, n_supertypes;
+ ir_visited_t master_visited = get_master_type_visited();
+
+ assert(is_Class_type(tp));
+
+ set_type_visited(tp, master_visited-1);
+
+ /* Recursive descend. */
+ n_supertypes = get_class_n_supertypes(tp);
+ for (i = 0; i < n_supertypes; ++i) {
+ ir_type *stp = get_class_supertype(tp, i);
+ if (get_type_visited(stp) < get_master_type_visited()-1) {
+ compute_up_closure(stp);
+ }
+ }
+
+ /* types */
+ myset = get_type_map(tp, d_up);
+ for (i = 0; i < n_supertypes; ++i) {
+ ir_type *stp = get_class_supertype(tp, i);
+ subset = get_type_map(stp, d_up);
+ pset_insert_ptr(myset, stp);
+ pset_insert_pset_ptr(myset, subset);
+ }
+
+ /* entities */
+ n_members = get_class_n_members(tp);
+ for (i = 0; i < n_members; ++i) {
+ ir_entity *mem = get_class_member(tp, i);
+ size_t j, n_overwrites = get_entity_n_overwrites(mem);
+
+ myset = get_entity_map(mem, d_up);
+ for (j = 0; j < n_overwrites; ++j) {
+ ir_entity *ov = get_entity_overwrites(mem, j);
+ subset = get_entity_map(ov, d_up);
+ pset_insert_pset_ptr(myset, subset);
+ pset_insert_ptr(myset, ov);
+ }
+ }
+
+ mark_type_visited(tp);
+
+ /* Walk down. */
+ n_subtypes = get_class_n_subtypes(tp);
+ for (i = 0; i < n_subtypes; ++i) {
+ ir_type *stp = get_class_subtype(tp, i);
+ if (get_type_visited(stp) < master_visited-1) {
+ compute_up_closure(stp);
+ }
+ }
+}
+
+void compute_inh_transitive_closure(void)
+{
+ size_t i, n_types = get_irp_n_types();
+ free_inh_transitive_closure();
+
+ /* The 'down' relation */
+ irp_reserve_resources(irp, IRP_RESOURCE_TYPE_VISITED);
+ inc_master_type_visited(); /* Inc twice: one if on stack, second if values computed. */
+ inc_master_type_visited();
+ for (i = 0; i < n_types; ++i) {
+ ir_type *tp = get_irp_type(i);
+ if (is_Class_type(tp) && type_not_visited(tp)) { /* For others there is nothing to accumulate. */
+ size_t j, n_subtypes = get_class_n_subtypes(tp);
+ int has_unmarked_subtype = 0;
+
+ assert(get_type_visited(tp) < get_master_type_visited()-1);
+ for (j = 0; j < n_subtypes; ++j) {
+ ir_type *stp = get_class_subtype(tp, j);
+ if (type_not_visited(stp)) {
+ has_unmarked_subtype = 1;
+ break;
+ }
+ }
+
+ /* This is a good starting point. */
+ if (!has_unmarked_subtype)
+ compute_down_closure(tp);
+ }
+ }
+
+ /* The 'up' relation */
+ inc_master_type_visited();
+ inc_master_type_visited();
+ for (i = 0; i < n_types; ++i) {
+ ir_type *tp = get_irp_type(i);
+ if (is_Class_type(tp) && type_not_visited(tp)) { /* For others there is nothing to accumulate. */
+ size_t j, n_supertypes = get_class_n_supertypes(tp);
+ int has_unmarked_supertype = 0;
+
+ assert(get_type_visited(tp) < get_master_type_visited()-1);
+ for (j = 0; j < n_supertypes; ++j) {
+ ir_type *stp = get_class_supertype(tp, j);
+ if (type_not_visited(stp)) {
+ has_unmarked_supertype = 1;
+ break;
+ }
+ }
+
+ /* This is a good starting point. */
+ if (!has_unmarked_supertype)
+ compute_up_closure(tp);
+ }
+ }
+
+ irp->inh_trans_closure_state = inh_transitive_closure_valid;
+ irp_free_resources(irp, IRP_RESOURCE_TYPE_VISITED);
+}
+
+void free_inh_transitive_closure(void)
+{
+ if (tr_inh_trans_set) {
+ foreach_set(tr_inh_trans_set, tr_inh_trans_tp, elt) {
+ del_pset(elt->directions[d_up]);
+ del_pset(elt->directions[d_down]);
+ }
+ del_set(tr_inh_trans_set);
+ tr_inh_trans_set = NULL;
+ }
+ irp->inh_trans_closure_state = inh_transitive_closure_none;