* value.h (value_bitstring_subscript): New prototype.
* valarith.h (value_bitstring_subscript): New function. (value_subscript): No longer handle TYPE_CODE_BITSTRING. * eval.c (evaluate_subexp_standard): Call value_bitstring_subscript instead of value_subscript to handle TYPE_CODE_BITSTRING.
This commit is contained in:
parent
3e79cecf02
commit
afc05acb8b
|
@ -1,3 +1,11 @@
|
||||||
|
2008-09-11 Ulrich Weigand <uweigand@de.ibm.com>
|
||||||
|
|
||||||
|
* value.h (value_bitstring_subscript): New prototype.
|
||||||
|
* valarith.h (value_bitstring_subscript): New function.
|
||||||
|
(value_subscript): No longer handle TYPE_CODE_BITSTRING.
|
||||||
|
* eval.c (evaluate_subexp_standard): Call value_bitstring_subscript
|
||||||
|
instead of value_subscript to handle TYPE_CODE_BITSTRING.
|
||||||
|
|
||||||
2008-09-11 Ulrich Weigand <uweigand@de.ibm.com>
|
2008-09-11 Ulrich Weigand <uweigand@de.ibm.com>
|
||||||
|
|
||||||
* expression.h (struct expression): New member GDBARCH.
|
* expression.h (struct expression): New member GDBARCH.
|
||||||
|
|
23
gdb/eval.c
23
gdb/eval.c
|
@ -1666,7 +1666,28 @@ evaluate_subexp_standard (struct type *expect_type,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
arg1 = value_subscript (arg1, arg2);
|
arg1 = coerce_ref (arg1);
|
||||||
|
type = check_typedef (value_type (arg1));
|
||||||
|
|
||||||
|
switch (TYPE_CODE (type))
|
||||||
|
{
|
||||||
|
case TYPE_CODE_PTR:
|
||||||
|
case TYPE_CODE_ARRAY:
|
||||||
|
case TYPE_CODE_STRING:
|
||||||
|
arg1 = value_subscript (arg1, arg2);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TYPE_CODE_BITSTRING:
|
||||||
|
arg1 = value_bitstring_subscript (LA_BOOL_TYPE, arg1, arg2);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
if (TYPE_NAME (type))
|
||||||
|
error (_("cannot subscript something of type `%s'"),
|
||||||
|
TYPE_NAME (type));
|
||||||
|
else
|
||||||
|
error (_("cannot subscript requested type"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (arg1);
|
return (arg1);
|
||||||
|
|
|
@ -171,6 +171,11 @@ an integer nor a pointer of the same type."));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the value of ARRAY[IDX].
|
/* Return the value of ARRAY[IDX].
|
||||||
|
|
||||||
|
ARRAY may be of type TYPE_CODE_ARRAY or TYPE_CODE_STRING. If the
|
||||||
|
current language supports C-style arrays, it may also be TYPE_CODE_PTR.
|
||||||
|
To access TYPE_CODE_BITSTRING values, use value_bitstring_subscript.
|
||||||
|
|
||||||
See comments in value_coerce_array() for rationale for reason for
|
See comments in value_coerce_array() for rationale for reason for
|
||||||
doing lower bounds adjustment here rather than there.
|
doing lower bounds adjustment here rather than there.
|
||||||
FIXME: Perhaps we should validate that the index is valid and if
|
FIXME: Perhaps we should validate that the index is valid and if
|
||||||
|
@ -218,34 +223,6 @@ value_subscript (struct value *array, struct value *idx)
|
||||||
array = value_coerce_array (array);
|
array = value_coerce_array (array);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TYPE_CODE (tarray) == TYPE_CODE_BITSTRING)
|
|
||||||
{
|
|
||||||
struct type *range_type = TYPE_INDEX_TYPE (tarray);
|
|
||||||
LONGEST index = value_as_long (idx);
|
|
||||||
struct value *v;
|
|
||||||
int offset, byte, bit_index;
|
|
||||||
LONGEST lowerbound, upperbound;
|
|
||||||
get_discrete_bounds (range_type, &lowerbound, &upperbound);
|
|
||||||
if (index < lowerbound || index > upperbound)
|
|
||||||
error (_("bitstring index out of range"));
|
|
||||||
index -= lowerbound;
|
|
||||||
offset = index / TARGET_CHAR_BIT;
|
|
||||||
byte = *((char *) value_contents (array) + offset);
|
|
||||||
bit_index = index % TARGET_CHAR_BIT;
|
|
||||||
byte >>= (gdbarch_bits_big_endian (current_gdbarch) ?
|
|
||||||
TARGET_CHAR_BIT - 1 - bit_index : bit_index);
|
|
||||||
v = value_from_longest (LA_BOOL_TYPE, byte & 1);
|
|
||||||
set_value_bitpos (v, bit_index);
|
|
||||||
set_value_bitsize (v, 1);
|
|
||||||
VALUE_LVAL (v) = VALUE_LVAL (array);
|
|
||||||
if (VALUE_LVAL (array) == lval_internalvar)
|
|
||||||
VALUE_LVAL (v) = lval_internalvar_component;
|
|
||||||
VALUE_ADDRESS (v) = VALUE_ADDRESS (array);
|
|
||||||
VALUE_FRAME_ID (v) = VALUE_FRAME_ID (array);
|
|
||||||
set_value_offset (v, offset + value_offset (array));
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (c_style)
|
if (c_style)
|
||||||
return value_ind (value_add (array, idx));
|
return value_ind (value_add (array, idx));
|
||||||
else
|
else
|
||||||
|
@ -286,6 +263,52 @@ value_subscripted_rvalue (struct value *array, struct value *idx, int lowerbound
|
||||||
set_value_offset (v, value_offset (array) + elt_offs);
|
set_value_offset (v, value_offset (array) + elt_offs);
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return the value of BITSTRING[IDX] as (boolean) type TYPE. */
|
||||||
|
|
||||||
|
struct value *
|
||||||
|
value_bitstring_subscript (struct type *type,
|
||||||
|
struct value *bitstring, struct value *idx)
|
||||||
|
{
|
||||||
|
|
||||||
|
struct type *bitstring_type, *range_type;
|
||||||
|
LONGEST index = value_as_long (idx);
|
||||||
|
struct value *v;
|
||||||
|
int offset, byte, bit_index;
|
||||||
|
LONGEST lowerbound, upperbound;
|
||||||
|
|
||||||
|
bitstring_type = check_typedef (value_type (bitstring));
|
||||||
|
gdb_assert (TYPE_CODE (bitstring_type) == TYPE_CODE_BITSTRING);
|
||||||
|
|
||||||
|
range_type = TYPE_INDEX_TYPE (bitstring_type);
|
||||||
|
get_discrete_bounds (range_type, &lowerbound, &upperbound);
|
||||||
|
if (index < lowerbound || index > upperbound)
|
||||||
|
error (_("bitstring index out of range"));
|
||||||
|
|
||||||
|
index -= lowerbound;
|
||||||
|
offset = index / TARGET_CHAR_BIT;
|
||||||
|
byte = *((char *) value_contents (bitstring) + offset);
|
||||||
|
|
||||||
|
bit_index = index % TARGET_CHAR_BIT;
|
||||||
|
byte >>= (gdbarch_bits_big_endian (current_gdbarch) ?
|
||||||
|
TARGET_CHAR_BIT - 1 - bit_index : bit_index);
|
||||||
|
|
||||||
|
v = value_from_longest (type, byte & 1);
|
||||||
|
|
||||||
|
set_value_bitpos (v, bit_index);
|
||||||
|
set_value_bitsize (v, 1);
|
||||||
|
|
||||||
|
VALUE_LVAL (v) = VALUE_LVAL (bitstring);
|
||||||
|
if (VALUE_LVAL (bitstring) == lval_internalvar)
|
||||||
|
VALUE_LVAL (v) = lval_internalvar_component;
|
||||||
|
VALUE_ADDRESS (v) = VALUE_ADDRESS (bitstring);
|
||||||
|
VALUE_FRAME_ID (v) = VALUE_FRAME_ID (bitstring);
|
||||||
|
|
||||||
|
set_value_offset (v, offset + value_offset (bitstring));
|
||||||
|
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Check to see if either argument is a structure, or a reference to
|
/* Check to see if either argument is a structure, or a reference to
|
||||||
one. This is called so we know whether to go ahead with the normal
|
one. This is called so we know whether to go ahead with the normal
|
||||||
|
|
|
@ -405,6 +405,10 @@ extern struct value *value_repeat (struct value *arg1, int count);
|
||||||
|
|
||||||
extern struct value *value_subscript (struct value *array, struct value *idx);
|
extern struct value *value_subscript (struct value *array, struct value *idx);
|
||||||
|
|
||||||
|
extern struct value *value_bitstring_subscript (struct type *type,
|
||||||
|
struct value *bitstring,
|
||||||
|
struct value *idx);
|
||||||
|
|
||||||
extern struct value *register_value_being_returned (struct type *valtype,
|
extern struct value *register_value_being_returned (struct type *valtype,
|
||||||
struct regcache *retbuf);
|
struct regcache *retbuf);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue