/* Support for printing Pascal values for GDB, the GNU debugger.
- Copyright (C) 2000-2001, 2003, 2005-2012 Free Software Foundation,
- Inc.
+ Copyright (C) 2000-2015 Free Software Foundation, Inc.
This file is part of GDB.
#include "p-lang.h"
#include "cp-abi.h"
#include "cp-support.h"
-#include "exceptions.h"
+#include "objfiles.h"
\f
/* Decorations for Pascal. */
CORE_ADDR addr;
int want_space = 0;
- CHECK_TYPEDEF (type);
+ type = check_typedef (type);
switch (TYPE_CODE (type))
{
case TYPE_CODE_ARRAY:
len = high_bound - low_bound + 1;
elttype = check_typedef (TYPE_TARGET_TYPE (type));
eltlen = TYPE_LENGTH (elttype);
- if (options->prettyprint_arrays)
+ if (options->prettyformat_arrays)
{
print_spaces_filtered (2 + 2 * recurse, stream);
}
&& addr != 0)
{
ULONGEST string_length;
- void *buffer;
+ gdb_byte *buffer;
if (want_space)
fputs_filtered (" ", stream);
- buffer = xmalloc (length_size);
+ buffer = (gdb_byte *) xmalloc (length_size);
read_memory (addr + length_pos, buffer, length_size);
string_length = extract_unsigned_integer (buffer, length_size,
byte_order);
/* Print vtbl's nicely. */
CORE_ADDR vt_address = unpack_pointer (type,
valaddr + embedded_offset);
- struct minimal_symbol *msymbol =
+ struct bound_minimal_symbol msymbol =
lookup_minimal_symbol_by_pc (vt_address);
/* If 'symbol_print' is set, we did the work above. */
if (!options->symbol_print
- && (msymbol != NULL)
- && (vt_address == SYMBOL_VALUE_ADDRESS (msymbol)))
+ && (msymbol.minsym != NULL)
+ && (vt_address == BMSYMBOL_VALUE_ADDRESS (msymbol)))
{
if (want_space)
fputs_filtered (" ", stream);
fputs_filtered ("<", stream);
- fputs_filtered (SYMBOL_PRINT_NAME (msymbol), stream);
+ fputs_filtered (MSYMBOL_PRINT_NAME (msymbol.minsym), stream);
fputs_filtered (">", stream);
want_space = 1;
}
if (vt_address && options->vtblprint)
{
struct value *vt_val;
- struct symbol *wsym = (struct symbol *) NULL;
+ struct symbol *wsym = NULL;
struct type *wtype;
- struct block *block = (struct block *) NULL;
- int is_this_fld;
+ struct block *block = NULL;
+ struct field_of_this_result is_this_fld;
if (want_space)
fputs_filtered (" ", stream);
- if (msymbol != NULL)
- wsym = lookup_symbol (SYMBOL_LINKAGE_NAME (msymbol), block,
- VAR_DOMAIN, &is_this_fld);
+ if (msymbol.minsym != NULL)
+ wsym = lookup_symbol (MSYMBOL_LINKAGE_NAME (msymbol.minsym),
+ block,
+ VAR_DOMAIN, &is_this_fld).symbol;
if (wsym)
{
vt_val = value_at (wtype, vt_address);
common_val_print (vt_val, stream, recurse + 1, options,
current_language);
- if (options->pretty)
+ if (options->prettyformat)
{
fprintf_filtered (stream, "\n");
print_spaces_filtered (2 + 2 * recurse, stream);
}
break;
- case TYPE_CODE_BITSTRING:
case TYPE_CODE_SET:
elttype = TYPE_INDEX_TYPE (type);
- CHECK_TYPEDEF (elttype);
+ elttype = check_typedef (elttype);
if (TYPE_STUB (elttype))
{
fprintf_filtered (stream, "<incomplete type>");
struct type *range = elttype;
LONGEST low_bound, high_bound;
int i;
- int is_bitstring = TYPE_CODE (type) == TYPE_CODE_BITSTRING;
int need_comma = 0;
- if (is_bitstring)
- fputs_filtered ("B'", stream);
- else
- fputs_filtered ("[", stream);
+ fputs_filtered ("[", stream);
i = get_discrete_bounds (range, &low_bound, &high_bound);
if (low_bound == 0 && high_bound == -1 && TYPE_LENGTH (type) > 0)
i = element;
goto maybe_bad_bstring;
}
- if (is_bitstring)
- fprintf_filtered (stream, "%d", element);
- else if (element)
+ if (element)
{
if (need_comma)
fputs_filtered (", ", stream);
}
}
done:
- if (is_bitstring)
- fputs_filtered ("'", stream);
- else
- fputs_filtered ("]", stream);
+ fputs_filtered ("]", stream);
}
break;
int
pascal_object_is_vtbl_ptr_type (struct type *type)
{
- const char *typename = type_name_no_tag (type);
+ const char *type_name = type_name_no_tag (type);
- return (typename != NULL
- && strcmp (typename, pascal_vtbl_ptr_name) == 0);
+ return (type_name != NULL
+ && strcmp (type_name, pascal_vtbl_ptr_name) == 0);
}
/* Return truth value for the assertion that TYPE is of the type
int dont_print_statmem)
{
int i, len, n_baseclasses;
- char *last_dont_print = obstack_next_free (&dont_print_statmem_obstack);
+ char *last_dont_print
+ = (char *) obstack_next_free (&dont_print_statmem_obstack);
- CHECK_TYPEDEF (type);
+ type = check_typedef (type);
fprintf_filtered (stream, "{");
len = TYPE_NFIELDS (type);
fprintf_filtered (stream, ", ");
else if (n_baseclasses > 0)
{
- if (options->pretty)
+ if (options->prettyformat)
{
fprintf_filtered (stream, "\n");
print_spaces_filtered (2 + 2 * recurse, stream);
}
fields_seen = 1;
- if (options->pretty)
+ if (options->prettyformat)
{
fprintf_filtered (stream, "\n");
print_spaces_filtered (2 + 2 * recurse, stream);
{
wrap_here (n_spaces (2 + 2 * recurse));
}
- if (options->inspect_it)
- {
- if (TYPE_CODE (TYPE_FIELD_TYPE (type, i)) == TYPE_CODE_PTR)
- fputs_filtered ("\"( ptr \"", stream);
- else
- fputs_filtered ("\"( nodef \"", stream);
- if (field_is_static (&TYPE_FIELD (type, i)))
- fputs_filtered ("static ", stream);
- fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
- language_cplus,
- DMGL_PARAMS | DMGL_ANSI);
- fputs_filtered ("\" \"", stream);
- fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
- language_cplus,
- DMGL_PARAMS | DMGL_ANSI);
- fputs_filtered ("\") \"", stream);
- }
- else
- {
- annotate_field_begin (TYPE_FIELD_TYPE (type, i));
-
- if (field_is_static (&TYPE_FIELD (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 ();
- }
+
+ annotate_field_begin (TYPE_FIELD_TYPE (type, i));
+
+ if (field_is_static (&TYPE_FIELD (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 (!field_is_static (&TYPE_FIELD (type, i))
&& TYPE_FIELD_PACKED (type, i))
{
fputs_filtered (_("<synthetic pointer>"), stream);
}
- else if (!value_bits_valid (val, TYPE_FIELD_BITPOS (type, i),
- TYPE_FIELD_BITSIZE (type, i)))
- {
- val_print_optimized_out (stream);
- }
else
{
struct value_print_options opts = *options;
v = value_field_bitfield (type, i, valaddr, offset, val);
if (v == NULL)
- val_print_optimized_out (stream);
+ val_print_optimized_out (NULL, stream);
else
pascal_object_print_static_field (v, stream, recurse + 1,
options);
dont_print_statmem_obstack = tmp_obstack;
}
- if (options->pretty)
+ if (options->prettyformat)
{
fprintf_filtered (stream, "\n");
print_spaces_filtered (2 * recurse, stream);
const char *basename = type_name_no_tag (baseclass);
const gdb_byte *base_valaddr = NULL;
int thisoffset;
- volatile struct gdb_exception ex;
int skip = 0;
if (BASETYPE_VIA_VIRTUAL (type, i))
thisoffset = offset;
- TRY_CATCH (ex, RETURN_MASK_ERROR)
+ TRY
{
boffset = baseclass_offset (type, i, valaddr, offset, address, val);
}
- if (ex.reason < 0 && ex.error == NOT_AVAILABLE_ERROR)
- skip = -1;
- else if (ex.reason < 0)
- skip = 1;
- else
+ CATCH (ex, RETURN_MASK_ERROR)
{
- skip = 0;
+ if (ex.error == NOT_AVAILABLE_ERROR)
+ skip = -1;
+ else
+ skip = 1;
+ }
+ END_CATCH
+ if (skip == 0)
+ {
/* The virtual base class pointer might have been clobbered by the
user program. Make sure that it still points to a valid memory
location. */
if (boffset < 0 || boffset >= TYPE_LENGTH (type))
{
- /* FIXME (alloc): not safe is baseclass is really really big. */
- gdb_byte *buf = alloca (TYPE_LENGTH (baseclass));
+ gdb_byte *buf;
+ struct cleanup *back_to;
+
+ buf = (gdb_byte *) xmalloc (TYPE_LENGTH (baseclass));
+ back_to = make_cleanup (xfree, buf);
base_valaddr = buf;
if (target_read_memory (address + boffset, buf,
address = address + boffset;
thisoffset = 0;
boffset = 0;
+ do_cleanups (back_to);
}
else
base_valaddr = valaddr;
}
- if (options->pretty)
+ if (options->prettyformat)
{
fprintf_filtered (stream, "\n");
print_spaces_filtered (2 * recurse, stream);
struct type *type = value_type (val);
struct value_print_options opts;
+ if (value_entirely_optimized_out (val))
+ {
+ val_print_optimized_out (val, stream);
+ return;
+ }
+
if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
{
CORE_ADDR *first_dont_print, addr;
obstack_grow (&dont_print_statmem_obstack, (char *) &addr,
sizeof (CORE_ADDR));
- CHECK_TYPEDEF (type);
+ type = check_typedef (type);
pascal_object_print_value_fields (type,
value_contents_for_printing (val),
value_embedded_offset (val),