aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog16
-rw-r--r--gdb/cp-valprint.c17
-rw-r--r--gdb/jv-valprint.c22
-rw-r--r--gdb/p-valprint.c6
-rw-r--r--gdb/testsuite/ChangeLog6
-rw-r--r--gdb/testsuite/gdb.cp/m-static.exp5
-rw-r--r--gdb/valops.c11
-rw-r--r--gdb/value.c5
8 files changed, 53 insertions, 35 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index ec491c5..88b8340 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,19 @@
+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.
+
2013-10-25 Yao Qi <yao@codesourcery.com>
* remote.c (remote_traceframe_info): Return early if
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/ChangeLog b/gdb/testsuite/ChangeLog
index 40391c9..0c1dbef 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+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.
+
2013-10-24 Maciej W. Rozycki <macro@codesourcery.com>
* 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 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)
/* 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),