From b9d652ac9954ac138ef34cb425010e417a942097 Mon Sep 17 00:00:00 2001 From: Daniel Jacobowitz Date: Fri, 7 Dec 2001 22:13:19 +0000 Subject: [PATCH] * cp-valprint.c (cp_print_value): Preserve offset if the virtual base is outside of this object. --- gdb/ChangeLog | 5 +++++ gdb/cp-valprint.c | 14 +++++++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 6b54dfa7f1..392be631a3 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2001-12-07 Daniel Jacobowitz + + * cp-valprint.c (cp_print_value): Preserve offset if + the virtual base is outside of this object. + 2001-12-07 Daniel Jacobowitz * gdbtypes.c (finish_cv_type): New function. diff --git a/gdb/cp-valprint.c b/gdb/cp-valprint.c index a4f81061bf..567e0abed3 100644 --- a/gdb/cp-valprint.c +++ b/gdb/cp-valprint.c @@ -33,6 +33,7 @@ #include "gdb_string.h" #include "c-lang.h" #include "target.h" +#include "cp-abi.h" /* Indication of presence of HP-compiled object files */ extern int hp_som_som_object_present; /* defined in symtab.c */ @@ -504,6 +505,8 @@ cp_print_value (struct type *type, struct type *real_type, char *valaddr, struct type **last_dont_print = (struct type **) obstack_next_free (&dont_print_vb_obstack); int i, n_baseclasses = TYPE_N_BASECLASSES (type); + int thisoffset; + struct type *thistype; if (dont_print_vb == 0) { @@ -538,6 +541,8 @@ cp_print_value (struct type *type, struct type *real_type, char *valaddr, obstack_ptr_grow (&dont_print_vb_obstack, baseclass); } + thisoffset = offset; + thistype = real_type; if (TYPE_HAS_VTABLE (type) && BASETYPE_VIA_VIRTUAL (type, i)) { /* Assume HP/Taligent runtime convention */ @@ -566,9 +571,12 @@ cp_print_value (struct type *type, struct type *real_type, char *valaddr, || (boffset + offset) >= TYPE_LENGTH (type))) { base_valaddr = (char *) alloca (TYPE_LENGTH (baseclass)); - if (target_read_memory (address + boffset, base_valaddr, + if (target_read_memory (address + offset + boffset, base_valaddr, TYPE_LENGTH (baseclass)) != 0) skip = 1; + thisoffset = 0; + boffset = 0; + thistype = baseclass; } else base_valaddr = valaddr; @@ -593,8 +601,8 @@ cp_print_value (struct type *type, struct type *real_type, char *valaddr, if (skip >= 1) fprintf_filtered (stream, ""); else - cp_print_value_fields (baseclass, real_type, base_valaddr, - offset + boffset, address, stream, format, + cp_print_value_fields (baseclass, thistype, base_valaddr, + thisoffset + boffset, address, stream, format, recurse, pretty, ((struct type **) obstack_base (&dont_print_vb_obstack)),