X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fp-valprint.c;h=e2105ebd8dbc9a4faee90c60f5067266ec49fcef;hb=dbdb27ec2d5ddeb8a214181881ab616ebe47b0cf;hp=b18e7cf0daf6e09ecfa3fc59bd337b2f6729e845;hpb=373a8247302053107af695e14b869988b3395f79;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/p-valprint.c b/gdb/p-valprint.c index b18e7cf0da..e2105ebd8d 100644 --- a/gdb/p-valprint.c +++ b/gdb/p-valprint.c @@ -1,6 +1,6 @@ /* Support for printing Pascal values for GDB, the GNU debugger. - Copyright 2000 - Free Software Foundation, Inc. + + Copyright 2000, 2001, 2003, 2005 Free Software Foundation, Inc. This file is part of GDB. @@ -21,7 +21,7 @@ /* 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" @@ -31,10 +31,13 @@ #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" +#include "cp-support.h" @@ -54,22 +57,17 @@ 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, const bfd_byte *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 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; @@ -145,7 +143,8 @@ pascal_val_print (type, valaddr, embedded_offset, address, stream, format, deref /* Print the unmangled name if desired. */ /* Print vtable entry - we only get here if we ARE using -fvtable_thunks. (Otherwise, look under TYPE_CODE_STRUCT.) */ - print_address_demangle (extract_address (valaddr + embedded_offset, TYPE_LENGTH (type)), + /* Extract the address, assume that it is unsigned. */ + print_address_demangle (extract_unsigned_integer (valaddr + embedded_offset, TYPE_LENGTH (type)), stream, demangle); break; } @@ -176,7 +175,7 @@ pascal_val_print (type, valaddr, embedded_offset, address, stream, format, deref if (addressprint && format != 's') { - print_address_numeric (addr, 1, stream); + deprecated_print_address_numeric (addr, 1, stream); } /* For a pointer to char or unsigned char, also print the string @@ -194,16 +193,17 @@ pascal_val_print (type, valaddr, embedded_offset, address, stream, format, deref 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)) { @@ -212,25 +212,24 @@ pascal_val_print (type, valaddr, embedded_offset, address, stream, format, deref 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); + fputs_filtered (SYMBOL_PRINT_NAME (msymbol), stream); fputs_filtered (">", 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; struct block *block = (struct block *) NULL; int is_this_fld; if (msymbol != NULL) - wsym = lookup_symbol (SYMBOL_NAME (msymbol), block, - VAR_NAMESPACE, &is_this_fld, &s); + wsym = lookup_symbol (DEPRECATED_SYMBOL_NAME (msymbol), block, + VAR_DOMAIN, &is_this_fld, NULL); if (wsym) { @@ -240,10 +239,9 @@ pascal_val_print (type, valaddr, embedded_offset, address, stream, format, deref { wtype = TYPE_TARGET_TYPE (type); } - vt_val = value_at (wtype, vt_address, NULL); - val_print (VALUE_TYPE (vt_val), VALUE_CONTENTS (vt_val), 0, - VALUE_ADDRESS (vt_val), stream, format, - deref_ref, recurse + 1, pretty); + vt_val = value_at (wtype, vt_address); + common_val_print (vt_val, stream, format, deref_ref, + recurse + 1, pretty); if (pretty) { fprintf_filtered (stream, "\n"); @@ -260,7 +258,7 @@ pascal_val_print (type, valaddr, embedded_offset, address, stream, format, deref break; case TYPE_CODE_MEMBER: - error ("not implemented: member type in pascal_val_print"); + error (_("not implemented: member type in pascal_val_print")); break; case TYPE_CODE_REF: @@ -275,9 +273,11 @@ pascal_val_print (type, valaddr, embedded_offset, address, stream, format, deref if (addressprint) { fprintf_filtered (stream, "@"); - print_address_numeric - (extract_address (valaddr + embedded_offset, - TARGET_PTR_BIT / HOST_CHAR_BIT), 1, stream); + /* Extract the address, assume that it is unsigned. */ + deprecated_print_address_numeric + (extract_unsigned_integer (valaddr + embedded_offset, + TARGET_PTR_BIT / HOST_CHAR_BIT), + 1, stream); if (deref_ref) fputs_filtered (": ", stream); } @@ -286,16 +286,13 @@ pascal_val_print (type, valaddr, embedded_offset, address, stream, format, deref { 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), - valaddr + embedded_offset), - NULL); - val_print (VALUE_TYPE (deref_val), - VALUE_CONTENTS (deref_val), 0, - VALUE_ADDRESS (deref_val), stream, format, - deref_ref, recurse + 1, pretty); + valaddr + embedded_offset)); + common_val_print (deref_val, stream, format, deref_ref, + recurse + 1, pretty); } else fputs_filtered ("???", stream); @@ -315,19 +312,19 @@ pascal_val_print (type, valaddr, embedded_offset, address, stream, format, deref /* Print the unmangled name if desired. */ /* Print vtable entry - we only get here if NOT using -fvtable_thunks. (Otherwise, look under TYPE_CODE_PTR.) */ - print_address_demangle (extract_address ( - valaddr + embedded_offset + TYPE_FIELD_BITPOS (type, VTBL_FNADDR_OFFSET) / 8, - TYPE_LENGTH (TYPE_FIELD_TYPE (type, VTBL_FNADDR_OFFSET))), - stream, demangle); + /* Extract the address, assume that it is unsigned. */ + print_address_demangle + (extract_unsigned_integer (valaddr + embedded_offset + TYPE_FIELD_BITPOS (type, VTBL_FNADDR_OFFSET) / 8, + TYPE_LENGTH (TYPE_FIELD_TYPE (type, VTBL_FNADDR_OFFSET))), + stream, demangle); } 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, @@ -450,7 +447,7 @@ pascal_val_print (type, valaddr, embedded_offset, address, stream, format, deref 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, ""); gdb_flush (stream); @@ -529,20 +526,17 @@ pascal_val_print (type, valaddr, embedded_offset, address, stream, format, deref break; default: - error ("Invalid pascal type code %d in symbol table.", TYPE_CODE (type)); + error (_("Invalid pascal type code %d in symbol table."), TYPE_CODE (type)); } gdb_flush (stream); return (0); } 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); + struct type *type = value_type (val); /* If it is a pointer, indicate what it points to. @@ -557,8 +551,8 @@ pascal_value_print (val, stream, format, pretty) type is indicated by the quoted string anyway. */ if (TYPE_CODE (type) == TYPE_CODE_PTR && TYPE_NAME (type) == NULL && - TYPE_NAME (TYPE_TARGET_TYPE (type)) != NULL && - STREQ (TYPE_NAME (TYPE_TARGET_TYPE (type)), "char")) + TYPE_NAME (TYPE_TARGET_TYPE (type)) != NULL + && strcmp (TYPE_NAME (TYPE_TARGET_TYPE (type)), "char") == 0) { /* Print nothing */ } @@ -569,9 +563,7 @@ pascal_value_print (val, stream, format, pretty) fprintf_filtered (stream, ") "); } } - return val_print (type, VALUE_CONTENTS (val), VALUE_EMBEDDED_OFFSET (val), - VALUE_ADDRESS (val) + VALUE_OFFSET (val), - stream, format, 1, 0, pretty); + return common_val_print (val, stream, format, 1, 0, pretty); } @@ -583,23 +575,29 @@ extern int vtblprint; /* Controls printing of vtbl's */ extern int objectprint; /* Controls looking up an object's derived type using what we find in its vtables. */ static int pascal_static_field_print; /* Controls printing of static fields. */ +static void +show_pascal_static_field_print (struct ui_file *file, int from_tty, + struct cmd_list_element *c, const char *value) +{ + fprintf_filtered (file, _("Printing of pascal static members is %s.\n"), + value); +} 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 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 **); +static void pascal_object_print_value (struct type *, const bfd_byte *, + 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 (const bfd_byte *valaddr, struct type *type, + struct ui_file *stream) { struct type *domain; struct fn_field *f = NULL; @@ -629,13 +627,11 @@ pascal_object_print_class_method (valaddr, type, stream) 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; } @@ -647,7 +643,7 @@ pascal_object_print_class_method (valaddr, type, stream) sym = find_pc_function (addr); if (sym == 0) { - error ("invalid pointer to member function"); + error (_("invalid pointer to member function")); } len = TYPE_NFN_FIELDS (domain); for (i = 0; i < len; i++) @@ -655,15 +651,11 @@ pascal_object_print_class_method (valaddr, type, stream) 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; - } + if (DEPRECATED_STREQ (DEPRECATED_SYMBOL_NAME (sym), TYPE_FN_FIELD_PHYSNAME (f, j))) + goto common; } } } @@ -673,7 +665,7 @@ common: char *demangled_name; fprintf_filtered (stream, "&"); - fprintf_filtered (stream, kind); + fputs_filtered (kind, stream); demangled_name = cplus_demangle (TYPE_FN_FIELD_PHYSNAME (f, j), DMGL_ANSI | DMGL_PARAMS); if (demangled_name == NULL) @@ -682,7 +674,7 @@ common: else { fputs_filtered (demangled_name, stream); - free (demangled_name); + xfree (demangled_name); } } else @@ -701,21 +693,19 @@ const char pascal_vtbl_ptr_name[] = "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); return (typename != NULL - && (STREQ (typename, pascal_vtbl_ptr_name))); + && strcmp (typename, pascal_vtbl_ptr_name) == 0); } /* Return truth value for the assertion that TYPE is of the 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) { @@ -735,8 +725,9 @@ pascal_object_is_vtbl_member (type) return 0; } -/* Mutually recursive subroutines of pascal_object_print_value and c_val_print to - print out a structure's fields: pascal_object_print_value_fields and pascal_object_print_value. +/* Mutually recursive subroutines of pascal_object_print_value and + c_val_print to print out a structure's fields: + pascal_object_print_value_fields and pascal_object_print_value. TYPE, VALADDR, ADDRESS, STREAM, RECURSE, and PRETTY have the same meanings as in pascal_object_print_value and c_val_print. @@ -745,17 +736,12 @@ pascal_object_is_vtbl_member (type) 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, const bfd_byte *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; @@ -777,7 +763,6 @@ pascal_object_print_value_fields (type, valaddr, address, stream, format, recurs fprintf_filtered (stream, ""); else { - extern int inspect_it; int fields_seen = 0; if (dont_print_statmem == 0) @@ -851,7 +836,7 @@ pascal_object_print_value_fields (type, valaddr, address, stream, format, recurs 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. */ @@ -864,8 +849,7 @@ pascal_object_print_value_fields (type, valaddr, address, stream, format, recurs v = value_from_longest (TYPE_FIELD_TYPE (type, i), unpack_field_as_long (type, valaddr, i)); - val_print (TYPE_FIELD_TYPE (type, i), VALUE_CONTENTS (v), 0, 0, - stream, format, 0, recurse + 1, pretty); + common_val_print (v, stream, format, 0, recurse + 1, pretty); } } else @@ -876,17 +860,16 @@ pascal_object_print_value_fields (type, valaddr, address, stream, format, recurs } 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)); if (v == NULL) fputs_filtered ("", stream); else - pascal_object_print_static_field (TYPE_FIELD_TYPE (type, i), v, - stream, format, recurse + 1, - pretty); + pascal_object_print_static_field (v, stream, format, + recurse + 1, pretty); } else { @@ -924,16 +907,11 @@ pascal_object_print_value_fields (type, valaddr, address, stream, format, recurs 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, const bfd_byte *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 @@ -955,7 +933,7 @@ pascal_object_print_value (type, valaddr, address, stream, format, recurse, pret int boffset; struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i)); char *basename = TYPE_NAME (baseclass); - char *base_valaddr; + const bfd_byte *base_valaddr; if (BASETYPE_VIA_VIRTUAL (type, i)) { @@ -992,8 +970,10 @@ pascal_object_print_value (type, valaddr, address, stream, format, recurse, pret if (boffset != -1 && (boffset < 0 || boffset >= TYPE_LENGTH (type))) { - base_valaddr = (char *) alloca (TYPE_LENGTH (baseclass)); - if (target_read_memory (address + boffset, base_valaddr, + /* FIXME (alloc): not safe is baseclass is really really big. */ + bfd_byte *buf = alloca (TYPE_LENGTH (baseclass)); + base_valaddr = buf; + if (target_read_memory (address + boffset, buf, TYPE_LENGTH (baseclass)) != 0) boffset = -1; } @@ -1030,18 +1010,16 @@ pascal_object_print_value (type, valaddr, address, stream, format, recurse, pret static member classes in an obstack and refuse to print them more than once. - VAL contains the value to print, TYPE, STREAM, RECURSE, and PRETTY + VAL contains the value to print, STREAM, RECURSE, and PRETTY 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 value *val, + struct ui_file *stream, int format, + int recurse, enum val_prettyprint pretty) { + struct type *type = value_type (val); + if (TYPE_CODE (type) == TYPE_CODE_STRUCT) { CORE_ADDR *first_dont_print; @@ -1066,20 +1044,16 @@ pascal_object_print_static_field (type, val, stream, format, recurse, pretty) sizeof (CORE_ADDR)); CHECK_TYPEDEF (type); - pascal_object_print_value_fields (type, VALUE_CONTENTS (val), VALUE_ADDRESS (val), + pascal_object_print_value_fields (type, value_contents (val), VALUE_ADDRESS (val), stream, format, recurse, pretty, NULL, 1); return; } - val_print (type, VALUE_CONTENTS (val), 0, VALUE_ADDRESS (val), - stream, format, 0, recurse, pretty); + common_val_print (val, stream, format, 0, recurse, pretty); } 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 (const bfd_byte *valaddr, struct type *domain, + struct ui_file *stream, char *prefix) { /* VAL is a byte offset into the structure type DOMAIN. @@ -1087,7 +1061,7 @@ pascal_object_print_class_member (valaddr, domain, stream, prefix) print it. */ int extra = 0; int bits = 0; - register unsigned int i; + unsigned int i; unsigned len = TYPE_NFIELDS (domain); /* @@ Make VAL into bit offset */ LONGEST val = unpack_long (builtin_type_int, valaddr) << 3; @@ -1112,7 +1086,7 @@ pascal_object_print_class_member (valaddr, domain, stream, prefix) if (i < len) { char *name; - fprintf_filtered (stream, prefix); + fputs_filtered (prefix, stream); name = type_name_no_tag (domain); if (name) fputs_filtered (name, stream); @@ -1129,16 +1103,18 @@ pascal_object_print_class_member (valaddr, domain, stream, prefix) fprintf_filtered (stream, "%ld", (long int) (val >> 3)); } +extern initialize_file_ftype _initialize_pascal_valprint; /* -Wmissing-prototypes */ void -_initialize_pascal_valprint () +_initialize_pascal_valprint (void) { - add_show_from_set - (add_set_cmd ("pascal_static-members", class_support, var_boolean, - (char *) &pascal_static_field_print, - "Set printing of pascal static members.", - &setprintlist), - &showprintlist); + add_setshow_boolean_cmd ("pascal_static-members", class_support, + &pascal_static_field_print, _("\ +Set printing of pascal static members."), _("\ +Show printing of pascal static members."), NULL, + NULL, + show_pascal_static_field_print, + &setprintlist, &showprintlist); /* Turn on printing of static fields. */ pascal_static_field_print = 1;