From: Matthias Braun Date: Mon, 26 Nov 2007 19:38:54 +0000 (+0000) Subject: fix array_access in ast2firm X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=76e124d2b8645b43937d8213870c725859c46433;p=cparser fix array_access in ast2firm [r18542] --- diff --git a/ast2firm.c b/ast2firm.c index 9166ff6..7405cb8 100644 --- a/ast2firm.c +++ b/ast2firm.c @@ -1356,25 +1356,16 @@ static ir_node *binary_expression_to_firm(const binary_expression_t *expression) static ir_node *array_access_addr(const array_access_expression_t *expression) { - dbg_info *dbgi = get_dbg_info(&expression->expression.source_position); - ir_node *base_addr; - ir_node *offset; - - type_t *type_left = skip_typeref(expression->array_ref->datatype); - type_t *type_right = skip_typeref(expression->index->datatype); + dbg_info *dbgi = get_dbg_info(&expression->expression.source_position); + ir_node *base_addr = expression_to_firm(expression->array_ref); + ir_node *offset = expression_to_firm(expression->index); + offset = create_conv(dbgi, offset, mode_Iu); - if(type_left->type == TYPE_POINTER || type_left->type == TYPE_ARRAY) { - base_addr = expression_to_firm(expression->array_ref); - offset = expression_to_firm(expression->index); - } else { - assert(type_right->type == TYPE_POINTER - || type_right->type == TYPE_ARRAY); - base_addr = expression_to_firm(expression->index); - offset = expression_to_firm(expression->array_ref); - } - offset = create_conv(dbgi, offset, mode_Iu); + type_t *ref_type = skip_typeref(expression->array_ref->datatype); + assert(is_type_pointer(ref_type)); + pointer_type_t *pointer_type = (pointer_type_t*) ref_type; - unsigned elem_size = get_type_size(expression->expression.datatype); + unsigned elem_size = get_type_size(pointer_type->points_to); ir_node *elem_size_const = new_Const_long(mode_Iu, elem_size); ir_node *real_offset = new_d_Mul(dbgi, offset, elem_size_const, mode_Iu);