Changes semantics of method types and method calls. Now call by value is possible
authorGötz Lindenmaier <goetz@ipd.info.uni-karlsruhe.de>
Mon, 17 Feb 2003 15:08:42 +0000 (15:08 +0000)
committerGötz Lindenmaier <goetz@ipd.info.uni-karlsruhe.de>
Mon, 17 Feb 2003 15:08:42 +0000 (15:08 +0000)
for compound types.

[r793]

ir/ir/irnode.h
ir/ir/irvrfy.c

index e4b2a17..affc7fb 100644 (file)
@@ -593,6 +593,7 @@ ir_node *get_fragile_op_mem(ir_node *node);
 #define DDME(X)      xprintf("%s(l.%i) %I: %p\n", __FILE__, __LINE__, get_entity_ident(X), (X))
 #define DDMG(X)      xprintf("%s(l.%i) %I: %p\n", __FILE__, __LINE__, get_irg_ent(get_entity_ident(X)), (X))
 #define DDMI(X)      xprintf("%s(l.%i) %I: %p\n", __FILE__, __LINE__, (X), (X))
+#define DDMM(X)      xprintf("%s(l.%i) %I: %p\n", __FILE__, __LINE__, get_mode_ident(X), (X))
 
 #endif /* __GNUC__ */
 /*@}*/  /* Macros for debug.. */
index f527bc6..c7d9549 100644 (file)
@@ -111,6 +111,8 @@ vrfy_Proj_proj(ir_node *p) {
       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;
@@ -120,6 +122,8 @@ vrfy_Proj_proj(ir_node *p) {
       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;
@@ -291,7 +295,7 @@ 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_Is && mymode == mode_P)
             ||  /* Pointer Add: BB x Is x P --> P */