aboutsummaryrefslogtreecommitdiff
path: root/gdb/value.c
diff options
context:
space:
mode:
authorPedro Alves <palves@redhat.com>2013-10-25 11:37:13 +0100
committerTom Tromey <tromey@sourceware.org>2013-10-25 14:03:01 +0000
commit686d4defdf4a343d4b700b8b544cd40c4f16b0d1 (patch)
tree2bc3b79e49661ce780c986420177dd8f0f43eabf /gdb/value.c
parent96691246d49443c5141ec225c7cd313ce0015850 (diff)
downloadgdb-686d4defdf4a343d4b700b8b544cd40c4f16b0d1.zip
gdb-686d4defdf4a343d4b700b8b544cd40c4f16b0d1.tar.gz
gdb-686d4defdf4a343d4b700b8b544cd40c4f16b0d1.tar.bz2
Print nonexisting/optimized out static fields gracefully.
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 $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-25 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-25 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.
Diffstat (limited to 'gdb/value.c')
-rw-r--r--gdb/value.c5
1 files changed, 2 insertions, 3 deletions
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)
/* 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),