From: Götz Lindenmaier Date: Mon, 17 Feb 2003 15:08:42 +0000 (+0000) Subject: Changes semantics of method types and method calls. Now call by value is possible X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=e0662f63710cfedae300d774f0276a4d835cf3f3;p=libfirm Changes semantics of method types and method calls. Now call by value is possible for compound types. [r793] --- diff --git a/ir/ir/irnode.h b/ir/ir/irnode.h index e4b2a17c6..affc7fb1a 100644 --- a/ir/ir/irnode.h +++ b/ir/ir/irnode.h @@ -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.. */ diff --git a/ir/ir/irvrfy.c b/ir/ir/irvrfy.c index f527bc631..c7d9549cd 100644 --- a/ir/ir/irvrfy.c +++ b/ir/ir/irvrfy.c @@ -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 */