moved verification flags from irvrfy to irflag
[libfirm] / ir / tr / typewalk.c
index 0e2013b..267a6e9 100644 (file)
@@ -62,9 +62,9 @@ static void do_type_walk(type_or_ent *tore,
                        type_walk_func *post,
                        void *env)
 {
-  int     i;
+  int     i, n_types, n_mem;
   entity  *ent;
-  type    *tp;
+  ir_type *tp;
   ir_node *n;
 
   /* marked? */
@@ -74,7 +74,7 @@ static void do_type_walk(type_or_ent *tore,
     if (entity_visited(ent)) return;
     break;
   case k_type:
-    tp = skip_tid((type *)tore);
+    tp = skip_tid((ir_type *)tore);
     if (type_visited(tp)) return;
     break;
   default:
@@ -99,7 +99,8 @@ static void do_type_walk(type_or_ent *tore,
         irn_type_walker(n, pre, post, env);
       }
       else {
-        for (i = 0; i < get_compound_ent_n_values(ent); ++i) {
+        n_mem = get_compound_ent_n_values(ent);
+        for (i = 0; i < n_mem; ++i) {
           n = get_compound_ent_value(ent, i);
           irn_type_walker(n, pre, post, env);
         }
@@ -111,28 +112,38 @@ static void do_type_walk(type_or_ent *tore,
     switch (get_type_tpop_code(tp)) {
 
     case tpo_class:
-           for (i = 0; i < get_class_n_supertypes(tp); i++)
-             do_type_walk((type_or_ent *)get_class_supertype(tp, i), pre, post, env);
-           for (i = 0; i < get_class_n_members(tp); i++)
-             do_type_walk((type_or_ent *)get_class_member(tp, i), pre, post, env);
-           for (i = 0; i < get_class_n_subtypes(tp); i++)
-             do_type_walk((type_or_ent *)get_class_subtype(tp, i), pre, post, env);
+      n_types = get_class_n_supertypes(tp);
+      for (i = 0; i < n_types; ++i)
+        do_type_walk((type_or_ent *)get_class_supertype(tp, i), pre, post, env);
+
+      n_mem = get_class_n_members(tp);
+      for (i = 0; i < n_mem; ++i)
+        do_type_walk((type_or_ent *)get_class_member(tp, i), pre, post, env);
+
+      n_types = get_class_n_subtypes(tp);
+      for (i = 0; i < n_types; ++i)
+        do_type_walk((type_or_ent *)get_class_subtype(tp, i), pre, post, env);
       break;
 
     case tpo_struct:
-           for (i = 0; i<get_struct_n_members(tp); i++)
-             do_type_walk((type_or_ent *)get_struct_member(tp, i), pre, post, env);
-           break;
+      n_mem = get_struct_n_members(tp);
+      for (i = 0; i < n_mem; ++i)
+        do_type_walk((type_or_ent *)get_struct_member(tp, i), pre, post, env);
+      break;
 
     case tpo_method:
-      for (i = 0; i < get_method_n_params(tp); i++)
+      n_mem = get_method_n_params(tp);
+      for (i = 0; i < n_mem; ++i)
         do_type_walk((type_or_ent *)get_method_param_type(tp, i), pre, post, env);
-      for (i = 0; i < get_method_n_ress(tp); i++)
+
+      n_mem = get_method_n_ress(tp);
+      for (i = 0; i < n_mem; ++i)
         do_type_walk((type_or_ent *)get_method_res_type(tp, i), pre, post, env);
       break;
 
     case tpo_union:
-      for (i = 0; i < get_union_n_members(tp); i++)
+      n_mem = get_union_n_members(tp);
+      for (i = 0; i < n_mem; ++i)
         do_type_walk((type_or_ent *)get_union_member(tp, i), pre, post, env);
          break;
 
@@ -181,36 +192,17 @@ static void do_type_walk(type_or_ent *tore,
 static void irn_type_walker(
   ir_node *node, type_walk_func *pre, type_walk_func *post, void *env)
 {
-  symconst_kind kind;
+  entity *ent;
+  ir_type *tp;
 
   assert(node);
 
-  switch (get_irn_opcode(node)) {  /* node label */
-  case iro_SymConst:
-    kind = get_SymConst_kind(node);
-    if (kind == symconst_type_tag || kind == symconst_size)
-      do_type_walk((type_or_ent *)get_SymConst_type(node), pre, post, env);
-    else if (kind == symconst_addr_ent)
-      do_type_walk((type_or_ent *)get_SymConst_entity(node), pre, post, env);
-    break;
-  case iro_Sel:
-    do_type_walk((type_or_ent *)get_Sel_entity(node), pre, post, env);
-    break;
-  case iro_Call:
-    do_type_walk((type_or_ent *)get_Call_type(node), pre, post, env);
-    break;
-  case iro_Alloc:
-    do_type_walk((type_or_ent *)get_Alloc_type(node), pre, post, env);
-    break;
-  case iro_Free:
-    do_type_walk((type_or_ent *)get_Free_type(node), pre, post, env);
-    break;
-  case iro_Cast:
-    do_type_walk((type_or_ent *)get_Cast_type(node), pre, post, env);
-    break;
-  default:
-    break;
-  }
+  ent = get_irn_entity_attr(node);
+  if (ent)
+    do_type_walk((type_or_ent *)ent, pre, post, env);
+  tp  = get_irn_type_attr(node);
+  if (tp)
+    do_type_walk((type_or_ent *)tp, pre, post, env);
 }
 
 /**  Check whether node contains types or entities as an attribute.
@@ -233,7 +225,7 @@ void type_walk(type_walk_func *pre, type_walk_func *post, void *env) {
   int i, n_types = get_irp_n_types();
 
   inc_master_type_visited();
-  for (i = 0; i < n_types; i++) {
+  for (i = 0; i < n_types; ++i) {
     do_type_walk((type_or_ent *)get_irp_type(i), pre, post, env);
   }
   do_type_walk((type_or_ent *)get_glob_type(), pre, post, env);
@@ -280,7 +272,7 @@ static void type_walk_s2s_2(type_or_ent *tore,
                            void (*post)(type_or_ent*, void*),
                            void *env)
 {
-  int i;
+  int i, n;
 
   /* marked? */
   switch (get_kind(tore)) {
@@ -288,11 +280,11 @@ static void type_walk_s2s_2(type_or_ent *tore,
     if (entity_visited((entity *)tore)) return;
     break;
   case k_type:
-    if(type_id == get_type_tpop((type*)tore)) {
+    if (type_id == get_type_tpop((ir_type*)tore)) {
       type_walk_s2s_2((type_or_ent *)skip_tid((type *)tore), pre, post, env);
       return;
     }
-    if (type_visited((type *)tore)) return;
+    if (type_visited((ir_type *)tore)) return;
     break;
   default:
     break;
@@ -302,28 +294,30 @@ static void type_walk_s2s_2(type_or_ent *tore,
   switch (get_kind(tore)) {
   case k_type:
     {
-      type *tp = (type *)tore;
+      ir_type *tp = (ir_type *)tore;
       mark_type_visited(tp);
       switch (get_type_tpop_code(tp)) {
       case tpo_class:
         {
-               for (i = 0; i < get_class_n_supertypes(tp); i++) {
-                 type_walk_s2s_2((type_or_ent *)get_class_supertype(tp, i), pre,
-                                 post, env);
-               }
-               /* execute pre method */
-               if(pre)
-                 pre(tore, env);
-               tp = skip_tid((type*)tore);
-
-               for (i = 0; i < get_class_n_subtypes(tp); i++) {
-                 type_walk_s2s_2((type_or_ent *)get_class_subtype(tp, i), pre,
-                                 post, env);
-               }
-
-               /* execute post method */
-               if(post)
-                 post(tore, env);
+          n = get_class_n_supertypes(tp);
+          for (i = 0; i < n; ++i) {
+            type_walk_s2s_2((type_or_ent *)get_class_supertype(tp, i), pre,
+                            post, env);
+          }
+          /* execute pre method */
+          if (pre)
+            pre(tore, env);
+          tp = skip_tid((ir_type*)tore);
+
+          n = get_class_n_subtypes(tp);
+          for (i = 0; i < n; ++i) {
+            type_walk_s2s_2((type_or_ent *)get_class_subtype(tp, i), pre,
+                            post, env);
+          }
+
+          /* execute post method */
+          if (post)
+            post(tore, env);
         }
         break;
       case tpo_struct:
@@ -357,11 +351,11 @@ void type_walk_super2sub(
                  void *env)
 {
   int i, n_types = get_irp_n_types();
-  type *tp;
+  ir_type *tp;
 
   inc_master_type_visited();
   type_walk_s2s_2((type_or_ent *)get_glob_type(), pre, post, env);
-  for (i = 0; i < n_types; i++) {
+  for (i = 0; i < n_types; ++i) {
     tp = get_irp_type(i);
     type_walk_s2s_2((type_or_ent *)tp, pre, post, env);
   }
@@ -375,7 +369,7 @@ type_walk_super_2(type_or_ent *tore,
                  void (*post)(type_or_ent*, void*),
                  void *env)
 {
-  int i;
+  int i, n;
 
   /* marked? */
   switch (get_kind(tore)) {
@@ -383,11 +377,11 @@ type_walk_super_2(type_or_ent *tore,
     if (entity_visited((entity *)tore)) return;
     break;
   case k_type:
-    if(type_id == get_type_tpop((type*)tore)) {
-      type_walk_super_2((type_or_ent *)skip_tid((type *)tore), pre, post, env);
+    if (type_id == get_type_tpop((ir_type*)tore)) {
+      type_walk_super_2((type_or_ent *)skip_tid((ir_type *)tore), pre, post, env);
       return;
     }
-    if (type_visited((type *)tore)) return;
+    if (type_visited((ir_type *)tore)) return;
     break;
   default:
     break;
@@ -397,24 +391,25 @@ type_walk_super_2(type_or_ent *tore,
   switch (get_kind(tore)) {
   case k_type:
     {
-      type *tp = (type *)tore;
+      ir_type *tp = (ir_type *)tore;
       mark_type_visited(tp);
       switch (get_type_tpop_code(tp)) {
       case tpo_class:
         {
-               /* execute pre method */
-               if (pre)
-                 pre(tore, env);
-               tp = skip_tid((type*)tore);
-
-               for (i = 0; i < get_class_n_supertypes(tp); i++) {
-                 type_walk_super_2((type_or_ent *)get_class_supertype(tp, i), pre,
-                                   post, env);
-               }
-
-               /* execute post method */
-               if (post)
-                 post(tore, env);
+          /* execute pre method */
+          if (pre)
+            pre(tore, env);
+          tp = skip_tid((ir_type*)tore);
+
+          n = get_class_n_supertypes(tp);
+          for (i = 0; i < n; ++i) {
+            type_walk_super_2((type_or_ent *)get_class_supertype(tp, i), pre,
+                              post, env);
+          }
+
+          /* execute post method */
+          if (post)
+            post(tore, env);
         }
         break;
       case tpo_struct:
@@ -447,11 +442,11 @@ void type_walk_super(
                  void (*post)(type_or_ent*, void*),
                  void *env) {
   int i, n_types = get_irp_n_types();
-  type *tp;
+  ir_type *tp;
 
   inc_master_type_visited();
   type_walk_super_2((type_or_ent *)get_glob_type(), pre, post, env);
-  for (i = 0; i < n_types; i++) {
+  for (i = 0; i < n_types; ++i) {
     tp = get_irp_type(i);
     type_walk_super_2((type_or_ent *)tp, pre, post, env);
   }
@@ -461,19 +456,20 @@ void type_walk_super(
 
 
 static void
-class_walk_s2s_2(type *tp,
-                void (*pre)(type*, void*),
-                void (*post)(type*, void*),
+class_walk_s2s_2(ir_type *tp,
+                void (*pre)(ir_type*, void*),
+                void (*post)(ir_type*, void*),
                 void *env)
 {
-  int i;
+  int i, n;
 
   /* marked? */
   if (type_visited(tp)) return;
 
   assert(is_Class_type(tp));
   /* Assure all supertypes are visited before */
-  for (i = get_class_n_supertypes(tp) - 1; i >= 0; --i) {
+  n = get_class_n_supertypes(tp);
+  for (i = 0; i < n; ++i) {
     if (type_not_visited(get_class_supertype(tp, i)))
       return;
   }
@@ -485,7 +481,8 @@ class_walk_s2s_2(type *tp,
     pre(tp, env);
 
   tp = skip_tid(tp);
-  for (i = get_class_n_subtypes(tp) - 1; i >= 0; --i) {
+  n = get_class_n_subtypes(tp);
+  for (i = 0; i < n; ++i) {
     class_walk_s2s_2(get_class_subtype(tp, i), pre, post, env);
   }
   /* execute post method */
@@ -496,12 +493,12 @@ class_walk_s2s_2(type *tp,
 }
 
 void class_walk_super2sub(
-                 void (*pre)(type*, void*),
-                 void (*post)(type*, void*),
+                 void (*pre)(ir_type*, void*),
+                 void (*post)(ir_type*, void*),
                  void *env)
 {
   int i, n_types = get_irp_n_types();
-  type *tp;
+  ir_type *tp;
 
   inc_master_type_visited();
   for (i = 0; i < n_types; i++) {
@@ -519,27 +516,31 @@ void class_walk_super2sub(
 
 /* Walks over all entities in the type */
 void walk_types_entities(
-                 type *tp,
+                 ir_type *tp,
                  void (*doit)(entity*, void*),
                  void *env)
 {
-  int i;
+  int i, n;
+
   switch (get_type_tpop_code(tp)) {
-  case tpo_class: {
-    for (i = 0; i<get_class_n_members(tp); i++)
+  case tpo_class:
+    n = get_class_n_members(tp);
+    for (i = 0; i < n; ++i)
       doit(get_class_member(tp, i), env);
-  } break;
-  case tpo_struct: {
-    for (i = 0; i<get_struct_n_members(tp); i++)
+    break;
+  case tpo_struct:
+    n = get_struct_n_members(tp);
+    for (i = 0; i < n; ++i)
       doit(get_struct_member(tp, i), env);
-  } break;
-  case tpo_union: {
-    for (i = 0; i < get_union_n_members(tp); i++)
+    break;
+  case tpo_union:
+    n = get_union_n_members(tp);
+    for (i = 0; i < n; ++i)
       doit(get_union_member(tp, i), env);
-  } break;
-  case tpo_array: {
-      doit(get_array_element_entity(tp), env);
-  } break;
+    break;
+  case tpo_array:
+    doit(get_array_element_entity(tp), env);
+    break;
   case tpo_method:
   case tpo_enumeration:
   case tpo_pointer: