gdb/testsuite/

* gdb.trace/unavailable.cc (struct Virtual): New.
	(virtualp): New global pointer.
	* gdb.trace/unavailable.exp (gdb_collect_globals_test): Test
	printing a pointer to an object whose type has a vtable, with
	print object on.

	gdb/
	* value.h (value_entirely_available): Declare.
	* value.c (value_entirely_available): New function.
	* c-valprint.c (c_value_print): Don't try fetching the pointer's
	real type if the pointer is unavailable.
This commit is contained in:
Pedro Alves
2011-02-14 11:33:24 +00:00
parent 24e6bceefb
commit ec0a52e162
7 changed files with 76 additions and 23 deletions

View File

@@ -686,29 +686,33 @@ c_value_print (struct value *val, struct ui_file *stream,
}
/* Pointer to class, check real type of object. */
fprintf_filtered (stream, "(");
real_type = value_rtti_target_type (val, &full,
&top, &using_enc);
if (real_type)
{
/* RTTI entry found. */
if (TYPE_CODE (type) == TYPE_CODE_PTR)
{
/* Create a pointer type pointing to the real
type. */
type = lookup_pointer_type (real_type);
}
else
{
/* Create a reference type referencing the real
type. */
type = lookup_reference_type (real_type);
}
/* JYG: Need to adjust pointer value. */
val = value_from_pointer (type, value_as_address (val) - top);
/* Note: When we look up RTTI entries, we don't get any
information on const or volatile attributes. */
}
if (value_entirely_available (val))
{
real_type = value_rtti_target_type (val, &full, &top, &using_enc);
if (real_type)
{
/* RTTI entry found. */
if (TYPE_CODE (type) == TYPE_CODE_PTR)
{
/* Create a pointer type pointing to the real
type. */
type = lookup_pointer_type (real_type);
}
else
{
/* Create a reference type referencing the real
type. */
type = lookup_reference_type (real_type);
}
/* Need to adjust pointer value. */
val = value_from_pointer (type, value_as_address (val) - top);
/* Note: When we look up RTTI entries, we don't get
any information on const or volatile
attributes. */
}
}
type_print (type, "", stream, -1);
fprintf_filtered (stream, ") ");
val_type = type;