Assert on lval_register

This patch adds asserts where the value's lval must be lval_register.
This triggers an error in frame_register_unwind because VALUE_REGNUM
is used but value's lval is not lval_register.

This also reveals a design issue in frame_register_unwind, that is
arguments addrp and realnump are mutually exclusive, we either use
addrp (for lval_memory), or use realnump (for lval_register).  This
can be done in a separate patch.

gdb:

2016-12-06  Yao Qi  <yao.qi@linaro.org>

	* frame.c (frame_register_unwind): Set *realnump if *lvalp is
	lval_register.
	* value.c (deprecated_value_next_frame_id_hack): Assert
	value->lval is lval_register.
	(deprecated_value_regnum_hack): Likewise.
This commit is contained in:
Yao Qi 2016-12-06 14:25:51 +00:00
parent 5e359a63b7
commit 7c2ba67e6a
3 changed files with 14 additions and 1 deletions

View File

@ -1,3 +1,11 @@
2016-12-06 Yao Qi <yao.qi@linaro.org>
* frame.c (frame_register_unwind): Set *realnump if *lvalp is
lval_register.
* value.c (deprecated_value_next_frame_id_hack): Assert
value->lval is lval_register.
(deprecated_value_regnum_hack): Likewise.
2016-12-02 Simon Marchi <simon.marchi@polymtl.ca>
* ui-out.h: Include "common/enum-flags.h".

View File

@ -1107,7 +1107,10 @@ frame_register_unwind (struct frame_info *frame, int regnum,
*unavailablep = !value_entirely_available (value);
*lvalp = VALUE_LVAL (value);
*addrp = value_address (value);
*realnump = VALUE_REGNUM (value);
if (*lvalp == lval_register)
*realnump = VALUE_REGNUM (value);
else
*realnump = -1;
if (bufferp)
{

View File

@ -1576,12 +1576,14 @@ deprecated_value_internalvar_hack (struct value *value)
struct frame_id *
deprecated_value_next_frame_id_hack (struct value *value)
{
gdb_assert (value->lval == lval_register);
return &value->location.reg.next_frame_id;
}
int *
deprecated_value_regnum_hack (struct value *value)
{
gdb_assert (value->lval == lval_register);
return &value->location.reg.regnum;
}