This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Assert on lval_register


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=7c2ba67e6ab10879968c938aefd4d0d0b4ce79bc

commit 7c2ba67e6ab10879968c938aefd4d0d0b4ce79bc
Author: Yao Qi <yao.qi@linaro.org>
Date:   Tue Dec 6 14:25:51 2016 +0000

    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.

Diff:
---
 gdb/ChangeLog | 8 ++++++++
 gdb/frame.c   | 5 ++++-
 gdb/value.c   | 2 ++
 3 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 4a64fca..ea1cff3 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -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".
diff --git a/gdb/frame.c b/gdb/frame.c
index 5414cb3..00001bc 100644
--- a/gdb/frame.c
+++ b/gdb/frame.c
@@ -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)
     {
diff --git a/gdb/value.c b/gdb/value.c
index cc291cf..022900f 100644
--- a/gdb/value.c
+++ b/gdb/value.c
@@ -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;
 }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]