default_initialize_local_variable_func_t callback function added.
[libfirm] / ir / ir / irvrfy.c
index 8a8c6cd..c7d9549 100644 (file)
@@ -1,9 +1,9 @@
 /* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe
-** All rights reserved.
-**
-** Authors: Christian Schaefer
-**
-**
+* All rights reserved.
+*
+* Authors: Christian Schaefer
+*
+*
 */
 
 /* $Id$ */
 # include "irvrfy.h"
 # include "irgwalk.h"
 
-void vrfy_Proj_proj(ir_node *p);
+/* @@@ replace use of array "in" by access functions. */
+ir_node **get_irn_in (ir_node *node);
+
+INLINE static void
+vrfy_Proj_proj(ir_node *p) {
+  ir_node *pred;
+  ir_mode *mode;
+  int proj;
+
+  pred = skip_nop(get_Proj_pred(p));
+  assert(get_irn_mode(pred) == mode_T);
+  mode = get_irn_mode(p);
+  proj = get_Proj_proj(p);
+
+  switch (get_irn_opcode(pred)) {
+  case iro_Start:
+    assert (((proj == 0 && mode == mode_X) ||
+            (proj == 1 && mode == mode_M) ||
+            (proj == 2 && mode == mode_P) ||
+            (proj == 3 && mode == mode_P) ||
+            (proj == 4 && mode == mode_T))   &&
+           "wrong Proj from Start"  );
+    break;
+  case iro_Cond:
+    assert ((proj >= 0 && mode == mode_X) &&
+           "wrong Proj from Cond");
+    break;
+  case iro_Raise:
+    assert (((proj == 0 && mode == mode_X) ||
+            (proj == 1 && mode == mode_M))   &&
+           "wrong Proj from Raise" );
+    break;
+  case iro_InstOf:
+       assert (((proj >= 0 && mode == mode_X) &&
+                        "wrong Proj from InstOf"));
+       break;
+  case iro_Call:
+    assert (((proj == 0 && mode == mode_M) ||
+            (proj == 1 && mode == mode_X) ||
+            (proj == 2 && mode == mode_T) ||
+            (proj == 3 && mode == mode_M))   &&
+           "wrong Proj from Call" );
+    break;
+  case iro_Quot:
+    assert (((proj == 0 && mode == mode_M) ||
+            (proj == 1 && mode == mode_X) ||
+            (proj == 2 && mode_is_float(mode)))  &&
+           "wrong Proj from Quot");
+    break;
+  case iro_DivMod:
+    assert (((proj == 0 && mode == mode_M) ||
+            (proj == 1 && mode == mode_X) ||
+            (proj == 2 && mode == mode_Is) ||
+            (proj == 3 && mode == mode_Is))   &&
+           "wrong Proj from DivMod" );
+    break;
+  case iro_Div:
+  case iro_Mod:
+    assert (((proj == 0 && mode == mode_M) ||
+            (proj == 1 && mode == mode_X) ||
+            (proj == 2 && mode == mode_Is))   &&
+            "wrong Proj from Div or Mod" );
+    break;
+  case iro_Cmp:
+    assert ((proj >= 0 && proj <= 15 && mode == mode_b) &&
+           "wrong Proj from Cmp");
+    break;
+  case iro_Load:
+    assert (((proj == 0 && mode == mode_M) ||
+            (proj == 1 && mode == mode_X) ||
+            (proj == 2 && mode_is_data(mode)))  &&
+           "wrong Proj from Load");
+    break;
+  case iro_Store:
+    assert (((proj == 0 && mode == mode_M) ||
+            (proj == 1 && mode == mode_X))    &&
+           "wrong Proj from Store");
+    break;
+  case iro_Alloc:
+    assert (((proj == 0 && mode == mode_M) ||
+            (proj == 1 /* && mode == mode_X*/) ||
+            (proj == 2 && mode == mode_P))      &&
+           "wrong Proj from Alloc");
+    break;
+  case iro_Proj: {
+    type *mt; /* A method type */
+    pred = skip_nop(get_Proj_pred(pred));
+    assert(get_irn_mode(pred) == mode_T);
+    switch (get_irn_opcode(pred)) {
+    case iro_Start: {
+      assert (proj >= 0 && mode_is_data(mode) &&
+             "wrong Proj from Proj from Start");
+      mt = get_entity_type(get_irg_ent(current_ir_graph));
+      assert(proj < get_method_n_params(mt) &&
+            "More Projs for args than args in type");
+      if ((mode == mode_P) && is_compound_type(get_method_param_type(mt, proj)))
+       /* value argument */ break;
+      assert(mode == get_type_mode(get_method_param_type(mt, proj)) &&
+      "Mode of Proj from Start doesn't match mode of param type.");
+    } break;
+    case iro_Call: {
+      assert (proj >= 0 && mode_is_data(mode) &&
+             "wrong Proj from Proj from Call");
+      mt = get_Call_type(pred);
+      assert(proj < get_method_n_ress(mt) &&
+            "More Projs for results than results in type.");
+      if ((mode == mode_P) && is_compound_type(get_method_res_type(mt, proj)))
+       /* value result */ break;
+      assert(mode == get_type_mode(get_method_res_type(mt, proj)) &&
+      "Mode of Proj from Call doesn't match mode of result type.");
+    } break;
+    case iro_Tuple: ;
+      /* We don't test */
+      break;
+    default: assert(0);
+    } break;
+  }
+  case iro_Tuple:
+    /* We don't test */
+    break;
+  case iro_CallBegin:
+    break;
+  case iro_EndReg:
+    break;
+  case iro_EndExcept:
+    break;
+  default: assert(0);
+  }
+}
 
 void
 irn_vrfy (ir_node *n)
 {
   int i;
   int opcode;
-  ir_mode *mymode, *op1mode, *op2mode, *op3mode;
+  ir_mode *mymode, *op1mode = NULL, *op2mode, *op3mode;
   int op_is_symmetric = 1;     /* 0: asymmetric
                                   1: operands have identical modes
                                   2: modes of operands == mode of this node */
@@ -56,13 +184,19 @@ irn_vrfy (ir_node *n)
            mymode == mode_X && "Jmp node"
           );
     break;
+  case iro_Break:
+    assert (
+           /* Jmp: BB --> X */
+           mymode == mode_X && "Jmp node"
+          );
+    break;
   case iro_Cond:
     op1mode = get_irn_mode(in[1]);
     assert (
            /* Cond: BB x b --> X x X */
            (op1mode == mode_b
            /* Cond: BB x Iu --> X^n */
-           || op1mode == mode_I) && "Cond node"
+           || op1mode == mode_Iu) && "Cond node"
            );
     assert (mymode == mode_T);
     break;
@@ -77,9 +211,9 @@ irn_vrfy (ir_node *n)
     assert ( mymode == mode_X );   /* result X */
     /* Compare returned results with result types of method type */
     mt = get_entity_type(get_irg_ent(current_ir_graph));
-    assert(get_Return_n_res(n) == get_method_n_res(mt) &&
+    assert(get_Return_n_ress(n) == get_method_n_ress(mt) &&
             "Number of results for Return doesn't match number of results in type.");
-    for (i = 0; i < get_Return_n_res(n); i++)
+    for (i = 0; i < get_Return_n_ress(n); i++)
       assert((get_irn_mode(get_Return_res(n, i))
              == get_type_mode(get_method_res_type(mt, i))) &&
             "Mode of result for Return doesn't match mode of result type.");
@@ -90,7 +224,7 @@ irn_vrfy (ir_node *n)
     op2mode = get_irn_mode(in[2]);
     assert (
            /* Sel: BB x M x P --> X x M */
-           op1mode == mode_M && op2mode == mode_p
+           op1mode == mode_M && op2mode == mode_P
            && mymode == mode_T && "Raise node"
           );
     break;
@@ -106,7 +240,7 @@ irn_vrfy (ir_node *n)
     assert (
            /* SymConst: BB --> Iu or
                          BB --> P */
-           ((mymode == mode_I) || (mymode == mode_p))  && "SymConst node"
+           ((mymode == mode_Iu) || (mymode == mode_P))  && "SymConst node"
           );
     break;
   case iro_Sel:
@@ -114,11 +248,11 @@ irn_vrfy (ir_node *n)
     op2mode = get_irn_mode(in[2]);
     assert (
            /* Sel: BB x M x P x Iu^n --> P */
-           op1mode == mode_M && op2mode == mode_p
-            && mymode == mode_p && "Sel node"
+           op1mode == mode_M && op2mode == mode_P
+            && mymode == mode_P && "Sel node"
           );
     for (i=3; i < get_irn_arity(n); i++) {
-           assert (get_irn_mode(in[i]) == mode_I && "Sel node"); }
+           assert (get_irn_mode(in[i]) == mode_Iu && "Sel node"); }
     break;
   case iro_InstOf:
        assert (mode_T == mymode);
@@ -129,19 +263,31 @@ irn_vrfy (ir_node *n)
     op2mode = get_irn_mode(in[2]);
       /* Call: BB x M x P x data1 x ... x datan
                  --> M x datan+1 x ... x data n+m */
-    assert ( op1mode == mode_M && op2mode == mode_p  && "Call node");  /* operand M x P */
+    assert ( op1mode == mode_M && op2mode == mode_P  && "Call node");  /* operand M x P */
     for (i=3; i < get_irn_arity(n); i++) {
       assert ( mode_is_data(get_irn_mode(in[i])) && "Call node");  /* operand datai */
     };
     assert ( mymode == mode_T );   /* result T */
     /* Compare arguments of node with those of type */
-      mt = get_Call_type(n);
-      assert(get_Call_n_params(n) == get_method_n_params(mt) &&
-            "Number of args for Call doesn't match number of args in type.");
-      for (i = 0; i < get_Call_n_params(n); i++)
-       assert((get_irn_mode(get_Call_param(n, i))
-               == get_type_mode(get_method_param_type(mt, i))) &&
-              "Mode of arg for Call doesn't match mode of arg type.");
+    mt = get_Call_type(n);
+
+    if(get_method_variadicity(mt) == variadic)
+      {
+       assert(get_Call_n_params(n) >= get_method_n_params(mt) &&
+              "Number of args for Call doesn't match number of args in " \
+              " variadic type.");
+      }
+    else
+      {
+       assert(get_Call_n_params(n) == get_method_n_params(mt) &&
+              "Number of args for Call doesn't match number of args in " \
+              "non variadic type.");
+      }
+
+    for (i = 0; i < get_method_n_params(mt); i++)
+      assert((get_irn_mode(get_Call_param(n, i))
+             == get_type_mode(get_method_param_type(mt, i))) &&
+            "Mode of arg for Call doesn't match mode of arg type.");
     break;
   case iro_Add:
     op1mode = get_irn_mode(in[1]);
@@ -149,14 +295,14 @@ irn_vrfy (ir_node *n)
     assert (
            /* common Add: BB x num x num --> num */
            ((mymode == op1mode && mymode == op2mode
-             && mode_is_num(mymode))
+             && (mode_is_num(mymode) || mymode == mode_P))
             ||  /* Pointer Add: BB x P x Is --> P */
-            (op1mode == mode_p && op2mode == mode_i && mymode == mode_p)
+            (op1mode == mode_P && op2mode == mode_Is && mymode == mode_P)
             ||  /* Pointer Add: BB x Is x P --> P */
-            (op1mode == mode_i && op2mode == mode_p && mymode == mode_p))
+            (op1mode == mode_Is && op2mode == mode_P && mymode == mode_P))
            && "Add node"
            );
-      if (op1mode == mode_p || op2mode == mode_p) {
+      if (op1mode == mode_P || op2mode == mode_P) {
        /* BB x P x Is --> P or BB x Is x P --> P */
         op_is_symmetric = 0; /* ArmRoq */
       } else {
@@ -172,16 +318,16 @@ irn_vrfy (ir_node *n)
            ((mymode ==op1mode && mymode == op2mode
              && mode_is_num(op1mode))
             ||  /* Pointer Sub: BB x P x Is --> P */
-            (op1mode == mode_p && op2mode == mode_i && mymode == mode_p)
+            (op1mode == mode_P && op2mode == mode_Is && mymode == mode_P)
             ||  /* Pointer Sub: BB x Is x P --> P */
-            (op1mode == mode_i && op2mode == mode_p && mymode == mode_p)
+            (op1mode == mode_Is && op2mode == mode_P && mymode == mode_P)
             ||  /* Pointer Sub: BB x P x P --> Is */
-            (op1mode == mode_p && op2mode == mode_p && mymode == mode_i))
+            (op1mode == mode_P && op2mode == mode_P && mymode == mode_Is))
            && "Sub node"
            );
-      if (op1mode == mode_p && op2mode == mode_p) {
+      if (op1mode == mode_P && op2mode == mode_P) {
         op_is_symmetric = 1; /* ArmRoq */
-      } else if (op1mode == mode_p || op2mode == mode_p) {
+      } else if (op1mode == mode_P || op2mode == mode_P) {
         op_is_symmetric = 0; /* ArmRoq */
       } else {
         op_is_symmetric = 2;
@@ -286,7 +432,7 @@ irn_vrfy (ir_node *n)
     op2mode = get_irn_mode(in[2]);
     assert(
           /* Shl, Shr, Shrs or Rot: BB x int x Iu --> int */
-          mode_is_int (op1mode) && op2mode == mode_I
+          mode_is_int (op1mode) && op2mode == mode_Iu
            && op1mode == mymode && "Shl, Shr, Shr or Rot node"
          );
     break;
@@ -299,10 +445,10 @@ irn_vrfy (ir_node *n)
          );
     break;
   case iro_Phi:
-           /* Phi: BB x dataM^n --> dataM */
+    /* Phi: BB x dataM^n --> dataM */
     /* for some reason "<=" aborts. Is there a problem with get_store? */
     for (i=1; i < get_irn_arity(n); i++) {
-      if (!is_Bad(in[i]))
+      if (!is_Bad(in[i]) && (get_irn_op(in[i]) != op_Unknown))
        assert ( get_irn_mode(in[i]) == mymode  && "Phi node");
     };
     assert ( mode_is_dataM(mymode)  && "Phi node");
@@ -312,7 +458,7 @@ irn_vrfy (ir_node *n)
     op2mode = get_irn_mode(in[2]);
     assert(
            /* Load: BB x M x P --> M x X x data */
-           op1mode == mode_M && op2mode == mode_p  && "Load node"
+           op1mode == mode_M && op2mode == mode_P  && "Load node"
          );
     assert ( mymode == mode_T  && "Load node");
     break;
@@ -322,7 +468,7 @@ irn_vrfy (ir_node *n)
     op3mode = get_irn_mode(in[3]);
     assert(
            /* Load: BB x M x P x data --> M x X */
-           op1mode == mode_M && op2mode == mode_p
+           op1mode == mode_M && op2mode == mode_P
            && mode_is_data (op3mode) && "Store node"
          );
     assert(mymode == mode_T && "Store node");
@@ -332,7 +478,7 @@ irn_vrfy (ir_node *n)
     op2mode = get_irn_mode(in[2]);
     assert(
            /* Alloc: BB x M x Iu --> M x X x P */
-           op1mode == mode_M && op2mode == mode_I
+           op1mode == mode_M && op2mode == mode_Iu
            && mymode == mode_T && "Alloc node"
          );
     break;
@@ -342,7 +488,7 @@ irn_vrfy (ir_node *n)
     op3mode = get_irn_mode(in[3]);
     assert(
            /* Free: BB x M x P x Iu --> M */
-           op1mode == mode_M && op2mode == mode_p && op3mode == mode_I
+           op1mode == mode_M && op2mode == mode_P && op3mode == mode_Iu
            && mymode == mode_M && "Free node"
          );
     break;
@@ -360,141 +506,17 @@ irn_vrfy (ir_node *n)
   }
 }
 
-void
-vrfy_Proj_proj(ir_node *p) {
-  ir_node *pred;
-  ir_mode *mode;
-  int proj;
-
-  pred = skip_nop(get_Proj_pred(p));
-  assert(get_irn_mode(pred) == mode_T);
-  mode = get_irn_mode(p);
-  proj = get_Proj_proj(p);
-
-  switch (get_irn_opcode(pred)) {
-  case iro_Start:
-    assert ((proj == 0 && mode == mode_X) ||
-           (proj == 1 && mode == mode_M) ||
-           (proj == 2 && mode == mode_p) ||
-           (proj == 3 && mode == mode_p) ||
-           (proj == 4 && mode == mode_T) &&
-           "wrong Proj from Start"  );
-    break;
-  case iro_Cond:
-    assert ((proj >= 0 && mode == mode_X) &&
-           "wrong Proj from Cond");
-    break;
-  case iro_Raise:
-    assert ((proj == 0 && mode == mode_X) ||
-           (proj == 1 && mode == mode_M) &&
-           "wrong Proj from Raise" );
-    break;
-  case iro_InstOf:
-       assert (((proj >= 0 && mode == mode_X) &&
-                        "wrong Proj from InstOf"));
-       break;
-  case iro_Call:
-    assert ((proj == 0 && mode == mode_M) ||
-           (proj == 1 && mode == mode_X) ||
-           (proj == 2 && mode == mode_T) ||
-           (proj == 3 && mode == mode_M) &&
-           "wrong Proj from Call" );
-    break;
-  case iro_Quot:
-    assert ((proj == 0 && mode == mode_M) ||
-           (proj == 1 && mode == mode_X) ||
-           (proj == 2 && mode_is_float(mode)) &&
-           "wrong Proj from Quot");
-    break;
-  case iro_DivMod:
-    assert ((proj == 0 && mode == mode_M) ||
-           (proj == 1 && mode == mode_X) ||
-           (proj == 2 && mode == mode_i) ||
-           (proj == 3 && mode == mode_i) &&
-           "wrong Proj from DivMod" );
-    break;
-  case iro_Div:
-  case iro_Mod:
-    assert ((proj == 0 && mode == mode_M) ||
-           (proj == 1 && mode == mode_X) ||
-           (proj == 2 && mode == mode_i) &&
-           "wrong Proj from Div or Mod" );
-    break;
-  case iro_Cmp:
-    assert ((proj >= 0 && proj <= 15 && mode == mode_b) &&
-           "wrong Proj from Cmp");
-    break;
-  case iro_Load:
-    assert ((proj == 0 && mode == mode_M) ||
-           (proj == 1 && mode == mode_X) ||
-           (proj == 2 && mode_is_data(mode)) &&
-           "wrong Proj from Load");
-    break;
-  case iro_Store:
-    assert ((proj == 0 && mode == mode_M) ||
-           (proj == 1 && mode == mode_X) &&
-           "wrong Proj from Store");
-    break;
-  case iro_Alloc:
-    assert ((proj == 0 && mode == mode_M) ||
-           (proj == 1 /* && mode == mode_X*/) ||
-           (proj == 2 && mode == mode_p) &&
-           "wrong Proj from Alloc");
-    break;
-  case iro_Proj: {
-    type *mt; /* A method type */
-    pred = skip_nop(get_Proj_pred(pred));
-    assert(get_irn_mode(pred) == mode_T);
-    switch (get_irn_opcode(pred)) {
-    case iro_Start: {
-      assert (proj >= 0 && mode_is_data(mode) &&
-             "wrong Proj from Proj from Start");
-      mt = get_entity_type(get_irg_ent(current_ir_graph));
-      assert(proj < get_method_n_params(mt) &&
-            "More Projs for args than args in type");
-      assert(mode == get_type_mode(get_method_param_type(mt, proj)) &&
-      "Mode of Proj from Start doesn't match mode of param type.");
-    } break;
-    case iro_Call: {
-      assert (proj >= 0 && mode_is_data(mode) &&
-             "wrong Proj from Proj from Call");
-      mt = get_Call_type(pred);
-      assert(proj < get_method_n_res(mt) &&
-            "More Projs for results than results in type.");
-      assert(mode == get_type_mode(get_method_res_type(mt, proj)) &&
-      "Mode of Proj from Call doesn't match mode of result type.");
-    } break;
-    case iro_Tuple: ;
-      /* We don't test */
-      break;
-    default: assert(0);
-    } break;
-  }
-  case iro_Tuple:
-    /* We don't test */
-    break;
-  case iro_CallBegin:
-    break;
-  case iro_EndReg:
-    break;
-  case iro_EndExcept:
-    break;
-  default: assert(0);
-  }
-}
-
 
 /*******************************************************************/
 /* Verify the whole graph.                                         */
 /*******************************************************************/
 
-void
+static void
 vrfy_wrap (ir_node *node, void *env) {
   irn_vrfy(node);
 }
 
-void
-irg_vrfy (ir_graph *irg)
+void irg_vrfy (ir_graph *irg)
 {
   ir_graph *rem;
   rem = current_ir_graph;