X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;ds=sidebyside;f=gdb%2Fvalarith.c;h=887acc86751078ad3f5944b2b6119d414edccd29;hb=deeafabb678e59d8585be6d765c7fbd0e7060b6c;hp=4ee7f248b565d9cb1eecf5e94a7d4d58d08ea287;hpb=0d12e84cfc9bd36b7bbda01a3c8f83f65a832398;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/valarith.c b/gdb/valarith.c index 4ee7f248b5..887acc8675 100644 --- a/gdb/valarith.c +++ b/gdb/valarith.c @@ -183,11 +183,22 @@ value_subscript (struct value *array, LONGEST index) to doubles, but no longer does. */ struct value * -value_subscripted_rvalue (struct value *array, LONGEST index, int lowerbound) +value_subscripted_rvalue (struct value *array, LONGEST index, LONGEST lowerbound) { struct type *array_type = check_typedef (value_type (array)); struct type *elt_type = check_typedef (TYPE_TARGET_TYPE (array_type)); ULONGEST elt_size = type_length_units (elt_type); + + /* Fetch the bit stride and convert it to a byte stride, assuming 8 bits + in a byte. */ + LONGEST stride = TYPE_ARRAY_BIT_STRIDE (array_type); + if (stride != 0) + { + struct gdbarch *arch = get_type_arch (elt_type); + int unit_size = gdbarch_addressable_memory_unit_size (arch); + elt_size = stride / (unit_size * 8); + } + ULONGEST elt_offs = elt_size * (index - lowerbound); if (index < lowerbound @@ -335,7 +346,7 @@ value_user_defined_op (struct value **argp, gdb::array_view args, arg1.operator @ (arg1,arg2) and return that value (where '@' is any binary operator which is legal for GNU C++). - OP is the operatore, and if it is BINOP_ASSIGN_MODIFY, then OTHEROP + OP is the operator, and if it is BINOP_ASSIGN_MODIFY, then OTHEROP is the opcode saying how to modify it. Otherwise, OTHEROP is unused. */ @@ -988,7 +999,7 @@ scalar_binop (struct value *arg1, struct value *arg2, enum exp_opcode op) val = allocate_value (result_type); store_signed_integer (value_contents_raw (val), TYPE_LENGTH (result_type), - gdbarch_byte_order (get_type_arch (result_type)), + type_byte_order (result_type), v); } else @@ -1136,8 +1147,7 @@ scalar_binop (struct value *arg1, struct value *arg2, enum exp_opcode op) val = allocate_value (result_type); store_unsigned_integer (value_contents_raw (val), TYPE_LENGTH (value_type (val)), - gdbarch_byte_order - (get_type_arch (result_type)), + type_byte_order (result_type), v); } else @@ -1266,8 +1276,7 @@ scalar_binop (struct value *arg1, struct value *arg2, enum exp_opcode op) val = allocate_value (result_type); store_signed_integer (value_contents_raw (val), TYPE_LENGTH (value_type (val)), - gdbarch_byte_order - (get_type_arch (result_type)), + type_byte_order (result_type), v); } } @@ -1712,9 +1721,9 @@ value_bit_index (struct type *type, const gdb_byte *valaddr, int index) return -1; rel_index = index - low_bound; word = extract_unsigned_integer (valaddr + (rel_index / TARGET_CHAR_BIT), 1, - gdbarch_byte_order (gdbarch)); + type_byte_order (type)); rel_index %= TARGET_CHAR_BIT; - if (gdbarch_bits_big_endian (gdbarch)) + if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG) rel_index = TARGET_CHAR_BIT - 1 - rel_index; return (word >> rel_index) & 1; }