/* Support for printing Pascal values for GDB, the GNU debugger.
- Copyright 2000
+ Copyright 2000, 2001
Free Software Foundation, Inc.
This file is part of GDB.
/* This file is derived from c-valprint.c */
#include "defs.h"
-#include "obstack.h"
+#include "gdb_obstack.h"
#include "symtab.h"
#include "gdbtypes.h"
#include "expression.h"
#include "gdbcore.h"
#include "demangle.h"
#include "valprint.h"
+#include "typeprint.h"
#include "language.h"
#include "target.h"
#include "annotate.h"
#include "p-lang.h"
+#include "cp-abi.h"
\f
int
-pascal_val_print (type, valaddr, embedded_offset, address, stream, format, deref_ref, recurse,
- pretty)
- struct type *type;
- char *valaddr;
- int embedded_offset;
- CORE_ADDR address;
- struct ui_file *stream;
- int format;
- int deref_ref;
- int recurse;
- enum val_prettyprint pretty;
+pascal_val_print (struct type *type, char *valaddr, int embedded_offset,
+ CORE_ADDR address, struct ui_file *stream, int format,
+ int deref_ref, int recurse, enum val_prettyprint pretty)
{
register unsigned int i = 0; /* Number of characters printed */
unsigned len;
struct type *elttype;
unsigned eltlen;
+ int length_pos, length_size, string_pos;
+ int char_size;
LONGEST val;
CORE_ADDR addr;
as GDB does not recognize stabs pascal strings
Pascal strings are mapped to records
with lowercase names PM */
- /* I don't know what GPC does :( PM */
- if (TYPE_CODE (elttype) == TYPE_CODE_STRUCT &&
- TYPE_NFIELDS (elttype) == 2 &&
- strcmp (TYPE_FIELDS (elttype)[0].name, "length") == 0 &&
- strcmp (TYPE_FIELDS (elttype)[1].name, "st") == 0 &&
- addr != 0)
+ if (is_pascal_string_type (elttype, &length_pos, &length_size,
+ &string_pos, &char_size, NULL)
+ && addr != 0)
{
- char bytelength;
- read_memory (addr, &bytelength, 1);
- i = val_print_string (addr + 1, bytelength, 1, stream);
+ ULONGEST string_length;
+ void *buffer;
+ buffer = xmalloc (length_size);
+ read_memory (addr + length_pos, buffer, length_size);
+ string_length = extract_unsigned_integer (buffer, length_size);
+ xfree (buffer);
+ i = val_print_string (addr + string_pos, string_length, char_size, stream);
}
else if (pascal_object_is_vtbl_member (type))
{
struct minimal_symbol *msymbol =
lookup_minimal_symbol_by_pc (vt_address);
- if ((msymbol != NULL) &&
- (vt_address == SYMBOL_VALUE_ADDRESS (msymbol)))
+ if ((msymbol != NULL)
+ && (vt_address == SYMBOL_VALUE_ADDRESS (msymbol)))
{
fputs_filtered (" <", stream);
fputs_filtered (SYMBOL_SOURCE_NAME (msymbol), stream);
}
if (vt_address && vtblprint)
{
- value_ptr vt_val;
+ struct value *vt_val;
struct symbol *wsym = (struct symbol *) NULL;
struct type *wtype;
struct symtab *s;
{
if (TYPE_CODE (elttype) != TYPE_CODE_UNDEF)
{
- value_ptr deref_val =
+ struct value *deref_val =
value_at
(TYPE_TARGET_TYPE (type),
unpack_pointer (lookup_pointer_type (builtin_type_void),
}
else
{
- if ((TYPE_NFIELDS (type) == 2) &&
- (strcmp (TYPE_FIELDS (type)[0].name, "length") == 0) &&
- (strcmp (TYPE_FIELDS (type)[1].name, "st") == 0))
+ if (is_pascal_string_type (type, &length_pos, &length_size,
+ &string_pos, &char_size, NULL))
{
- len = (*(valaddr + embedded_offset)) & 0xff;
- LA_PRINT_STRING (stream, valaddr + embedded_offset + 1, len, /* width ?? */ 0, 0);
+ len = extract_unsigned_integer (valaddr + embedded_offset + length_pos, length_size);
+ LA_PRINT_STRING (stream, valaddr + embedded_offset + string_pos, len, char_size, 0);
}
else
pascal_object_print_value_fields (type, valaddr + embedded_offset, address, stream, format,
case TYPE_CODE_SET:
elttype = TYPE_INDEX_TYPE (type);
CHECK_TYPEDEF (elttype);
- if (TYPE_FLAGS (elttype) & TYPE_FLAG_STUB)
+ if (TYPE_STUB (elttype))
{
fprintf_filtered (stream, "<incomplete type>");
gdb_flush (stream);
}
\f
int
-pascal_value_print (val, stream, format, pretty)
- value_ptr val;
- struct ui_file *stream;
- int format;
- enum val_prettyprint pretty;
+pascal_value_print (struct value *val, struct ui_file *stream, int format,
+ enum val_prettyprint pretty)
{
struct type *type = VALUE_TYPE (val);
static struct obstack dont_print_vb_obstack;
static struct obstack dont_print_statmem_obstack;
-static void
- pascal_object_print_static_field (struct type *, value_ptr, struct ui_file *, int, int,
- enum val_prettyprint);
+static void pascal_object_print_static_field (struct type *, struct value *,
+ struct ui_file *, int, int,
+ enum val_prettyprint);
static void
pascal_object_print_value (struct type *, char *, CORE_ADDR, struct ui_file *,
int, int, enum val_prettyprint, struct type **);
void
-pascal_object_print_class_method (valaddr, type, stream)
- char *valaddr;
- struct type *type;
- struct ui_file *stream;
+pascal_object_print_class_method (char *valaddr, struct type *type,
+ struct ui_file *stream)
{
struct type *domain;
struct fn_field *f = NULL;
f = TYPE_FN_FIELDLIST1 (domain, i);
len2 = TYPE_FN_FIELDLIST_LENGTH (domain, i);
+ check_stub_method_group (domain, i);
for (j = 0; j < len2; j++)
{
- QUIT;
if (TYPE_FN_FIELD_VOFFSET (f, j) == offset)
{
- if (TYPE_FN_FIELD_STUB (f, j))
- check_stub_method (domain, i, j);
kind = "virtual ";
goto common;
}
f = TYPE_FN_FIELDLIST1 (domain, i);
len2 = TYPE_FN_FIELDLIST_LENGTH (domain, i);
+ check_stub_method_group (domain, i);
for (j = 0; j < len2; j++)
{
- QUIT;
- if (TYPE_FN_FIELD_STUB (f, j))
- check_stub_method (domain, i, j);
if (STREQ (SYMBOL_NAME (sym), TYPE_FN_FIELD_PHYSNAME (f, j)))
- {
- goto common;
- }
+ goto common;
}
}
}
else
{
fputs_filtered (demangled_name, stream);
- free (demangled_name);
+ xfree (demangled_name);
}
}
else
"pointer to virtual function". */
int
-pascal_object_is_vtbl_ptr_type (type)
- struct type *type;
+pascal_object_is_vtbl_ptr_type (struct type *type)
{
char *typename = type_name_no_tag (type);
"pointer to virtual function table". */
int
-pascal_object_is_vtbl_member (type)
- struct type *type;
+pascal_object_is_vtbl_member (struct type *type)
{
if (TYPE_CODE (type) == TYPE_CODE_PTR)
{
should not print, or zero if called from top level. */
void
-pascal_object_print_value_fields (type, valaddr, address, stream, format, recurse, pretty,
- dont_print_vb, dont_print_statmem)
- struct type *type;
- char *valaddr;
- CORE_ADDR address;
- struct ui_file *stream;
- int format;
- int recurse;
- enum val_prettyprint pretty;
- struct type **dont_print_vb;
- int dont_print_statmem;
+pascal_object_print_value_fields (struct type *type, char *valaddr,
+ CORE_ADDR address, struct ui_file *stream,
+ int format, int recurse,
+ enum val_prettyprint pretty,
+ struct type **dont_print_vb,
+ int dont_print_statmem)
{
int i, len, n_baseclasses;
struct obstack tmp_obstack;
if (!TYPE_FIELD_STATIC (type, i) && TYPE_FIELD_PACKED (type, i))
{
- value_ptr v;
+ struct value *v;
/* Bitfields require special handling, especially due to byte
order problems. */
}
else if (TYPE_FIELD_STATIC (type, i))
{
- /* value_ptr v = value_static_field (type, i); v4.17 specific */
- value_ptr v;
+ /* struct value *v = value_static_field (type, i); v4.17 specific */
+ struct value *v;
v = value_from_longest (TYPE_FIELD_TYPE (type, i),
unpack_field_as_long (type, valaddr, i));
baseclasses. */
void
-pascal_object_print_value (type, valaddr, address, stream, format, recurse, pretty,
- dont_print_vb)
- struct type *type;
- char *valaddr;
- CORE_ADDR address;
- struct ui_file *stream;
- int format;
- int recurse;
- enum val_prettyprint pretty;
- struct type **dont_print_vb;
+pascal_object_print_value (struct type *type, char *valaddr, CORE_ADDR address,
+ struct ui_file *stream, int format, int recurse,
+ enum val_prettyprint pretty,
+ struct type **dont_print_vb)
{
struct obstack tmp_obstack;
struct type **last_dont_print
if (boffset != -1 && (boffset < 0 || boffset >= TYPE_LENGTH (type)))
{
+ /* FIXME (alloc): not safe is baseclass is really really big. */
base_valaddr = (char *) alloca (TYPE_LENGTH (baseclass));
if (target_read_memory (address + boffset, base_valaddr,
TYPE_LENGTH (baseclass)) != 0)
have the same meanings as in c_val_print. */
static void
-pascal_object_print_static_field (type, val, stream, format, recurse, pretty)
- struct type *type;
- value_ptr val;
- struct ui_file *stream;
- int format;
- int recurse;
- enum val_prettyprint pretty;
+pascal_object_print_static_field (struct type *type, struct value *val,
+ struct ui_file *stream, int format,
+ int recurse, enum val_prettyprint pretty)
{
if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
{
}
void
-pascal_object_print_class_member (valaddr, domain, stream, prefix)
- char *valaddr;
- struct type *domain;
- struct ui_file *stream;
- char *prefix;
+pascal_object_print_class_member (char *valaddr, struct type *domain,
+ struct ui_file *stream, char *prefix)
{
/* VAL is a byte offset into the structure type DOMAIN.
void
-_initialize_pascal_valprint ()
+_initialize_pascal_valprint (void)
{
add_show_from_set
(add_set_cmd ("pascal_static-members", class_support, var_boolean,