#include "command.h"
#include "gdbcmd.h"
#include "demangle.h"
+#include "annotate.h"
int vtblprint; /* Controls printing of vtbl's */
int objectprint; /* Controls looking up an object's derived type
using what we find in its vtables. */
+static int static_field_print; /* Controls printing of static fields. */
struct obstack dont_print_obstack;
static void
}
}
+/* This was what it was for gcc 2.4.5 and earlier. */
+static const char vtbl_ptr_name_old[] =
+ { CPLUS_MARKER,'v','t','b','l','_','p','t','r','_','t','y','p','e', 0 };
+/* It was changed to this after 2.4.5. */
+const char vtbl_ptr_name[] =
+ { '_','_','v','t','b','l','_','p','t','r','_','t','y','p','e', 0 };
+
/* Return truth value for assertion that TYPE is of the type
"pointer to virtual function". */
struct type *type;
{
char *typename = type_name_no_tag (type);
- /* This was what it was for gcc 2.4.5 and earlier. */
- static const char vtbl_ptr_name_old[] =
- { CPLUS_MARKER,'v','t','b','l','_','p','t','r','_','t','y','p','e', 0 };
- /* It was changed to this after 2.4.5. */
- static const char vtbl_ptr_name[] =
- { '_','_','v','t','b','l','_','p','t','r','_','t','y','p','e', 0 };
return (typename != NULL
&& (STREQ (typename, vtbl_ptr_name)
struct type *type;
{
if (TYPE_CODE (type) == TYPE_CODE_PTR)
- type = TYPE_TARGET_TYPE (type);
- else
- return 0;
-
- if (TYPE_CODE (type) == TYPE_CODE_ARRAY
- && TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_STRUCT)
- /* Virtual functions tables are full of pointers to virtual functions. */
- return cp_is_vtbl_ptr_type (TYPE_TARGET_TYPE (type));
+ {
+ type = TYPE_TARGET_TYPE (type);
+ if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
+ {
+ type = TYPE_TARGET_TYPE (type);
+ if (TYPE_CODE (type) == TYPE_CODE_STRUCT /* if not using thunks */
+ || TYPE_CODE (type) == TYPE_CODE_PTR) /* if using thunks */
+ {
+ /* Virtual functions tables are full of pointers
+ to virtual functions. */
+ return cp_is_vtbl_ptr_type (type);
+ }
+ }
+ }
return 0;
}
for (i = n_baseclasses; i < len; i++)
{
- /* Check if static field */
- if (TYPE_FIELD_STATIC (type, i))
+ /* If requested, skip printing of static fields. */
+ if (!static_field_print && TYPE_FIELD_STATIC (type, i))
continue;
if (fields_seen)
fprintf_filtered (stream, ", ");
fputs_filtered ("\"( ptr \"", stream);
else
fputs_filtered ("\"( nodef \"", stream);
+ if (TYPE_FIELD_STATIC (type, i))
+ fputs_filtered ("static ", stream);
fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
language_cplus,
DMGL_PARAMS | DMGL_ANSI);
}
else
{
+ annotate_field_begin (TYPE_FIELD_TYPE (type, i));
+
+ if (TYPE_FIELD_STATIC (type, i))
+ fputs_filtered ("static ", stream);
fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
language_cplus,
DMGL_PARAMS | DMGL_ANSI);
+ annotate_field_name_end ();
fputs_filtered (" = ", stream);
+ annotate_field_value ();
}
- if (TYPE_FIELD_PACKED (type, i))
+
+ if (!TYPE_FIELD_STATIC (type, i) && TYPE_FIELD_PACKED (type, i))
{
- value v;
+ value_ptr v;
/* Bitfields require special handling, especially due to byte
order problems. */
{
fputs_filtered ("<optimized out or zero length>", stream);
}
+ else if (TYPE_FIELD_STATIC (type, i))
+ {
+ value_ptr v;
+ char *phys_name = TYPE_FIELD_STATIC_PHYSNAME (type, i);
+ struct symbol *sym =
+ lookup_symbol (phys_name, 0, VAR_NAMESPACE, 0, NULL);
+ if (sym == NULL)
+ fputs_filtered ("<optimized out>", stream);
+ else
+ {
+ v = value_at (TYPE_FIELD_TYPE (type, i),
+ (CORE_ADDR)SYMBOL_BLOCK_VALUE (sym));
+ val_print (TYPE_FIELD_TYPE (type, i),
+ VALUE_CONTENTS_RAW (v),
+ VALUE_ADDRESS (v),
+ stream, format, 0, recurse + 1, pretty);
+ }
+ }
else
{
val_print (TYPE_FIELD_TYPE (type, i),
0, stream, format, 0, recurse + 1, pretty);
}
}
+ annotate_field_end ();
}
+
if (pretty)
{
fprintf_filtered (stream, "\n");
for (i = 0; i < n_baseclasses; i++)
{
+ /* FIXME-32x64--assumes that a target pointer can fit in a char *.
+ Fix it by nuking baseclass_addr. */
char *baddr;
int err;
- char *basename = TYPE_NAME (TYPE_BASECLASS (type, i));
+ char *basename;
+
+ check_stub_type (TYPE_BASECLASS (type, i));
+ basename = TYPE_NAME (TYPE_BASECLASS (type, i));
if (BASETYPE_VIA_VIRTUAL (type, i))
{
fputs_filtered (basename ? basename : "", stream);
fputs_filtered ("> = ", stream);
if (err != 0)
- fprintf_filtered (stream,
- "<invalid address 0x%lx>", (unsigned long) baddr);
+ {
+ fprintf_filtered (stream, "<invalid address ");
+ print_address_numeric ((CORE_ADDR) baddr, 1, stream);
+ fprintf_filtered (stream, ">");
+ }
else
cp_print_value_fields (TYPE_BASECLASS (type, i), baddr, stream, format,
recurse, pretty,
void
_initialize_cp_valprint ()
{
+ add_show_from_set
+ (add_set_cmd ("static-members", class_support, var_boolean,
+ (char *)&static_field_print,
+ "Set printing of C++ static members.",
+ &setprintlist),
+ &showprintlist);
+ /* Turn on printing of static fields. */
+ static_field_print = 1;
+
add_show_from_set
(add_set_cmd ("vtbl", class_support, var_boolean, (char *)&vtblprint,
"Set printing of C++ virtual function tables.",