diff options
author | Daniel Jacobowitz <drow@false.org> | 2001-12-07 22:13:19 +0000 |
---|---|---|
committer | Daniel Jacobowitz <drow@false.org> | 2001-12-07 22:13:19 +0000 |
commit | b9d652ac9954ac138ef34cb425010e417a942097 (patch) | |
tree | 57faae0f245701bbf5cbc28ad899bd7ee91b6c6f /gdb | |
parent | a02fd225edb13af1ba10ec58d3795b7572b46e54 (diff) | |
download | gdb-b9d652ac9954ac138ef34cb425010e417a942097.zip gdb-b9d652ac9954ac138ef34cb425010e417a942097.tar.gz gdb-b9d652ac9954ac138ef34cb425010e417a942097.tar.bz2 |
* cp-valprint.c (cp_print_value): Preserve offset if
the virtual base is outside of this object.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/cp-valprint.c | 14 |
2 files changed, 16 insertions, 3 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 6b54dfa..392be63 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,10 @@ 2001-12-07 Daniel Jacobowitz <drow@mvista.com> + * cp-valprint.c (cp_print_value): Preserve offset if + the virtual base is outside of this object. + +2001-12-07 Daniel Jacobowitz <drow@mvista.com> + * gdbtypes.c (finish_cv_type): New function. (check_typedef): Remove ``register'' keyword from argument. Preserve const and volatile attributes across filling in diff --git a/gdb/cp-valprint.c b/gdb/cp-valprint.c index a4f8106..567e0ab 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, "<invalid address>"); 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)), |