From 69fa49c1321c262f245852d316f35a896b42d238 Mon Sep 17 00:00:00 2001 From: Christoph Mallon Date: Sat, 8 Dec 2007 17:57:06 +0000 Subject: [PATCH] Select parameters from the correct frame. [r18650] --- ast2firm.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/ast2firm.c b/ast2firm.c index e132b24..ad37ef0 100644 --- a/ast2firm.c +++ b/ast2firm.c @@ -1099,6 +1099,20 @@ static ir_node *get_global_var_address(dbg_info *const dbgi, } } +/* Returns the correct base address depending on whether it is a parameter or a + * normal local variable */ +static ir_node *get_local_frame(ir_entity *const ent) +{ + ir_graph *const irg = current_ir_graph; + const ir_type *const owner = get_entity_owner(ent); + if (owner == get_irg_frame_type(irg)) { + return get_irg_frame(irg); + } else { + assert(owner == get_method_value_param_type(get_entity_type(get_irg_entity(irg)))); + return get_irg_value_param_base(irg); + } +} + static ir_node *reference_expression_to_firm(const reference_expression_t *ref) { dbg_info *dbgi = get_dbg_info(&ref->expression.source_position); @@ -1134,7 +1148,7 @@ static ir_node *reference_expression_to_firm(const reference_expression_t *ref) case DECLARATION_KIND_LOCAL_VARIABLE_ENTITY: { ir_entity *entity = declaration->v.entity; - ir_node *frame = get_irg_frame(current_ir_graph); + ir_node *frame = get_local_frame(entity); ir_node *sel = new_d_simpleSel(dbgi, new_NoMem(), frame, entity); ir_type *irtype = get_entity_type(entity); return deref_address(irtype, sel, dbgi); @@ -1169,7 +1183,7 @@ static ir_node *reference_addr(const reference_expression_t *ref) } case DECLARATION_KIND_LOCAL_VARIABLE_ENTITY: { ir_entity *entity = declaration->v.entity; - ir_node *frame = get_irg_frame(current_ir_graph); + ir_node *frame = get_local_frame(entity); ir_node *sel = new_d_simpleSel(dbgi, new_NoMem(), frame, entity); return sel; -- 2.20.1