/* Print values for GDB, the GNU debugger.
- Copyright (C) 1986-2021 Free Software Foundation, Inc.
+ Copyright (C) 1986-2022 Free Software Foundation, Inc.
This file is part of GDB.
#include "target-float.h"
#include "extension.h"
#include "ada-lang.h"
-#include "gdb_obstack.h"
+#include "gdbsupport/gdb_obstack.h"
#include "charset.h"
#include "typeprint.h"
#include <ctype.h>
{
struct type *type = check_typedef (value_type (val));
struct type *elttype = check_typedef (TYPE_TARGET_TYPE (type));
- const gdb_byte *valaddr = value_contents_for_printing (val);
+ const gdb_byte *valaddr = value_contents_for_printing (val).data ();
CORE_ADDR addr = unpack_pointer (type, valaddr);
print_unpacked_pointer (type, elttype, addr, stream, options);
gdb_assert (deref_val != NULL);
if (value_lval_const (deref_val) == lval_memory)
- return value_contents_for_printing_const (value_addr (deref_val));
+ return value_contents_for_printing_const (value_addr (deref_val)).data ();
else
{
/* We have a non-addressable value, such as a DW_AT_const_value. */
const int must_coerce_ref = ((options->addressprint && value_is_synthetic)
|| options->deref_ref);
const int type_is_defined = elttype->code () != TYPE_CODE_UNDEF;
- const gdb_byte *valaddr = value_contents_for_printing (original_value);
+ const gdb_byte *valaddr = value_contents_for_printing (original_value).data ();
if (must_coerce_ref && type_is_defined)
{
for (i = 0; i < len; i++)
{
QUIT;
- if (val == TYPE_FIELD_ENUMVAL (type, i))
+ if (val == type->field (i).loc_enumval ())
{
break;
}
{
QUIT;
- ULONGEST enumval = TYPE_FIELD_ENUMVAL (type, i);
+ ULONGEST enumval = type->field (i).loc_enumval ();
int nbits = count_one_bits_ll (enumval);
gdb_assert (nbits == 0 || nbits == 1);
else
fputs_filtered (" | ", stream);
- val &= ~TYPE_FIELD_ENUMVAL (type, i);
+ val &= ~type->field (i).loc_enumval ();
fputs_styled (type->field (i).name (),
variable_name_style.style (), stream);
}
gdb_assert (!options->format);
- const gdb_byte *valaddr = value_contents_for_printing (original_value);
+ const gdb_byte *valaddr = value_contents_for_printing (original_value).data ();
val = unpack_long (type, valaddr + embedded_offset * unit_size);
}
else
{
- const gdb_byte *valaddr = value_contents_for_printing (value);
+ const gdb_byte *valaddr = value_contents_for_printing (value).data ();
struct type *type = check_typedef (value_type (value));
LONGEST val = unpack_long (type, valaddr);
if (val == 0)
{
struct type *unresolved_type = value_type (value);
struct type *type = check_typedef (unresolved_type);
- const gdb_byte *valaddr = value_contents_for_printing (value);
+ const gdb_byte *valaddr = value_contents_for_printing (value).data ();
LONGEST val = unpack_long (type, valaddr);
if (type->is_unsigned ())
else
fprintf_filtered (stream, "%d", (int) val);
fputs_filtered (" ", stream);
- LA_PRINT_CHAR (val, unresolved_type, stream);
+ current_language->printchar (val, unresolved_type, stream);
}
}
{
gdb_assert (!options->format);
- const gdb_byte *valaddr = value_contents_for_printing (original_value);
+ const gdb_byte *valaddr = value_contents_for_printing (original_value).data ();
print_floating (valaddr, type, stream);
}
{
struct type *type = value_type (val);
- const gdb_byte *valaddr = value_contents_for_printing (val);
+ const gdb_byte *valaddr = value_contents_for_printing (val).data ();
gdb_mpf f;
f.read_fixed_point (gdb::make_array_view (valaddr, TYPE_LENGTH (type)),
/* Member pointers are essentially specific to C++, and so if we
encounter one, we should print it according to C++ rules. */
struct type *type = check_typedef (value_type (val));
- const gdb_byte *valaddr = value_contents_for_printing (val);
+ const gdb_byte *valaddr = value_contents_for_printing (val).data ();
cp_print_class_member (valaddr, type, stream, "&");
}
else
break;
case TYPE_CODE_METHODPTR:
- cplus_print_method_ptr (value_contents_for_printing (val), type,
+ cplus_print_method_ptr (value_contents_for_printing (val).data (), type,
stream);
break;
}
}
-/* Helper function for val_print and common_val_print that does the
- work. Arguments are as to val_print, but FULL_VALUE, if given, is
- the value to be printed. */
+/* Print using the given LANGUAGE the value VAL onto stream STREAM according
+ to OPTIONS.
-static void
-do_val_print (struct value *value, struct ui_file *stream, int recurse,
- const struct value_print_options *options,
- const struct language_defn *language)
+ This is a preferable interface to val_print, above, because it uses
+ GDB's value mechanism. */
+
+void
+common_val_print (struct value *value, struct ui_file *stream, int recurse,
+ const struct value_print_options *options,
+ const struct language_defn *language)
{
- int ret = 0;
+ if (language->la_language == language_ada)
+ /* The value might have a dynamic type, which would cause trouble
+ below when trying to extract the value contents (since the value
+ size is determined from the type size which is unknown). So
+ get a fixed representation of our value. */
+ value = ada_to_fixed_value (value);
+
+ if (value_lazy (value))
+ value_fetch_lazy (value);
+
struct value_print_options local_opts = *options;
struct type *type = value_type (value);
struct type *real_type = check_typedef (type);
if (!options->raw)
{
- ret = apply_ext_lang_val_pretty_printer (value, stream, recurse, options,
- language);
- if (ret)
+ if (apply_ext_lang_val_pretty_printer (value, stream, recurse, options,
+ language))
return;
}
catch (const gdb_exception_error &except)
{
fprintf_styled (stream, metadata_style.style (),
- _("<error reading variable>"));
+ _("<error reading variable: %s>"), except.what ());
}
}
return 1;
}
-/* Print using the given LANGUAGE the value VAL onto stream STREAM according
- to OPTIONS.
-
- This is a preferable interface to val_print, above, because it uses
- GDB's value mechanism. */
-
-void
-common_val_print (struct value *val, struct ui_file *stream, int recurse,
- const struct value_print_options *options,
- const struct language_defn *language)
-{
- if (language->la_language == language_ada)
- /* The value might have a dynamic type, which would cause trouble
- below when trying to extract the value contents (since the value
- size is determined from the type size which is unknown). So
- get a fixed representation of our value. */
- val = ada_to_fixed_value (val);
-
- if (value_lazy (val))
- value_fetch_lazy (val);
-
- do_val_print (val, stream, recurse, options, language);
-}
-
/* See valprint.h. */
void
val_print_type_code_flags (struct type *type, struct value *original_value,
int embedded_offset, struct ui_file *stream)
{
- const gdb_byte *valaddr = (value_contents_for_printing (original_value)
+ const gdb_byte *valaddr = (value_contents_for_printing (original_value).data ()
+ embedded_offset);
ULONGEST val = unpack_long (type, valaddr);
int field, nfields = type->num_fields ();
int. */
&& TYPE_FIELD_BITSIZE (type, field) == 1)
{
- if (val & ((ULONGEST)1 << TYPE_FIELD_BITPOS (type, field)))
+ if (val & ((ULONGEST)1 << type->field (field).loc_bitpos ()))
fprintf_filtered
(stream, " %ps",
styled_string (variable_name_style.style (),
else
{
unsigned field_len = TYPE_FIELD_BITSIZE (type, field);
- ULONGEST field_val = val >> TYPE_FIELD_BITPOS (type, field);
+ ULONGEST field_val = val >> type->field (field).loc_bitpos ();
if (field_len < sizeof (ULONGEST) * TARGET_CHAR_BIT)
field_val &= ((ULONGEST) 1 << field_len) - 1;
/* value_contents_for_printing fetches all VAL's contents. They are
needed to check whether VAL is optimized-out or unavailable
below. */
- const gdb_byte *valaddr = value_contents_for_printing (val);
+ const gdb_byte *valaddr = value_contents_for_printing (val).data ();
/* A scalar object that does not have all bits available can't be
printed, because all bits contribute to its representation. */
fprintf_filtered (stream, "\n");
print_spaces_filtered (2 + 2 * recurse, stream);
}
- wrap_here (n_spaces (2 + 2 * recurse));
+ stream->wrap_here (2 + 2 * recurse);
maybe_print_array_index (index_type, i + low_bound,
stream, options);
But if we fetch something and then get an error, print the string
and then the error message. */
if (err == 0 || bytes_read > 0)
- {
- LA_PRINT_STRING (stream, elttype, buffer.get (), bytes_read / width,
- encoding, force_ellipsis, options);
- }
+ current_language->printstr (stream, elttype, buffer.get (),
+ bytes_read / width,
+ encoding, force_ellipsis, options);
if (err != 0)
{
append_flags_type_field (flags_type, 5, 3, field_type, "C");
value *val = allocate_value (flags_type);
- gdb_byte *contents = value_contents_writeable (val);
+ gdb_byte *contents = value_contents_writeable (val).data ();
store_unsigned_integer (contents, 4, gdbarch_byte_order (arch), 0xaa);
string_file out;
selftests::register_test_foreach_arch ("print-flags", test_print_flags);
#endif
- cmd_list_element *cmd;
-
- cmd_list_element *set_print_cmd
- = add_basic_prefix_cmd ("print", no_class,
- _("Generic command for setting how things print."),
- &setprintlist, 0, &setlist);
- add_alias_cmd ("p", set_print_cmd, no_class, 1, &setlist);
+ set_show_commands setshow_print_cmds
+ = add_setshow_prefix_cmd ("print", no_class,
+ _("Generic command for setting how things print."),
+ _("Generic command for showing print settings."),
+ &setprintlist, &showprintlist,
+ &setlist, &showlist);
+ add_alias_cmd ("p", setshow_print_cmds.set, no_class, 1, &setlist);
/* Prefer set print to set prompt. */
- add_alias_cmd ("pr", set_print_cmd, no_class, 1, &setlist);
-
- cmd_list_element *show_print_cmd
- = add_show_prefix_cmd ("print", no_class,
- _("Generic command for showing print settings."),
- &showprintlist, 0, &showlist);
- add_alias_cmd ("p", show_print_cmd, no_class, 1, &showlist);
- add_alias_cmd ("pr", show_print_cmd, no_class, 1, &showlist);
-
- cmd = add_basic_prefix_cmd ("raw", no_class,
- _("\
-Generic command for setting what things to print in \"raw\" mode."),
- &setprintrawlist, 0, &setprintlist);
- deprecate_cmd (cmd, nullptr);
-
- cmd = add_show_prefix_cmd ("raw", no_class,
- _("Generic command for showing \"print raw\" settings."),
- &showprintrawlist, 0, &showprintlist);
- deprecate_cmd (cmd, nullptr);
+ add_alias_cmd ("pr", setshow_print_cmds.set, no_class, 1, &setlist);
+ add_alias_cmd ("p", setshow_print_cmds.show, no_class, 1, &showlist);
+ add_alias_cmd ("pr", setshow_print_cmds.show, no_class, 1, &showlist);
+
+ set_show_commands setshow_print_raw_cmds
+ = add_setshow_prefix_cmd
+ ("raw", no_class,
+ _("Generic command for setting what things to print in \"raw\" mode."),
+ _("Generic command for showing \"print raw\" settings."),
+ &setprintrawlist, &showprintrawlist, &setprintlist, &showprintlist);
+ deprecate_cmd (setshow_print_raw_cmds.set, nullptr);
+ deprecate_cmd (setshow_print_raw_cmds.show, nullptr);
gdb::option::add_setshow_cmds_for_options
(class_support, &user_print_options, value_print_option_defs,