From 686d4defdf4a343d4b700b8b544cd40c4f16b0d1 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Fri, 25 Oct 2013 11:37:13 +0100 Subject: [PATCH] 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 = } (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 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 . After the patch: (gdb) p sss $1 = {static aaa = } (gdb) p sss.aaa $2 = 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 for each). Tested on x86_64 Fedora 17. gdb/ 2013-10-25 Pedro Alves * 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 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 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 * 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/ChangeLog | 16 ++++++++++++++++ gdb/cp-valprint.c | 17 ++++++++++------- gdb/jv-valprint.c | 22 ++++++++-------------- gdb/p-valprint.c | 6 ++++++ gdb/testsuite/ChangeLog | 6 ++++++ gdb/testsuite/gdb.cp/m-static.exp | 5 ++++- gdb/valops.c | 11 +---------- gdb/value.c | 5 ++--- 8 files changed, 53 insertions(+), 35 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index ec491c55ef..88b8340206 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,19 @@ +2013-10-25 Pedro Alves + + * 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 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 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. + 2013-10-25 Yao Qi * remote.c (remote_traceframe_info): Return early if diff --git a/gdb/cp-valprint.c b/gdb/cp-valprint.c index 1d7147cdd2..4b625d1c4a 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, _(""), 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 cb89a85400..2c60cc088a 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 ("", stream); diff --git a/gdb/p-valprint.c b/gdb/p-valprint.c index e6d4b91c3a..7854bc0c85 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/ChangeLog b/gdb/testsuite/ChangeLog index 40391c9baf..0c1dbefd17 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2013-10-25 Pedro Alves + + * gdb.cp/m-static.exp: Adjust expected output of printing a + nonexistent or optimized out static field. Also test printing the + the "container" object. + 2013-10-24 Maciej W. Rozycki * lib/gdb.exp (gdb_finish): Send a kill request to `gdbserver' diff --git a/gdb/testsuite/gdb.cp/m-static.exp b/gdb/testsuite/gdb.cp/m-static.exp index 9b0e642d50..a5d388c804 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" "" "static const int initialized nowhere (print field)" + +# Same, but print the whole struct. +gdb_test "print test4" "static nowhere = .*" "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 15fd7c384b..8bff686810 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 d96d285cbd..1f562f52d4 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), -- 2.34.1