Every node has now a pinned attribute that is inherited from the op.
[libfirm] / ir / tr / typewalk.c
index 9249982..4d21fc0 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.
@@ -232,8 +224,8 @@ static void start_type_walk(ir_node *node, void *ctx) {
 void type_walk(type_walk_func *pre, type_walk_func *post, void *env) {
   int i, n_types = get_irp_n_types();
 
-  ++type_visited;
-  for (i = 0; i < n_types; i++) {
+  inc_master_type_visited();
+  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,19 +272,19 @@ 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)) {
   case k_entity:
-    if (((entity *)tore)->visit >= type_visited) return;
+    if (entity_visited((entity *)tore)) return;
     break;
   case k_type:
-    if(type_id == get_type_tpop((type*)tore)) {
-      type_walk_s2s_2((type_or_ent *)skip_tid((type *)tore), pre, post, env);
+    if (type_id == get_type_tpop((ir_type*)tore)) {
+      type_walk_s2s_2((type_or_ent *)skip_tid((ir_type *)tore), pre, post, env);
       return;
     }
-    if (((type *)tore)->visit >= type_visited) return;
+    if (type_visited((ir_type *)tore)) return;
     break;
   default:
     break;
@@ -302,30 +294,32 @@ 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);
-       }
-       break;
+        {
+          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:
       case tpo_method:
       case tpo_union:
@@ -334,11 +328,11 @@ static void type_walk_s2s_2(type_or_ent *tore,
       case tpo_pointer:
       case tpo_primitive:
       case tpo_id:
-       /* dont care */
-       break;
+        /* dont care */
+        break;
       default:
-       printf(" *** Faulty type! \n");
-       break;
+        printf(" *** Faulty type! \n");
+        break;
       }
     } break; /* end case k_type */
   case k_entity:
@@ -357,10 +351,11 @@ void type_walk_super2sub(
                  void *env)
 {
   int i, n_types = get_irp_n_types();
-  type *tp;
-  ++type_visited;
+  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);
   }
@@ -374,19 +369,19 @@ 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)) {
   case k_entity:
-    if (((entity *)tore)->visit >= type_visited) return;
+    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 *)tore)->visit >= type_visited) return;
+    if (type_visited((ir_type *)tore)) return;
     break;
   default:
     break;
@@ -396,26 +391,27 @@ 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);
-       }
-       break;
+        {
+          /* 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:
       case tpo_method:
       case tpo_union:
@@ -424,11 +420,11 @@ type_walk_super_2(type_or_ent *tore,
       case tpo_pointer:
       case tpo_primitive:
       case tpo_id:
-       /* dont care */
-       break;
+        /* dont care */
+        break;
       default:
-       printf(" *** Faulty type! \n");
-       break;
+        printf(" *** Faulty type! \n");
+        break;
       }
     } break; /* end case k_type */
   case k_entity:
@@ -446,10 +442,11 @@ void type_walk_super(
                  void (*post)(type_or_ent*, void*),
                  void *env) {
   int i, n_types = get_irp_n_types();
-  type *tp;
-  ++type_visited;
+  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);
   }
@@ -459,55 +456,57 @@ 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 (tp->visit >= type_visited) return;
+  if (type_visited(tp)) return;
 
   assert(is_Class_type(tp));
   /* Assure all supertypes are visited before */
-  for (i=0; i < get_class_n_supertypes(tp); i++) {
-    if (get_type_visited(get_class_supertype(tp, i)) < type_visited)
+  n = get_class_n_supertypes(tp);
+  for (i = 0; i < n; ++i) {
+    if (type_not_visited(get_class_supertype(tp, i)))
       return;
   }
 
   mark_type_visited(tp);
 
   /* execute pre method */
-  if(pre)
+  if (pre)
     pre(tp, env);
 
-  tp = skip_tid((type*)tp);
-  for (i=0; i<get_class_n_subtypes(tp); i++) {
+  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);
   }
   /* execute post method */
-  if(post)
+  if (post)
     post(tp, env);
 
   return;
 }
 
 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;
 
-  ++type_visited;
+  inc_master_type_visited();
   for (i = 0; i < n_types; i++) {
     tp = get_irp_type(i);
     if (is_Class_type(tp) &&
-           (get_class_n_supertypes(tp) == 0) &&
-           (tp->visit < type_visited))  {
-      assert(!is_frame_type(tp));
+             (get_class_n_supertypes(tp) == 0) &&
+             type_not_visited(tp)) {
+      assert(! is_frame_type(tp));
       assert(tp != get_glob_type());
       class_walk_s2s_2(tp, pre, post, env);
     }
@@ -517,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;
-  switch(get_type_tpop_code(tp)) {
-  case tpo_class: {
-    for (i=0; i<get_class_n_members(tp); i++)
+  int i, n;
+
+  switch (get_type_tpop_code(tp)) {
+  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: