struct types still require names.
[libfirm] / ir / tr / typewalk.c
index f20857d..4620e85 100644 (file)
@@ -102,11 +102,13 @@ static void do_type_walk(type_or_ent tore,
                ent = tore.ent;
                if (entity_visited(ent))
                        return;
+               mark_entity_visited(ent);
                break;
        case k_type:
-               tp = skip_tid(tore.typ);
+               tp = tore.typ;
                if (type_visited(tp))
                        return;
+               mark_type_visited(tp);
                break;
        default:
                break;
@@ -119,7 +121,6 @@ static void do_type_walk(type_or_ent tore,
        /* iterate */
        switch (get_kind(tore.ent)) {
        case k_entity:
-               mark_entity_visited(ent);
                cont.typ = get_entity_owner(ent);
                do_type_walk(cont, pre, post, env);
                cont.typ = get_entity_type(ent);
@@ -142,7 +143,6 @@ static void do_type_walk(type_or_ent tore,
                }
                break;
        case k_type:
-               mark_type_visited(tp);
                switch (get_type_tpop_code(tp)) {
                case tpo_class:
                        n_types = get_class_n_supertypes(tp);
@@ -291,7 +291,7 @@ void type_walk_prog(type_walk_func *pre, type_walk_func *post, void *env) {
                        do_type_walk(cont, pre, post, env);
        }
 
-       for (i = 0; i < IR_SEGMENT_COUNT; ++i) {
+       for (i = IR_SEGMENT_FIRST; i <= IR_SEGMENT_LAST; ++i) {
                cont.typ = get_segment_type((ir_segment_t) i);
                if(cont.typ)
                        do_type_walk(cont, pre, post, env);
@@ -350,11 +350,6 @@ static void type_walk_s2s_2(type_or_ent tore,
                if (entity_visited(tore.ent)) return;
                break;
        case k_type:
-               if (type_id == get_type_tpop(tore.typ)) {
-                       cont.typ = skip_tid(tore.typ);
-                       type_walk_s2s_2(cont, pre, post, env);
-                       return;
-               }
                if (type_visited(tore.typ)) return;
                break;
        default:
@@ -378,7 +373,6 @@ static void type_walk_s2s_2(type_or_ent tore,
                                        /* execute pre method */
                                        if (pre)
                                                pre(tore, env);
-                                       tp = skip_tid(tp);
 
                                        n = get_class_n_subtypes(tp);
                                        for (i = 0; i < n; ++i) {
@@ -447,11 +441,6 @@ type_walk_super_2(type_or_ent tore,
                        return;
                break;
        case k_type:
-               if (type_id == get_type_tpop(tore.typ)) {
-                       cont.typ = skip_tid(tore.typ);
-                       type_walk_super_2(cont, pre, post, env);
-                       return;
-               }
                if (type_visited(tore.typ))
                        return;
                break;
@@ -471,7 +460,6 @@ type_walk_super_2(type_or_ent tore,
                                        /* execute pre method */
                                        if (pre)
                                                pre(tore, env);
-                                       tp = skip_tid(tp);
 
                                        n = get_class_n_supertypes(tp);
                                        for (i = 0; i < n; ++i) {
@@ -550,7 +538,6 @@ class_walk_s2s_2(ir_type *tp,
        if (pre)
                pre(tp, env);
 
-       tp = skip_tid(tp);
        n = get_class_n_subtypes(tp);
        for (i = 0; i < n; ++i) {
                class_walk_s2s_2(get_class_subtype(tp, i), pre, post, env);