- dbg_info *dbgi = get_dbg_info(&expression->base.source_position);
- ir_node *base_addr = expression_to_firm(expression->array_ref);
- ir_node *offset = expression_to_firm(expression->index);
-
- type_t *offset_type = skip_typeref(expression->index->base.type);
- ir_mode *mode;
- if (is_type_signed(offset_type)) {
- mode = get_ir_mode(type_ssize_t);
- } else {
- mode = get_ir_mode(type_size_t);
- }
- offset = create_conv(dbgi, offset, mode);
-
- type_t *ref_type = skip_typeref(expression->array_ref->base.type);
- assert(is_type_pointer(ref_type));
- pointer_type_t *pointer_type = &ref_type->pointer;
-
- ir_node *elem_size_const = get_type_size(pointer_type->points_to);
- elem_size_const = create_conv(dbgi, elem_size_const, mode);
- ir_node *real_offset = new_d_Mul(dbgi, offset, elem_size_const,
- mode);
- ir_node *result = new_d_Add(dbgi, base_addr, real_offset, mode_P_data);
+ dbg_info *dbgi = get_dbg_info(&expression->base.source_position);
+ ir_node *base_addr = expression_to_firm(expression->array_ref);
+ ir_node *offset = expression_to_firm(expression->index);
+ type_t *ref_type = skip_typeref(expression->array_ref->base.type);
+ ir_node *real_offset = adjust_for_pointer_arithmetic(dbgi, offset, ref_type);
+ ir_node *result = new_d_Add(dbgi, base_addr, real_offset, mode_P_data);