Assert on lval_register
authorYao Qi <yao.qi@linaro.org>
Tue, 6 Dec 2016 14:25:51 +0000 (14:25 +0000)
committerYao Qi <yao.qi@linaro.org>
Tue, 6 Dec 2016 14:25:51 +0000 (14:25 +0000)
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.

gdb/ChangeLog
gdb/frame.c
gdb/value.c

index 4a64fca8d2daa3dd3edaa9772d04d5aab41f0018..ea1cff35f83a63f9db5c6686c90719f8c11fc552 100644 (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".
index 5414cb3325aa6083b6c6d9a842856521c34d6b44..00001bcf3f5728c2e136c5e9bbce70449d01852c 100644 (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)
     {
index cc291cf7d9541f15df240144fbe303330fe0d4cd..022900ff73ca6ccff1b2153addf87d6ef460927e 100644 (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;
 }