Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [PATCH] Print nonexisting/optimized out static fields gracefully.
@ 2013-10-10 18:25 Pedro Alves
  2013-10-15  1:07 ` Yao Qi
  2013-10-15 23:45 ` Doug Evans
  0 siblings, 2 replies; 4+ messages in thread
From: Pedro Alves @ 2013-10-10 18:25 UTC (permalink / raw)
  To: gdb-patches

With:

 struct static_struct { static int aaa; };
 struct static_struct sss;
 int main () { return 0; }

We get:

 (gdb) p sss
 $1 = {static aaa = <optimized out>}
 (gdb) p sss.aaa
 field aaa is nonexistent or has been optimized out

Note that the "field aaa ..." message is an error being thrown.

GDB is graceful everywhere else when printing optimized out values.
IOW it usually prints an <optimized out> value and puts that in the
value history.  I see no reason for here to be different, more so that
when the print the whole "containing" object (well, it's a static
field, so it's not really a container), we already print <optimized
out>.

After the patch:

 (gdb) p sss
 $1 = {static aaa = <optimized out>}
 (gdb) p sss.aaa
 field aaa is nonexistent or has been optimized out
 (gdb) p sss.aaa
 $2 = <optimized out>

The value_entirely_optimized_out checks are there to preserve
behavior.  Without those, if the static field is a struct/union, GDB
would go and print its fields one by one (and print <optimized out>
for each).

Tested on x86_64 Fedora 17.

gdb/
2013-10-10  Pedro Alves  <palves@redhat.com>

	* cp-valprint.c (cp_print_value_fields): No longer handle a NULL
	static field value.
	(cp_print_static_field): If the value is entirely optimized out,
	print <optimized out> here.
	* jv-valprint.c (java_print_value_fields): No longer handle a NULL
	static field value.
	* p-valprint.c (pascal_object_print_static_field): If the value is
	entirely optimized out, print <optimized out> here.
	* valops.c (do_search_struct_field)
	(value_struct_elt_for_reference): No longer handle a NULL static
	field value.
	* value.c (value_static_field): Return an optimized out value
	instead of NULL.

gdb/testsuite/
2013-10-10  Pedro Alves  <palves@redhat.com>

	* gdb.cp/m-static.exp: Adjust expected output of printing a
	nonexistent or optimized out static field.  Also test printing the
	the "container" object.
---
 gdb/cp-valprint.c                 | 17 ++++++++++-------
 gdb/jv-valprint.c                 | 22 ++++++++--------------
 gdb/p-valprint.c                  |  6 ++++++
 gdb/testsuite/gdb.cp/m-static.exp |  5 ++++-
 gdb/valops.c                      | 11 +----------
 gdb/value.c                       |  5 ++---
 6 files changed, 31 insertions(+), 35 deletions(-)

diff --git a/gdb/cp-valprint.c b/gdb/cp-valprint.c
index 1d7147c..4b625d1 100644
--- a/gdb/cp-valprint.c
+++ b/gdb/cp-valprint.c
@@ -333,12 +333,9 @@ cp_print_value_fields (struct type *type, struct type *real_type,
 		    fprintf_filtered (stream,
 				      _("<error reading variable: %s>"),
 				      ex.message);
-		  else if (v == NULL)
-		    val_print_optimized_out (NULL, stream);
-		  else
-		    cp_print_static_field (TYPE_FIELD_TYPE (type, i),
-					   v, stream, recurse + 1,
-					   options);
+		  cp_print_static_field (TYPE_FIELD_TYPE (type, i),
+					 v, stream, recurse + 1,
+					 options);
 		}
 	      else if (i == vptr_fieldno && type == vptr_basetype)
 		{
@@ -640,7 +637,13 @@ cp_print_static_field (struct type *type,
 		       const struct value_print_options *options)
 {
   struct value_print_options opts;
-  
+
+  if (value_entirely_optimized_out (val))
+    {
+      val_print_optimized_out (val, stream);
+      return;
+    }
+
   if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
     {
       CORE_ADDR *first_dont_print;
diff --git a/gdb/jv-valprint.c b/gdb/jv-valprint.c
index cb89a85..2c60cc0 100644
--- a/gdb/jv-valprint.c
+++ b/gdb/jv-valprint.c
@@ -417,22 +417,16 @@ java_print_value_fields (struct type *type, const gdb_byte *valaddr,
 		}
 	      else if (field_is_static (&TYPE_FIELD (type, i)))
 		{
+		  struct value_print_options opts;
 		  struct value *v = value_static_field (type, i);
+		  struct type *t = check_typedef (value_type (v));
 
-		  if (v == NULL)
-		    val_print_optimized_out (NULL, stream);
-		  else
-		    {
-		      struct value_print_options opts;
-		      struct type *t = check_typedef (value_type (v));
-
-		      if (TYPE_CODE (t) == TYPE_CODE_STRUCT)
-			v = value_addr (v);
-		      opts = *options;
-		      opts.deref_ref = 0;
-		      common_val_print (v, stream, recurse + 1,
-					&opts, current_language);
-		    }
+		  if (TYPE_CODE (t) == TYPE_CODE_STRUCT)
+		    v = value_addr (v);
+		  opts = *options;
+		  opts.deref_ref = 0;
+		  common_val_print (v, stream, recurse + 1,
+				    &opts, current_language);
 		}
 	      else if (TYPE_FIELD_TYPE (type, i) == NULL)
 		fputs_filtered ("<unknown type>", stream);
diff --git a/gdb/p-valprint.c b/gdb/p-valprint.c
index e6d4b91..7854bc0 100644
--- a/gdb/p-valprint.c
+++ b/gdb/p-valprint.c
@@ -844,6 +844,12 @@ pascal_object_print_static_field (struct value *val,
   struct type *type = value_type (val);
   struct value_print_options opts;
 
+  if (value_entirely_optimized_out (val))
+    {
+      val_print_optimized_out (val, stream);
+      return;
+    }
+
   if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
     {
       CORE_ADDR *first_dont_print, addr;
diff --git a/gdb/testsuite/gdb.cp/m-static.exp b/gdb/testsuite/gdb.cp/m-static.exp
index 9b0e642..a5d388c 100644
--- a/gdb/testsuite/gdb.cp/m-static.exp
+++ b/gdb/testsuite/gdb.cp/m-static.exp
@@ -169,7 +169,10 @@ if {[test_compiler_info {gcc-[0-3]-*}]
     # and DW_AT_MIPS_linkage_name = _ZN9gnu_obj_47nowhereE .
     setup_xfail *-*-*
 }
-gdb_test "print test4.nowhere" "field nowhere is nonexistent or has been optimized out" "static const int initialized nowhere"
+gdb_test "print test4.nowhere" "<optimized out>" "static const int initialized nowhere (print field)"
+
+# Same, but print the whole struct.
+gdb_test "print test4" "static nowhere = <optimized out>.*" "static const int initialized nowhere (whole struct)"
 
 # static const initialized in the class definition, PR gdb/11702.
 if { $non_dwarf } { setup_xfail *-*-* }
diff --git a/gdb/valops.c b/gdb/valops.c
index 15fd7c3..8bff686 100644
--- a/gdb/valops.c
+++ b/gdb/valops.c
@@ -1853,13 +1853,7 @@ do_search_struct_field (const char *name, struct value *arg1, int offset,
 	    struct value *v;
 
 	    if (field_is_static (&TYPE_FIELD (type, i)))
-	      {
-		v = value_static_field (type, i);
-		if (v == 0)
-		  error (_("field %s is nonexistent or "
-			   "has been optimized out"),
-			 name);
-	      }
+	      v = value_static_field (type, i);
 	    else
 	      v = value_primitive_field (arg1, offset, i, type);
 	    *result_ptr = v;
@@ -3123,9 +3117,6 @@ value_struct_elt_for_reference (struct type *domain, int offset,
 	  if (field_is_static (&TYPE_FIELD (t, i)))
 	    {
 	      v = value_static_field (t, i);
-	      if (v == NULL)
-		error (_("static field %s has been optimized out"),
-		       name);
 	      if (want_address)
 		v = value_addr (v);
 	      return v;
diff --git a/gdb/value.c b/gdb/value.c
index d96d285..1f562f5 100644
--- a/gdb/value.c
+++ b/gdb/value.c
@@ -2590,8 +2590,7 @@ unpack_pointer (struct type *type, const gdb_byte *valaddr)
 
 \f
 /* Get the value of the FIELDNO'th field (which must be static) of
-   TYPE.  Return NULL if the field doesn't exist or has been
-   optimized out.  */
+   TYPE.  */
 
 struct value *
 value_static_field (struct type *type, int fieldno)
@@ -2618,7 +2617,7 @@ value_static_field (struct type *type, int fieldno)
 							       NULL, NULL);
 
 	  if (!msym)
-	    return NULL;
+	    return allocate_optimized_out_value (type);
 	  else
 	    {
 	      retval = value_at_lazy (TYPE_FIELD_TYPE (type, fieldno),
-- 
1.7.11.7


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] Print nonexisting/optimized out static fields gracefully.
  2013-10-10 18:25 [PATCH] Print nonexisting/optimized out static fields gracefully Pedro Alves
@ 2013-10-15  1:07 ` Yao Qi
  2013-10-15  9:48   ` Pedro Alves
  2013-10-15 23:45 ` Doug Evans
  1 sibling, 1 reply; 4+ messages in thread
From: Yao Qi @ 2013-10-15  1:07 UTC (permalink / raw)
  To: Pedro Alves; +Cc: gdb-patches

On 10/11/2013 02:25 AM, Pedro Alves wrote:
> After the patch:
>
>   (gdb) p sss
>   $1 = {static aaa = <optimized out>}
>   (gdb) p sss.aaa
>   field aaa is nonexistent or has been optimized out

Does this message above still exist?

>   (gdb) p sss.aaa
>   $2 = <optimized out>


-- 
Yao (齐尧)


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] Print nonexisting/optimized out static fields gracefully.
  2013-10-15  1:07 ` Yao Qi
@ 2013-10-15  9:48   ` Pedro Alves
  0 siblings, 0 replies; 4+ messages in thread
From: Pedro Alves @ 2013-10-15  9:48 UTC (permalink / raw)
  To: Yao Qi; +Cc: gdb-patches

On 10/15/2013 02:05 AM, Yao Qi wrote:
> On 10/11/2013 02:25 AM, Pedro Alves wrote:
>> After the patch:
>>
>>   (gdb) p sss
>>   $1 = {static aaa = <optimized out>}
>>   (gdb) p sss.aaa
>>   field aaa is nonexistent or has been optimized out
> 
> Does this message above still exist?

Nope, sorry, it was a copy/paste error.  After patch, we get:

 (gdb) p sss
 $1 = {static aaa = <optimized out>}
 (gdb) p sss.aaa
 $2 = <optimized out>

IOW, consistent "<optimized out>".


> 
>>   (gdb) p sss.aaa
>>   $2 = <optimized out>
> 
> 


-- 
Pedro Alves


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] Print nonexisting/optimized out static fields gracefully.
  2013-10-10 18:25 [PATCH] Print nonexisting/optimized out static fields gracefully Pedro Alves
  2013-10-15  1:07 ` Yao Qi
@ 2013-10-15 23:45 ` Doug Evans
  1 sibling, 0 replies; 4+ messages in thread
From: Doug Evans @ 2013-10-15 23:45 UTC (permalink / raw)
  To: Pedro Alves; +Cc: gdb-patches

Pedro Alves writes:
 > With:
 > 
 >  struct static_struct { static int aaa; };
 >  struct static_struct sss;
 >  int main () { return 0; }
 > 
 > We get:
 > 
 >  (gdb) p sss
 >  $1 = {static aaa = <optimized out>}
 >  (gdb) p sss.aaa
 >  field aaa is nonexistent or has been optimized out
 > 
 > Note that the "field aaa ..." message is an error being thrown.
 > 
 > GDB is graceful everywhere else when printing optimized out values.
 > IOW it usually prints an <optimized out> value and puts that in the
 > value history.  I see no reason for here to be different, more so that
 > when the print the whole "containing" object (well, it's a static
 > field, so it's not really a container), we already print <optimized
 > out>.
 > 
 > After the patch:
 > 
 >  (gdb) p sss
 >  $1 = {static aaa = <optimized out>}
 >  (gdb) p sss.aaa
 >  field aaa is nonexistent or has been optimized out
 >  (gdb) p sss.aaa
 >  $2 = <optimized out>
 > 
 > The value_entirely_optimized_out checks are there to preserve
 > behavior.  Without those, if the static field is a struct/union, GDB
 > would go and print its fields one by one (and print <optimized out>
 > for each).
 > 
 > Tested on x86_64 Fedora 17.
 > 
 > gdb/
 > 2013-10-10  Pedro Alves  <palves@redhat.com>
 > 
 > 	* cp-valprint.c (cp_print_value_fields): No longer handle a NULL
 > 	static field value.
 > 	(cp_print_static_field): If the value is entirely optimized out,
 > 	print <optimized out> here.
 > 	* jv-valprint.c (java_print_value_fields): No longer handle a NULL
 > 	static field value.
 > 	* p-valprint.c (pascal_object_print_static_field): If the value is
 > 	entirely optimized out, print <optimized out> here.
 > 	* valops.c (do_search_struct_field)
 > 	(value_struct_elt_for_reference): No longer handle a NULL static
 > 	field value.
 > 	* value.c (value_static_field): Return an optimized out value
 > 	instead of NULL.
 > 
 > gdb/testsuite/
 > 2013-10-10  Pedro Alves  <palves@redhat.com>
 > 
 > 	* gdb.cp/m-static.exp: Adjust expected output of printing a
 > 	nonexistent or optimized out static field.  Also test printing the
 > 	the "container" object.

"works for me"
[modulo nit noticed by Yao]


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2013-10-15 23:45 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-10-10 18:25 [PATCH] Print nonexisting/optimized out static fields gracefully Pedro Alves
2013-10-15  1:07 ` Yao Qi
2013-10-15  9:48   ` Pedro Alves
2013-10-15 23:45 ` Doug Evans

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox