[gdb/f20] Fix regression#2 of the optimized-out entry data values fix (of BZ 1111910).

Jan Kratochvil jankratochvil at fedoraproject.org
Fri Jul 11 15:41:03 UTC 2014


commit f5d828286878529193a2c4d3b80a51c13d9c1812
Author: Jan Kratochvil <jan.kratochvil at redhat.com>
Date:   Fri Jul 11 17:41:13 2014 +0200

    Fix regression#2 of the optimized-out entry data values fix (of BZ 1111910).

 gdb-entrydataoptimizedout.patch |  108 ++++++++++++++++++++++++---------------
 gdb.spec                        |    5 ++-
 2 files changed, 70 insertions(+), 43 deletions(-)
---
diff --git a/gdb-entrydataoptimizedout.patch b/gdb-entrydataoptimizedout.patch
index 5d1ccc9..c28ff3a 100644
--- a/gdb-entrydataoptimizedout.patch
+++ b/gdb-entrydataoptimizedout.patch
@@ -1,48 +1,74 @@
-http://sourceware.org/ml/gdb-patches/2014-07/msg00158.html
-Subject: [patchv2] Fix crash on optimized-out entry data values
+http://sourceware.org/ml/gdb-patches/2014-07/msg00277.html
+Subject: [patchv3] Fix crash on optimized-out entry data values
 
 
---UlVJffcvxoiEqYs2
+--Dxnq1zWXvFF0Q93v
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
 
-Hi,
+On Wed, 09 Jul 2014 17:31:21 +0200, Jan Kratochvil wrote:
+> On Wed, 09 Jul 2014 13:52:00 +0200, Pedro Alves wrote:
+> > On 07/09/2014 11:33 AM, Jan Kratochvil wrote:
+> > > --- a/gdb/value.c
+> > > +++ b/gdb/value.c
+> > > @@ -198,12 +198,13 @@ struct value
+> > >    unsigned int lazy : 1;
+> > >  
+> > >    /* If nonzero, this is the value of a variable that does not
+> > > -     actually exist in the program.  If nonzero, and LVAL is
+> > > +     actually fully exist in the program.  If nonzero, and LVAL is
+> > >       lval_register, this is a register ($pc, $sp, etc., never a
+> > >       program variable) that has not been saved in the frame.  All
+> > >       optimized-out values are treated pretty much the same, except
+> > >       registers have a different string representation and related
+> > > -     error strings.  */
+> > > +     error strings.  It is true also for only partially optimized
+> > > +     out variables - see the 'unavailable' field below.  */
+> > >    unsigned int optimized_out : 1;
+> > >  
+> > >    /* If value is a variable, is it initialized or not.  */
+> > > @@ -334,7 +335,10 @@ struct value
+> > >       valid if lazy is nonzero.  */
+> > >    gdb_byte *contents;
+> > >  
+> > > -  /* Unavailable ranges in CONTENTS.  We mark unavailable ranges,
+> > > +  /* If OPTIMIZED_OUT is false then UNAVAILABLE must be VEC_empty
+> > > +     (not necessarily NULL).  
+> > 
+> > Hmm, why?  We can collect only part of a non-optimized out value.
+> > What am I missing?
+> 
+> I miss some documentation how these availability fields interact together.
 
-former post of this fix was for:
-	[patch+7.8] Fix crash on optimized-out entry data values
-	https://sourceware.org/ml/gdb-patches/2014-06/msg00797.html
-=
-	https://bugzilla.redhat.com/show_bug.cgi?id=1111910
-	this can happen for real world -O2 -g executables:
-	#9  0x0000003b6e0998b2 in wxEntry (argc=@0x7fffffffd86c: 1,
-	    argc at entry=@0x7fffffffd86c: <optimized out>,
-					^^^^^^^^^^^^^^^
-	    argv=<optimized out>) at src/common/init.cpp:460
-	GDB did crash in such case.
+>From a comment in mail
+	Message-Id: <201102071427.55970.pedro at codesourcery.com>
+	We give preference to printing <optimized out> rather
+	than <unavailable>, since if a value had been optimized out
+	at compile time, it can never be collected at run-time.
 
-But the fix was wrong/regressing as shown here:
-	https://bugzilla.redhat.com/show_bug.cgi?id=1117192
-	https://bugzilla.redhat.com/attachment.cgi?id=916298 (at the bottom)
+it seems it is just reversed, that 'unavailable' can exist only for
+!optimized_out and it cannot exist for for optimized_out values.
 
-Here is a new fix, also with a new testcase reproducing crash of the wrong fix
-above.
 
-No regressions on {x86_64,x86_64-m32,i686}-fedorarawhide-linux-gnu.
+> You are right, this patch regresses during gdbserver mode.
 
+It PASSes now even in gdbserver mode.
 
+
+Thanks,
 Jan
 
---UlVJffcvxoiEqYs2
+--Dxnq1zWXvFF0Q93v
 Content-Type: text/plain; charset=us-ascii
-Content-Disposition: inline; filename="optimfix2.patch"
+Content-Disposition: inline; filename="optimfix3.patch"
 
 gdb/
 2014-07-09  Jan Kratochvil  <jan.kratochvil at redhat.com>
 
 	* value.c (struct value): Extend the comment for fields optimized_out
 	and unavailable.
-	(value_available_contents_bits_eq): Handle OPTIMIZED_OUT values with
-	empty UNAVAILABLE as special cases.
+	(value_available_contents_bits_eq): Handle OPTIMIZED_OUT values as
+	special cases.
 
 gdb/testsuite/
 2014-07-09  Jan Kratochvil  <jan.kratochvil at redhat.com>
@@ -55,48 +81,46 @@ gdb/testsuite/
 	* gdb.arch/amd64-optimout-repeat.exp: New file.
 
 diff --git a/gdb/value.c b/gdb/value.c
-index 557056f..4b7495e 100644
+index 557056f..c017c75 100644
 --- a/gdb/value.c
 +++ b/gdb/value.c
-@@ -198,12 +198,13 @@ struct value
+@@ -198,12 +198,14 @@ struct value
    unsigned int lazy : 1;
  
    /* If nonzero, this is the value of a variable that does not
 -     actually exist in the program.  If nonzero, and LVAL is
-+     actually fully exist in the program.  If nonzero, and LVAL is
++     actually exist in the program at all.  If nonzero, and LVAL is
       lval_register, this is a register ($pc, $sp, etc., never a
       program variable) that has not been saved in the frame.  All
       optimized-out values are treated pretty much the same, except
       registers have a different string representation and related
 -     error strings.  */
-+     error strings.  It is true also for only partially optimized
-+     out variables - see the 'unavailable' field below.  */
++     error strings.  When it is zero it still maybe only partially
++     available (equally partially optimized out) - see the
++     'unavailable' field below.  */
    unsigned int optimized_out : 1;
  
    /* If value is a variable, is it initialized or not.  */
-@@ -334,7 +335,10 @@ struct value
+@@ -334,7 +336,9 @@ struct value
       valid if lazy is nonzero.  */
    gdb_byte *contents;
  
 -  /* Unavailable ranges in CONTENTS.  We mark unavailable ranges,
-+  /* If OPTIMIZED_OUT is false then UNAVAILABLE must be VEC_empty
-+     (not necessarily NULL).  If OPTIMIZED_OUT is true then VEC_empty
-+     UNAVAILABLE means the whole value range.  Otherwise it specifies
++  /* If OPTIMIZED_OUT is nonzero then UNAVAILABLE must be VEC_empty
++     (not necessarily NULL).  Otherwise it specifies
 +     unavailable ranges in CONTENTS.  We mark unavailable ranges,
       rather than available, since the common and default case is for a
       value to be available.  This is filled in at value read time.  The
       unavailable ranges are tracked in bits.  */
-@@ -701,6 +705,15 @@ value_available_contents_bits_eq (const struct value *val1, int offset1,
+@@ -701,6 +705,13 @@ value_available_contents_bits_eq (const struct value *val1, int offset1,
    /* See function description in value.h.  */
    gdb_assert (!val1->lazy && !val2->lazy);
  
-+  gdb_assert (val1->optimized_out || VEC_empty (range_s, val1->unavailable));
-+  gdb_assert (val2->optimized_out || VEC_empty (range_s, val2->unavailable));
++  gdb_assert (!val1->optimized_out || VEC_empty (range_s, val1->unavailable));
++  gdb_assert (!val2->optimized_out || VEC_empty (range_s, val2->unavailable));
 +  if (val1->optimized_out != val2->optimized_out)
 +    return 0;
-+  if (val1->optimized_out && val2->optimized_out
-+      && VEC_empty (range_s, val1->unavailable)
-+      && VEC_empty (range_s, val2->unavailable))
++  if (val1->optimized_out && val2->optimized_out)
 +    return 1;
 +
    while (length > 0)
@@ -648,7 +672,7 @@ index 0000000..f06247d
 +gdb_continue_to_breakpoint "break-here" ".* break-here .*"
 +gdb_test "frame" {bar \(ref=@0x[0-9a-f]+: 10, ref at entry=@0x[0-9a-f]+: <optimized out>\) at .*}
 diff --git a/gdb/testsuite/gdb.arch/amd64-optimout-repeat.S b/gdb/testsuite/gdb.arch/amd64-optimout-repeat.S
-new file mode 100755
+new file mode 100644
 index 0000000..2f8f4d2
 --- /dev/null
 +++ b/gdb/testsuite/gdb.arch/amd64-optimout-repeat.S
@@ -1028,5 +1052,5 @@ index 0000000..f3c93a4
 +
 +gdb_test "print v" { = {i = 0, xxx = {<optimized out> <repeats 256 times>}}}
 
---UlVJffcvxoiEqYs2--
+--Dxnq1zWXvFF0Q93v--
 
diff --git a/gdb.spec b/gdb.spec
index 7c5c6c3..0a8dd8c 100644
--- a/gdb.spec
+++ b/gdb.spec
@@ -39,7 +39,7 @@ Version: 7.7.1
 
 # The release always contains a leading reserved number, start it at 1.
 # `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing.
-Release: 16%{?dist}
+Release: 17%{?dist}
 
 License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and BSD and Public Domain and GFDL
 Group: Development/Debuggers
@@ -1408,6 +1408,9 @@ fi
 %endif # 0%{!?el5:1} || "%{_target_cpu}" == "noarch"
 
 %changelog
+* Fri Jul 11 2014 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.7.1-17.fc21
+- Fix regression#2 of the optimized-out entry data values fix (of BZ 1111910).
+
 * Wed Jul  9 2014 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.7.1-16.fc21
 - Fix regression of the optimized-out entry data values fix (of BZ 1111910).
 


More information about the scm-commits mailing list