/* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe
-** All rights reserved.
-**
-** Authors: Christian Schaefer
-**
-**
+* All rights reserved.
+*
+* Authors: Christian Schaefer
+*
+*
*/
/* $Id$ */
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 == 2 && mode == mode_P) ||
+ (proj == 3 && mode == mode_P) ||
(proj == 4 && mode == mode_T)) &&
"wrong Proj from Start" );
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)) &&
+ (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_i)) &&
+ (proj == 2 && mode == mode_Is)) &&
"wrong Proj from Div or Mod" );
break;
case iro_Cmp:
case iro_Alloc:
assert (((proj == 0 && mode == mode_M) ||
(proj == 1 /* && mode == mode_X*/) ||
- (proj == 2 && mode == mode_p)) &&
+ (proj == 2 && mode == mode_P)) &&
"wrong Proj from Alloc");
break;
case iro_Proj: {
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;
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;
/* 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;
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;
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:
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);
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]);
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 {
((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;
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;
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;
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");
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;
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;
/* Verify the whole graph. */
/*******************************************************************/
-void
+static void
vrfy_wrap (ir_node *node, void *env) {
irn_vrfy(node);
}