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);