mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-28 18:10:46 +00:00
gdb/
* exceptions.h (NOT_AVAILABLE_ERROR): New error. * value.c: Include "exceptions.h". (require_available): Throw NOT_AVAILABLE_ERROR instead of a generic error. * cp-abi.c: Include gdb_assert.h. (baseclass_offset): Add `embedded_offset' and `val' parameters. Assert the method is implemented. Wrap NOT_AVAILABLE_ERROR errors. * cp-abi.h (baseclass_offset): Add `embedded_offset' and `val' parameters. No longer returns -1 on error. (struct cp_abi_ops) <baseclass_offset>: Add `embedded_offset' and `val' parameters. * cp-valprint.c: Include exceptions.h. (cp_print_value): Handle NOT_AVAILABLE_ERROR errors when fetching the baseclass_offset. Handle unavailable base classes. Use val_print_invalid_address. * p-valprint.c: Include exceptions.h. (pascal_object_print_value): Handle NOT_AVAILABLE_ERROR errors when fetching the baseclass_offset. No longer expect baseclass_offset returning -1. Handle unavailable base classes. Use val_print_invalid_address. * valops.c (dynamic_cast_check_1): Rename `contents' parameter to `valaddr' parameter, and change its type to gdb_byte pointer. Add `embedded_offset' and `val' parameters. Adjust. (dynamic_cast_check_2): Rename `contents' parameter to `valaddr' parameter, and change its type to gdb_byte pointer. Add `embedded_offset' and `val' parameters. Adjust. No longer expect baseclass_offset returning -1. (value_dynamic_cast): Use value_contents_for_printing rather than value_contents. Adjust. (search_struct_field): No longer expect baseclass_offset returning -1. (search_struct_method): If reading memory from the target is necessary, wrap it in a new value to pass to baseclass_offset. No longer expect baseclass_offset returning -1. (find_method_list): No longer expect baseclass_offset returning -1. Use value_contents_for_printing rather than value_contents. * valprint.c (val_print_invalid_address): New function. * valprint.h (val_print_invalid_address): Declare. * gdbtypes.c (is_unique_ancestor_worker): New `embedded_offset' and `val' parameters. No longer expect baseclass_offset returning -1. Adjust. * gnu-v2-abi.c: Include "exceptions.h". (gnuv2_baseclass_offset): Add `embedded_offset' and `val' parameters. Handle unavailable memory. Recurse through gnuv2_baseclass_offset directly, rather than through baseclass_offset. No longer returns -1 on not found, instead throw an error. * gnu-v3-abi.c (gnuv3_baseclass_offset): Add `embedded_offset' and `val' parameters. Adjust. gdb/testsuite/ * gdb.trace/unavailable.cc (class Base, class Middle, class Derived): New types. (derived_unavail, derived_partial, derived_whole): New globals. (virtual_partial): New global. (virtualp): Point at virtual_partial. * gdb.trace/unavailable.exp (gdb_collect_globals_test): Add tests related to unavailable vptr.
This commit is contained in:
@@ -38,6 +38,7 @@
|
||||
#include "p-lang.h"
|
||||
#include "cp-abi.h"
|
||||
#include "cp-support.h"
|
||||
#include "exceptions.h"
|
||||
|
||||
|
||||
/* See val_print for a description of the various parameters of this
|
||||
@@ -900,11 +901,13 @@ pascal_object_print_value (struct type *type, const gdb_byte *valaddr,
|
||||
|
||||
for (i = 0; i < n_baseclasses; i++)
|
||||
{
|
||||
int boffset;
|
||||
int boffset = 0;
|
||||
struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i));
|
||||
char *basename = type_name_no_tag (baseclass);
|
||||
const gdb_byte *base_valaddr;
|
||||
const gdb_byte *base_valaddr = NULL;
|
||||
int thisoffset;
|
||||
volatile struct gdb_exception ex;
|
||||
int skip = 0;
|
||||
|
||||
if (BASETYPE_VIA_VIRTUAL (type, i))
|
||||
{
|
||||
@@ -923,7 +926,38 @@ pascal_object_print_value (struct type *type, const gdb_byte *valaddr,
|
||||
|
||||
thisoffset = offset;
|
||||
|
||||
boffset = baseclass_offset (type, i, valaddr + offset, address + offset);
|
||||
TRY_CATCH (ex, RETURN_MASK_ERROR)
|
||||
{
|
||||
boffset = baseclass_offset (type, i, valaddr, offset, address, val);
|
||||
}
|
||||
if (ex.reason < 0 && ex.error == NOT_AVAILABLE_ERROR)
|
||||
skip = -1;
|
||||
else if (ex.reason < 0)
|
||||
skip = 1;
|
||||
else
|
||||
{
|
||||
skip = 0;
|
||||
|
||||
/* The virtual base class pointer might have been clobbered by the
|
||||
user program. Make sure that it still points to a valid memory
|
||||
location. */
|
||||
|
||||
if (boffset < 0 || boffset >= TYPE_LENGTH (type))
|
||||
{
|
||||
/* FIXME (alloc): not safe is baseclass is really really big. */
|
||||
gdb_byte *buf = alloca (TYPE_LENGTH (baseclass));
|
||||
|
||||
base_valaddr = buf;
|
||||
if (target_read_memory (address + boffset, buf,
|
||||
TYPE_LENGTH (baseclass)) != 0)
|
||||
skip = 1;
|
||||
address = address + boffset;
|
||||
thisoffset = 0;
|
||||
boffset = 0;
|
||||
}
|
||||
else
|
||||
base_valaddr = valaddr;
|
||||
}
|
||||
|
||||
if (options->pretty)
|
||||
{
|
||||
@@ -937,28 +971,10 @@ pascal_object_print_value (struct type *type, const gdb_byte *valaddr,
|
||||
fputs_filtered (basename ? basename : "", stream);
|
||||
fputs_filtered ("> = ", stream);
|
||||
|
||||
/* The virtual base class pointer might have been clobbered by the
|
||||
user program. Make sure that it still points to a valid memory
|
||||
location. */
|
||||
|
||||
if (boffset != -1 && (boffset < 0 || boffset >= TYPE_LENGTH (type)))
|
||||
{
|
||||
/* FIXME (alloc): not safe is baseclass is really really big. */
|
||||
gdb_byte *buf = alloca (TYPE_LENGTH (baseclass));
|
||||
|
||||
base_valaddr = buf;
|
||||
if (target_read_memory (address + boffset, buf,
|
||||
TYPE_LENGTH (baseclass)) != 0)
|
||||
boffset = -1;
|
||||
address = address + boffset;
|
||||
thisoffset = 0;
|
||||
boffset = 0;
|
||||
}
|
||||
else
|
||||
base_valaddr = valaddr;
|
||||
|
||||
if (boffset == -1)
|
||||
fprintf_filtered (stream, "<invalid address>");
|
||||
if (skip < 0)
|
||||
val_print_unavailable (stream);
|
||||
else if (skip > 0)
|
||||
val_print_invalid_address (stream);
|
||||
else
|
||||
pascal_object_print_value_fields (baseclass, base_valaddr,
|
||||
thisoffset + boffset, address,
|
||||
|
||||
Reference in New Issue
Block a user