/* Language independent support for printing types for GDB, the GNU debugger.
- Copyright (C) 1986-2018 Free Software Foundation, Inc.
+ Copyright (C) 1986-2019 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);
}
}
{
/* 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
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);
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);
}
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. */
feature. */
if (show > 0
&& (current_language->la_language == language_c
- || current_language->la_language == language_cplus))
+ || current_language->la_language == language_cplus
+ || current_language->la_language == language_rust))
{
flags.print_offsets = 1;
flags.print_typedefs = 0;
default:
error (_("Invalid type code in symbol table."));
}
- gdb_flush (stream);
}
/* Dump details of a type specified either directly or indirectly.
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,
/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,
&showprinttypelist, "show print type ", 0, &showprintlist);
add_prefix_cmd ("type", no_class, set_print_type,
_("Generic command for setting how types print."),
- &setprinttypelist, "show print type ", 0, &setprintlist);
+ &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>"));
}