mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-04 22:15:12 +08:00
Add ability to return rvalue reference values from value_ref
Parameterize value_ref() by the kind of reference type the value of which is requested. Change all callers to use the new API. gdb/ChangeLog PR gdb/14441 * ada-lang.c (ada_evaluate_subexp): Adhere to the new value_ref() interface. * c-valprint.c (c_value_print): Likewise. * infcall.c (value_arg_coerce): Likewise. * python/py-value.c (valpy_reference_value): Likewise. * valops.c (value_cast, value_reinterpret_cast) (value_dynamic_cast, typecmp): Likewise. (value_ref): Parameterize by kind of return value reference type. * value.h (value_ref): Add new parameter "refcode".
This commit is contained in:

committed by
Keith Seitz

parent
3b22433085
commit
a65cfae5f8
@ -1,3 +1,16 @@
|
|||||||
|
2017-03-20 Artemiy Volkov <artemiyv@acm.org>
|
||||||
|
|
||||||
|
PR gdb/14441
|
||||||
|
* ada-lang.c (ada_evaluate_subexp): Adhere to the new
|
||||||
|
value_ref() interface.
|
||||||
|
* c-valprint.c (c_value_print): Likewise.
|
||||||
|
* infcall.c (value_arg_coerce): Likewise.
|
||||||
|
* python/py-value.c (valpy_reference_value): Likewise.
|
||||||
|
* valops.c (value_cast, value_reinterpret_cast)
|
||||||
|
(value_dynamic_cast, typecmp): Likewise.
|
||||||
|
(value_ref): Parameterize by kind of return value reference type.
|
||||||
|
* value.h (value_ref): Add new parameter "refcode".
|
||||||
|
|
||||||
2017-03-20 Artemiy Volkov <artemiyv@acm.org>
|
2017-03-20 Artemiy Volkov <artemiyv@acm.org>
|
||||||
|
|
||||||
PR gdb/14441
|
PR gdb/14441
|
||||||
|
@ -10707,7 +10707,7 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp,
|
|||||||
should return a ref as it should be valid to ask
|
should return a ref as it should be valid to ask
|
||||||
for its address; so rebuild a ref after coerce. */
|
for its address; so rebuild a ref after coerce. */
|
||||||
arg1 = ada_coerce_ref (arg1);
|
arg1 = ada_coerce_ref (arg1);
|
||||||
return value_ref (arg1);
|
return value_ref (arg1, TYPE_CODE_REF);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -606,10 +606,14 @@ c_value_print (struct value *val, struct ui_file *stream,
|
|||||||
else if (options->objectprint
|
else if (options->objectprint
|
||||||
&& (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_STRUCT))
|
&& (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_STRUCT))
|
||||||
{
|
{
|
||||||
int is_ref = TYPE_CODE (type) == TYPE_CODE_REF;
|
int is_ref = TYPE_IS_REFERENCE (type);
|
||||||
|
enum type_code refcode = TYPE_CODE_UNDEF;
|
||||||
|
|
||||||
if (is_ref)
|
if (is_ref)
|
||||||
val = value_addr (val);
|
{
|
||||||
|
val = value_addr (val);
|
||||||
|
refcode = TYPE_CODE (type);
|
||||||
|
}
|
||||||
|
|
||||||
/* Pointer to class, check real type of object. */
|
/* Pointer to class, check real type of object. */
|
||||||
fprintf_filtered (stream, "(");
|
fprintf_filtered (stream, "(");
|
||||||
@ -635,7 +639,7 @@ c_value_print (struct value *val, struct ui_file *stream,
|
|||||||
|
|
||||||
if (is_ref)
|
if (is_ref)
|
||||||
{
|
{
|
||||||
val = value_ref (value_ind (val));
|
val = value_ref (value_ind (val), refcode);
|
||||||
type = value_type (val);
|
type = value_type (val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -168,7 +168,7 @@ value_arg_coerce (struct gdbarch *gdbarch, struct value *arg,
|
|||||||
if the value was not previously in memory - in some cases
|
if the value was not previously in memory - in some cases
|
||||||
we should clearly be allowing this, but how? */
|
we should clearly be allowing this, but how? */
|
||||||
new_value = value_cast (TYPE_TARGET_TYPE (type), arg);
|
new_value = value_cast (TYPE_TARGET_TYPE (type), arg);
|
||||||
new_value = value_ref (new_value);
|
new_value = value_ref (new_value, TYPE_CODE (type));
|
||||||
return new_value;
|
return new_value;
|
||||||
}
|
}
|
||||||
case TYPE_CODE_INT:
|
case TYPE_CODE_INT:
|
||||||
|
@ -248,7 +248,7 @@ valpy_reference_value (PyObject *self, PyObject *args)
|
|||||||
scoped_value_mark free_values;
|
scoped_value_mark free_values;
|
||||||
|
|
||||||
self_val = ((value_object *) self)->value;
|
self_val = ((value_object *) self)->value;
|
||||||
result = value_to_value_object (value_ref (self_val));
|
result = value_to_value_object (value_ref (self_val, TYPE_CODE_REF));
|
||||||
}
|
}
|
||||||
CATCH (except, RETURN_MASK_ALL)
|
CATCH (except, RETURN_MASK_ALL)
|
||||||
{
|
{
|
||||||
|
@ -552,9 +552,10 @@ gdbpy_invoke_xmethod (const struct extension_language_defn *extlang,
|
|||||||
if (!types_equal (obj_type, this_ptr))
|
if (!types_equal (obj_type, this_ptr))
|
||||||
obj = value_cast (this_ptr, obj);
|
obj = value_cast (this_ptr, obj);
|
||||||
}
|
}
|
||||||
else if (TYPE_CODE (obj_type) == TYPE_CODE_REF)
|
else if (TYPE_IS_REFERENCE (obj_type))
|
||||||
{
|
{
|
||||||
struct type *this_ref = lookup_lvalue_reference_type (this_type);
|
struct type *this_ref
|
||||||
|
= lookup_reference_type (this_type, TYPE_CODE (obj_type));
|
||||||
|
|
||||||
if (!types_equal (obj_type, this_ref))
|
if (!types_equal (obj_type, this_ref))
|
||||||
obj = value_cast (this_ref, obj);
|
obj = value_cast (this_ref, obj);
|
||||||
|
25
gdb/valops.c
25
gdb/valops.c
@ -373,7 +373,7 @@ value_cast (struct type *type, struct value *arg2)
|
|||||||
struct type *dereftype = check_typedef (TYPE_TARGET_TYPE (t1));
|
struct type *dereftype = check_typedef (TYPE_TARGET_TYPE (t1));
|
||||||
struct value *val = value_cast (dereftype, arg2);
|
struct value *val = value_cast (dereftype, arg2);
|
||||||
|
|
||||||
return value_ref (val);
|
return value_ref (val, TYPE_CODE (t1));
|
||||||
}
|
}
|
||||||
|
|
||||||
code2 = TYPE_CODE (check_typedef (value_type (arg2)));
|
code2 = TYPE_CODE (check_typedef (value_type (arg2)));
|
||||||
@ -623,7 +623,8 @@ value_reinterpret_cast (struct type *type, struct value *arg)
|
|||||||
error (_("Invalid reinterpret_cast"));
|
error (_("Invalid reinterpret_cast"));
|
||||||
|
|
||||||
if (is_ref)
|
if (is_ref)
|
||||||
result = value_cast (type, value_ref (value_ind (result)));
|
result = value_cast (type, value_ref (value_ind (result),
|
||||||
|
TYPE_CODE (type)));
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -819,7 +820,9 @@ value_dynamic_cast (struct type *type, struct value *arg)
|
|||||||
arg_type,
|
arg_type,
|
||||||
&result) == 1)
|
&result) == 1)
|
||||||
return value_cast (type,
|
return value_cast (type,
|
||||||
is_ref ? value_ref (result) : value_addr (result));
|
is_ref
|
||||||
|
? value_ref (result, TYPE_CODE (resolved_type))
|
||||||
|
: value_addr (result));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The second dynamic check specified in 5.2.7. */
|
/* The second dynamic check specified in 5.2.7. */
|
||||||
@ -831,7 +834,9 @@ value_dynamic_cast (struct type *type, struct value *arg)
|
|||||||
value_address (tem), tem,
|
value_address (tem), tem,
|
||||||
rtti_type, &result) == 1)
|
rtti_type, &result) == 1)
|
||||||
return value_cast (type,
|
return value_cast (type,
|
||||||
is_ref ? value_ref (result) : value_addr (result));
|
is_ref
|
||||||
|
? value_ref (result, TYPE_CODE (resolved_type))
|
||||||
|
: value_addr (result));
|
||||||
|
|
||||||
if (TYPE_CODE (resolved_type) == TYPE_CODE_PTR)
|
if (TYPE_CODE (resolved_type) == TYPE_CODE_PTR)
|
||||||
return value_zero (type, not_lval);
|
return value_zero (type, not_lval);
|
||||||
@ -1527,16 +1532,20 @@ value_addr (struct value *arg1)
|
|||||||
contents. */
|
contents. */
|
||||||
|
|
||||||
struct value *
|
struct value *
|
||||||
value_ref (struct value *arg1)
|
value_ref (struct value *arg1, enum type_code refcode)
|
||||||
{
|
{
|
||||||
struct value *arg2;
|
struct value *arg2;
|
||||||
struct type *type = check_typedef (value_type (arg1));
|
struct type *type = check_typedef (value_type (arg1));
|
||||||
|
|
||||||
if (TYPE_CODE (type) == TYPE_CODE_REF)
|
gdb_assert (refcode == TYPE_CODE_REF || refcode == TYPE_CODE_RVALUE_REF);
|
||||||
|
|
||||||
|
if ((TYPE_CODE (type) == TYPE_CODE_REF
|
||||||
|
|| TYPE_CODE (type) == TYPE_CODE_RVALUE_REF)
|
||||||
|
&& TYPE_CODE (type) == refcode)
|
||||||
return arg1;
|
return arg1;
|
||||||
|
|
||||||
arg2 = value_addr (arg1);
|
arg2 = value_addr (arg1);
|
||||||
deprecated_set_value_type (arg2, lookup_lvalue_reference_type (type));
|
deprecated_set_value_type (arg2, lookup_reference_type (type, refcode));
|
||||||
return arg2;
|
return arg2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1743,7 +1752,7 @@ typecmp (int staticp, int varargs, int nargs,
|
|||||||
if (TYPE_CODE (tt2) == TYPE_CODE_ARRAY)
|
if (TYPE_CODE (tt2) == TYPE_CODE_ARRAY)
|
||||||
t2[i] = value_coerce_array (t2[i]);
|
t2[i] = value_coerce_array (t2[i]);
|
||||||
else
|
else
|
||||||
t2[i] = value_ref (t2[i]);
|
t2[i] = value_ref (t2[i], TYPE_CODE (tt1));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -775,7 +775,7 @@ extern struct value *value_ind (struct value *arg1);
|
|||||||
|
|
||||||
extern struct value *value_addr (struct value *arg1);
|
extern struct value *value_addr (struct value *arg1);
|
||||||
|
|
||||||
extern struct value *value_ref (struct value *arg1);
|
extern struct value *value_ref (struct value *arg1, enum type_code refcode);
|
||||||
|
|
||||||
extern struct value *value_assign (struct value *toval,
|
extern struct value *value_assign (struct value *toval,
|
||||||
struct value *fromval);
|
struct value *fromval);
|
||||||
|
Reference in New Issue
Block a user