/* Language independent support for printing types for GDB, the GNU debugger.
- Copyright (C) 1986-2019 Free Software Foundation, Inc.
+ Copyright (C) 1986-2020 Free Software Foundation, Inc.
This file is part of GDB.
#include "cli/cli-utils.h"
#include "extension.h"
#include "completer.h"
+#include "cli/cli-style.h"
const struct type_print_options type_print_raw_options =
{
unsigned int hole_bit = hole % TARGET_CHAR_BIT;
if (hole_bit > 0)
- fprintf_filtered (stream, "/* XXX %2u-bit %s */\n", hole_bit,
+ fprintf_filtered (stream, "/* XXX %2u-bit %s */\n", hole_bit,
for_what);
if (hole_byte > 0)
- fprintf_filtered (stream, "/* XXX %2u-byte %s */\n", hole_byte,
+ fprintf_filtered (stream, "/* XXX %2u-byte %s */\n", hole_byte,
for_what);
}
}
print_offset_data::update (struct type *type, unsigned int field_idx,
struct ui_file *stream)
{
- if (field_is_static (&TYPE_FIELD (type, field_idx)))
+ if (field_is_static (&type->field (field_idx)))
{
print_spaces_filtered (indentation, stream);
return;
}
- struct type *ftype = check_typedef (TYPE_FIELD_TYPE (type, field_idx));
- if (TYPE_CODE (type) == TYPE_CODE_UNION)
+ struct type *ftype = check_typedef (type->field (field_idx).type ());
+ if (type->code () == TYPE_CODE_UNION)
{
/* Since union fields don't have the concept of offsets, we just
print their sizes. */
- fprintf_filtered (stream, "/* %4u */", TYPE_LENGTH (ftype));
+ fprintf_filtered (stream, "/* %4s */",
+ pulongest (TYPE_LENGTH (ftype)));
return;
}
maybe_print_hole (stream, bitpos, "hole");
- if (TYPE_FIELD_PACKED (type, field_idx))
+ if (TYPE_FIELD_PACKED (type, field_idx)
+ || offset_bitpos % TARGET_CHAR_BIT != 0)
{
- /* We're dealing with a bitfield. Print how many bits are left
- to be used. */
- unsigned int bitsize = TYPE_FIELD_BITSIZE (type, field_idx);
- /* The bitpos relative to the beginning of our container
- field. */
- unsigned int relative_bitpos;
-
- /* The following was copied from
- value.c:value_primitive_field. */
- if ((bitpos % fieldsize_bit) + bitsize <= fieldsize_bit)
- relative_bitpos = bitpos % fieldsize_bit;
- else
- relative_bitpos = bitpos % TARGET_CHAR_BIT;
+ /* We're dealing with a bitfield. Print the bit offset. */
+ fieldsize_bit = TYPE_FIELD_BITSIZE (type, field_idx);
- /* This is the exact offset (in bits) of this bitfield. */
- unsigned int bit_offset
- = (bitpos - relative_bitpos) + offset_bitpos;
+ unsigned real_bitpos = bitpos + offset_bitpos;
- /* The position of the field, relative to the beginning of the
- struct, and how many bits are left to be used in this
- container. */
- fprintf_filtered (stream, "/* %4u:%2u", bit_offset / TARGET_CHAR_BIT,
- fieldsize_bit - (relative_bitpos + bitsize));
- fieldsize_bit = bitsize;
+ fprintf_filtered (stream, "/* %4u:%2u", real_bitpos / TARGET_CHAR_BIT,
+ real_bitpos % TARGET_CHAR_BIT);
}
else
{
fputs_filtered ("\n", stream);
print_spaces_filtered (level + 4 + print_offset_data::indentation, stream);
- fprintf_filtered (stream, "/* total size (bytes): %4u */\n",
- TYPE_LENGTH (type));
+ fprintf_filtered (stream, "/* total size (bytes): %4s */\n",
+ pulongest (TYPE_LENGTH (type)));
}
\f
struct decl_field *tdef = &TYPE_TYPEDEF_FIELD (t, i);
void **slot;
- slot = htab_find_slot (m_table, tdef, INSERT);
+ slot = htab_find_slot (m_table.get (), tdef, INSERT);
/* Only add a given typedef name once. Really this shouldn't
happen; but it is safe enough to do the updates breadth-first
and thus use the most specific typedef. */
continue;
tf = XOBNEW (&m_storage, struct decl_field);
- tf->name = SYMBOL_LINKAGE_NAME (TYPE_TEMPLATE_ARGUMENT (t, i));
+ tf->name = TYPE_TEMPLATE_ARGUMENT (t, i)->linkage_name ();
tf->type = SYMBOL_TYPE (TYPE_TEMPLATE_ARGUMENT (t, i));
- slot = htab_find_slot (m_table, tf, INSERT);
+ slot = htab_find_slot (m_table.get (), tf, INSERT);
if (*slot == NULL)
*slot = tf;
}
/* See typeprint.h. */
typedef_hash_table::typedef_hash_table ()
+ : m_table (htab_create_alloc (10, hash_typedef_field, eq_typedef_field,
+ NULL, xcalloc, xfree))
{
- m_table = htab_create_alloc (10, hash_typedef_field, eq_typedef_field,
- NULL, xcalloc, xfree);
-}
-
-/* Free a typedef field table. */
-
-typedef_hash_table::~typedef_hash_table ()
-{
- htab_delete (m_table);
}
/* Helper function for typedef_hash_table::copy. */
typedef_hash_table::typedef_hash_table (const typedef_hash_table &table)
{
- m_table = htab_create_alloc (10, hash_typedef_field, eq_typedef_field,
- NULL, xcalloc, xfree);
- htab_traverse_noresize (table.m_table, copy_typedef_hash_element,
- m_table);
+ m_table.reset (htab_create_alloc (10, hash_typedef_field, eq_typedef_field,
+ NULL, xcalloc, xfree));
+ htab_traverse_noresize (table.m_table.get (), copy_typedef_hash_element,
+ m_table.get ());
}
/* Look up the type T in the global typedef hash. If it is found,
tf.name = NULL;
tf.type = t;
- slot = htab_find_slot (flags->global_typedefs->m_table, &tf, INSERT);
+ slot = htab_find_slot (flags->global_typedefs->m_table.get (), &tf, INSERT);
if (*slot != NULL)
{
new_tf = (struct decl_field *) *slot;
if (applied != NULL)
{
- new_tf->name
- = (const char *) obstack_copy0 (&flags->global_typedefs->m_storage,
- applied, strlen (applied));
+ new_tf->name = obstack_strdup (&flags->global_typedefs->m_storage,
+ applied);
xfree (applied);
}
tf.name = NULL;
tf.type = t;
- found = (struct decl_field *) htab_find (flags->local_typedefs->m_table,
- &tf);
+ htab_t table = flags->local_typedefs->m_table.get ();
+ found = (struct decl_field *) htab_find (table, &tf);
if (found != NULL)
return found->name;
LA_PRINT_TYPEDEF (type, newobj, stream);
}
-/* The default way to print a typedef. */
-
-void
-default_print_typedef (struct type *type, struct symbol *new_symbol,
- struct ui_file *stream)
-{
- error (_("Language not supported."));
-}
-
/* Print a description of a type TYPE in the form of a declaration of a
variable named VARSTRING. (VARSTRING is demangled if necessary.)
Output goes to STREAM (via stdio).
std::string
type_to_string (struct type *type)
{
- TRY
+ try
{
string_file stb;
type_print (type, "", &stb, -1);
return std::move (stb.string ());
}
- CATCH (except, RETURN_MASK_ALL)
+ catch (const gdb_exception &except)
{
}
- END_CATCH
return {};
}
void
type_print_unknown_return_type (struct ui_file *stream)
{
- fprintf_filtered (stream, _("<unknown return type>"));
+ fprintf_styled (stream, metadata_style.style (),
+ _("<unknown return type>"));
}
/* See typeprint.h. */
Use check_typedef to resolve stubs, but ignore its result
because we do not want to dig past all typedefs. */
check_typedef (type);
- if (TYPE_CODE (type) == TYPE_CODE_TYPEDEF)
+ if (type->code () == TYPE_CODE_TYPEDEF)
type = TYPE_TARGET_TYPE (type);
/* If the expression is actually a type, then there's no
get_user_print_options (&opts);
if (val != NULL && opts.objectprint)
{
- if (((TYPE_CODE (type) == TYPE_CODE_PTR) || TYPE_IS_REFERENCE (type))
- && (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_STRUCT))
+ if (((type->code () == TYPE_CODE_PTR) || TYPE_IS_REFERENCE (type))
+ && (TYPE_TARGET_TYPE (type)->code () == TYPE_CODE_STRUCT))
real_type = value_rtti_indirect_type (val, &full, &top, &using_enc);
- else if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
+ else if (type->code () == TYPE_CODE_STRUCT)
real_type = value_rtti_type (val, &full, &top, &using_enc);
}
if (flags.print_offsets
- && (TYPE_CODE (type) == TYPE_CODE_STRUCT
- || TYPE_CODE (type) == TYPE_CODE_UNION))
+ && (type->code () == TYPE_CODE_STRUCT
+ || type->code () == TYPE_CODE_UNION))
fprintf_filtered (gdb_stdout, "/* offset | size */ ");
printf_filtered ("type = ");
type = check_typedef (type);
- switch (TYPE_CODE (type))
+ switch (type->code ())
{
case TYPE_CODE_ENUM:
- len = TYPE_NFIELDS (type);
+ len = type->num_fields ();
for (i = 0; i < len; i++)
{
if (TYPE_FIELD_ENUMVAL (type, i) == val)
break;
case TYPE_CODE_INT:
- print_longest (stream, TYPE_UNSIGNED (type) ? 'u' : 'd', 0, val);
+ print_longest (stream, type->is_unsigned () ? 'u' : 'd', 0, val);
break;
case TYPE_CODE_CHAR:
default:
error (_("Invalid type code in symbol table."));
}
- gdb_flush (stream);
}
/* Dump details of a type specified either directly or indirectly.
struct cmd_list_element *showprinttypelist;
-static void
-set_print_type (const char *arg, int from_tty)
-{
- printf_unfiltered (
- "\"set print type\" must be followed by the name of a subcommand.\n");
- help_list (setprintlist, "set print type ", all_commands, gdb_stdout);
-}
-
-static void
-show_print_type (const char *args, int from_tty)
-{
- cmd_show_list (showprinttypelist, from_tty, "");
-}
-
-static int print_methods = 1;
+static bool print_methods = true;
static void
set_print_type_methods (const char *args,
value);
}
-static int print_typedefs = 1;
+static bool print_typedefs = true;
static void
set_print_type_typedefs (const char *args,
}
}
+void _initialize_typeprint ();
void
-_initialize_typeprint (void)
+_initialize_typeprint ()
{
struct cmd_list_element *c;
/M print methods defined in a class\n\
/t do not print typedefs defined in a class\n\
/T print typedefs defined in a class\n\
- /o print offsets and sizes of fields in a struct (like pahole)\n"));
+ /o print offsets and sizes of fields in a struct (like pahole)"));
set_cmd_completer (c, expression_completer);
c = add_com ("whatis", class_vars, whatis_command,
Only one level of typedefs is unrolled. See also \"ptype\"."));
set_cmd_completer (c, expression_completer);
- add_prefix_cmd ("type", no_class, show_print_type,
- _("Generic command for showing type-printing settings."),
- &showprinttypelist, "show print type ", 0, &showprintlist);
- add_prefix_cmd ("type", no_class, set_print_type,
- _("Generic command for setting how types print."),
- &setprinttypelist, "set print type ", 0, &setprintlist);
+ add_show_prefix_cmd ("type", no_class,
+ _("Generic command for showing type-printing settings."),
+ &showprinttypelist, "show print type ", 0,
+ &showprintlist);
+ add_basic_prefix_cmd ("type", no_class,
+ _("Generic command for setting how types print."),
+ &setprinttypelist, "set print type ", 0,
+ &setprintlist);
add_setshow_boolean_cmd ("methods", no_class, &print_methods,
_("\
void
val_print_not_allocated (struct ui_file *stream)
{
- fprintf_filtered (stream, _("<not allocated>"));
+ fprintf_styled (stream, metadata_style.style (), _("<not allocated>"));
}
/* Print <not associated> status to stream STREAM. */
void
val_print_not_associated (struct ui_file *stream)
{
- fprintf_filtered (stream, _("<not associated>"));
+ fprintf_styled (stream, metadata_style.style (), _("<not associated>"));
}