From: Matthias Braun Date: Thu, 28 Jul 2011 11:03:05 +0000 (+0200) Subject: lowering: fix i_mapper for new exception attributes X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=0c2e8bedc56cb9dba9b2544927a8093ddb7ee614;p=libfirm lowering: fix i_mapper for new exception attributes --- diff --git a/include/libfirm/lowering.h b/include/libfirm/lowering.h index 6d3d7499b..8f2ab6989 100644 --- a/include/libfirm/lowering.h +++ b/include/libfirm/lowering.h @@ -569,7 +569,6 @@ typedef struct runtime_rt { long mem_proj_nr; /**< if >= 0, create a memory ProjM() */ long regular_proj_nr; /**< if >= 0, create a regular ProjX() */ long exc_proj_nr; /**< if >= 0, create a exception ProjX() */ - long exc_mem_proj_nr; /**< if >= 0, create a exception memory ProjM() */ long res_proj_nr; /**< if >= 0, first result projection number */ } runtime_rt; diff --git a/ir/be/arm/bearch_arm.c b/ir/be/arm/bearch_arm.c index 01f82d08d..a81dc0220 100644 --- a/ir/be/arm/bearch_arm.c +++ b/ir/be/arm/bearch_arm.c @@ -323,7 +323,6 @@ static void arm_handle_intrinsics(void) rt_iDiv.mem_proj_nr = pn_Div_M; rt_iDiv.regular_proj_nr = pn_Div_X_regular; rt_iDiv.exc_proj_nr = pn_Div_X_except; - rt_iDiv.exc_mem_proj_nr = pn_Div_M; rt_iDiv.res_proj_nr = pn_Div_res; add_entity_linkage(rt_iDiv.ent, IR_LINKAGE_CONSTANT); @@ -350,7 +349,6 @@ static void arm_handle_intrinsics(void) rt_uDiv.mem_proj_nr = pn_Div_M; rt_uDiv.regular_proj_nr = pn_Div_X_regular; rt_uDiv.exc_proj_nr = pn_Div_X_except; - rt_uDiv.exc_mem_proj_nr = pn_Div_M; rt_uDiv.res_proj_nr = pn_Div_res; set_entity_visibility(rt_uDiv.ent, ir_visibility_external); @@ -376,7 +374,6 @@ static void arm_handle_intrinsics(void) rt_iMod.mem_proj_nr = pn_Mod_M; rt_iMod.regular_proj_nr = pn_Mod_X_regular; rt_iMod.exc_proj_nr = pn_Mod_X_except; - rt_iMod.exc_mem_proj_nr = pn_Mod_M; rt_iMod.res_proj_nr = pn_Mod_res; set_entity_visibility(rt_iMod.ent, ir_visibility_external); @@ -402,7 +399,6 @@ static void arm_handle_intrinsics(void) rt_uMod.mem_proj_nr = pn_Mod_M; rt_uMod.regular_proj_nr = pn_Mod_X_regular; rt_uMod.exc_proj_nr = pn_Mod_X_except; - rt_uMod.exc_mem_proj_nr = pn_Mod_M; rt_uMod.res_proj_nr = pn_Mod_res; set_entity_visibility(rt_uMod.ent, ir_visibility_external); diff --git a/ir/be/sparc/bearch_sparc.c b/ir/be/sparc/bearch_sparc.c index d37c80491..fa424b506 100644 --- a/ir/be/sparc/bearch_sparc.c +++ b/ir/be/sparc/bearch_sparc.c @@ -438,7 +438,6 @@ static void sparc_handle_intrinsics(void) rt_iMod.mem_proj_nr = pn_Mod_M; rt_iMod.regular_proj_nr = pn_Mod_X_regular; rt_iMod.exc_proj_nr = pn_Mod_X_except; - rt_iMod.exc_mem_proj_nr = pn_Mod_M; rt_iMod.res_proj_nr = pn_Mod_res; set_entity_visibility(rt_iMod.ent, ir_visibility_external); @@ -464,7 +463,6 @@ static void sparc_handle_intrinsics(void) rt_uMod.mem_proj_nr = pn_Mod_M; rt_uMod.regular_proj_nr = pn_Mod_X_regular; rt_uMod.exc_proj_nr = pn_Mod_X_except; - rt_uMod.exc_mem_proj_nr = pn_Mod_M; rt_uMod.res_proj_nr = pn_Mod_res; set_entity_visibility(rt_uMod.ent, ir_visibility_external); diff --git a/ir/lower/lower_intrinsics.c b/ir/lower/lower_intrinsics.c index 957f49ccc..9051cb373 100644 --- a/ir/lower/lower_intrinsics.c +++ b/ir/lower/lower_intrinsics.c @@ -1147,6 +1147,8 @@ int i_mapper_RuntimeCall(ir_node *node, runtime_rt *rt) ir_type *mtp; ir_node *mem, *bl, *call, *addr, *res_proj; ir_node **in; + bool throws_exception; + ir_op *op; ir_graph *irg; symconst_symbol sym; ir_mode *mode = get_irn_mode(node); @@ -1187,15 +1189,17 @@ int i_mapper_RuntimeCall(ir_node *node, runtime_rt *rt) return 0; } - n_res = get_method_n_ress(mtp); + n_res = get_method_n_ress(mtp); + throws_exception = ir_throws_exception(node); /* step 0: calculate the number of needed Proj's */ n_proj = 0; n_proj = LMAX(n_proj, rt->mem_proj_nr + 1); - n_proj = LMAX(n_proj, rt->regular_proj_nr + 1); - n_proj = LMAX(n_proj, rt->exc_proj_nr + 1); - n_proj = LMAX(n_proj, rt->exc_mem_proj_nr + 1); n_proj = LMAX(n_proj, rt->res_proj_nr + 1); + if (throws_exception) { + n_proj = LMAX(n_proj, rt->regular_proj_nr + 1); + n_proj = LMAX(n_proj, rt->exc_proj_nr + 1); + } if (n_proj > 0) { if (rt->mode != mode_T) /* must be mode_T */ @@ -1209,6 +1213,7 @@ int i_mapper_RuntimeCall(ir_node *node, runtime_rt *rt) /* ok, when we are here, the number of predecessors match as well as the parameter modes */ bl = get_nodes_block(node); + op = get_irn_op(node); in = NULL; if (n_param > 0) { @@ -1236,14 +1241,9 @@ int i_mapper_RuntimeCall(ir_node *node, runtime_rt *rt) if (rt->mem_proj_nr >= 0) set_Tuple_pred(node, rt->mem_proj_nr, new_r_Proj(call, mode_M, pn_Call_M)); - if (!is_NoMem(mem)) { - /* Exceptions can only be handled with real memory */ - if (rt->regular_proj_nr >= 0) - set_Tuple_pred(node, rt->regular_proj_nr, new_r_Proj(call, mode_X, pn_Call_X_regular)); - if (rt->exc_proj_nr >= 0) - set_Tuple_pred(node, rt->exc_proj_nr, new_r_Proj(call, mode_X, pn_Call_X_except)); - if (rt->exc_mem_proj_nr >= 0) - set_Tuple_pred(node, rt->mem_proj_nr, new_r_Proj(call, mode_M, pn_Call_M)); + if (throws_exception) { + set_Tuple_pred(node, op->pn_x_regular, new_r_Proj(call, mode_X, pn_Call_X_regular)); + set_Tuple_pred(node, op->pn_x_except, new_r_Proj(call, mode_X, pn_Call_X_except)); } if (rt->res_proj_nr >= 0) {