Index: gdb/p-valprint.c |
diff --git a/gdb/p-valprint.c b/gdb/p-valprint.c |
index c5bef8a0ffc572e28e4c0bee848ccf64e1872d94..b8434ed256fcb5685e4d74eb887714eaa2e0eee0 100644 |
--- a/gdb/p-valprint.c |
+++ b/gdb/p-valprint.c |
@@ -41,11 +41,22 @@ |
#include "exceptions.h" |
+/* Decorations for Pascal. */ |
+ |
+static const struct generic_val_print_decorations p_decorations = |
+{ |
+ "", |
+ " + ", |
+ " * I", |
+ "true", |
+ "false", |
+ "void" |
+}; |
+ |
/* See val_print for a description of the various parameters of this |
- function; they are identical. The semantics of the return value is |
- also identical to val_print. */ |
+ function; they are identical. */ |
-int |
+void |
pascal_val_print (struct type *type, const gdb_byte *valaddr, |
int embedded_offset, CORE_ADDR address, |
struct ui_file *stream, int recurse, |
@@ -61,8 +72,8 @@ pascal_val_print (struct type *type, const gdb_byte *valaddr, |
unsigned eltlen; |
int length_pos, length_size, string_pos; |
struct type *char_type; |
- LONGEST val; |
CORE_ADDR addr; |
+ int want_space = 0; |
CHECK_TYPEDEF (type); |
switch (TYPE_CODE (type)) |
@@ -146,7 +157,7 @@ pascal_val_print (struct type *type, const gdb_byte *valaddr, |
/* Extract the address, assume that it is unsigned. */ |
addr = extract_unsigned_integer (valaddr + embedded_offset, |
TYPE_LENGTH (type), byte_order); |
- print_address_demangle (gdbarch, addr, stream, demangle); |
+ print_address_demangle (options, gdbarch, addr, stream, demangle); |
break; |
} |
check_typedef (TYPE_TARGET_TYPE (type)); |
@@ -158,14 +169,14 @@ pascal_val_print (struct type *type, const gdb_byte *valaddr, |
if (TYPE_CODE (elttype) == TYPE_CODE_FUNC) |
{ |
/* Try to print what function it points to. */ |
- print_address_demangle (gdbarch, addr, stream, demangle); |
- /* Return value is irrelevant except for string pointers. */ |
- return (0); |
+ print_address_demangle (options, gdbarch, addr, stream, demangle); |
+ return; |
} |
if (options->addressprint && options->format != 's') |
{ |
fputs_filtered (paddress (gdbarch, addr), stream); |
+ want_space = 1; |
} |
/* For a pointer to char or unsigned char, also print the string |
@@ -178,6 +189,8 @@ pascal_val_print (struct type *type, const gdb_byte *valaddr, |
&& (options->format == 0 || options->format == 's') |
&& addr != 0) |
{ |
+ if (want_space) |
+ fputs_filtered (" ", stream); |
/* No wide string yet. */ |
i = val_print_string (elttype, NULL, addr, -1, stream, options); |
} |
@@ -193,6 +206,8 @@ pascal_val_print (struct type *type, const gdb_byte *valaddr, |
ULONGEST string_length; |
void *buffer; |
+ if (want_space) |
+ fputs_filtered (" ", stream); |
buffer = xmalloc (length_size); |
read_memory (addr + length_pos, buffer, length_size); |
string_length = extract_unsigned_integer (buffer, length_size, |
@@ -210,12 +225,17 @@ pascal_val_print (struct type *type, const gdb_byte *valaddr, |
struct minimal_symbol *msymbol = |
lookup_minimal_symbol_by_pc (vt_address); |
- if ((msymbol != NULL) |
+ /* If 'symbol_print' is set, we did the work above. */ |
+ if (!options->symbol_print |
+ && (msymbol != NULL) |
&& (vt_address == SYMBOL_VALUE_ADDRESS (msymbol))) |
{ |
- fputs_filtered (" <", stream); |
+ if (want_space) |
+ fputs_filtered (" ", stream); |
+ fputs_filtered ("<", stream); |
fputs_filtered (SYMBOL_PRINT_NAME (msymbol), stream); |
fputs_filtered (">", stream); |
+ want_space = 1; |
} |
if (vt_address && options->vtblprint) |
{ |
@@ -225,6 +245,9 @@ pascal_val_print (struct type *type, const gdb_byte *valaddr, |
struct block *block = (struct block *) NULL; |
int 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); |
@@ -248,50 +271,23 @@ pascal_val_print (struct type *type, const gdb_byte *valaddr, |
} |
} |
- /* Return number of characters printed, including the terminating |
- '\0' if we reached the end. val_print_string takes care including |
- the terminating '\0' if necessary. */ |
- return i; |
- |
- break; |
+ return; |
case TYPE_CODE_REF: |
- elttype = check_typedef (TYPE_TARGET_TYPE (type)); |
- if (options->addressprint) |
- { |
- CORE_ADDR addr |
- = extract_typed_address (valaddr + embedded_offset, type); |
- |
- fprintf_filtered (stream, "@"); |
- fputs_filtered (paddress (gdbarch, addr), stream); |
- if (options->deref_ref) |
- fputs_filtered (": ", stream); |
- } |
- /* De-reference the reference. */ |
- if (options->deref_ref) |
- { |
- if (TYPE_CODE (elttype) != TYPE_CODE_UNDEF) |
- { |
- struct value *deref_val; |
- |
- deref_val = coerce_ref_if_computed (original_value); |
- if (deref_val != NULL) |
- { |
- /* More complicated computed references are not supported. */ |
- gdb_assert (embedded_offset == 0); |
- } |
- else |
- deref_val = value_at (TYPE_TARGET_TYPE (type), |
- unpack_pointer (type, |
- (valaddr |
- + embedded_offset))); |
- |
- common_val_print (deref_val, stream, recurse + 1, options, |
- current_language); |
- } |
- else |
- fputs_filtered ("???", stream); |
- } |
+ case TYPE_CODE_ENUM: |
+ case TYPE_CODE_FLAGS: |
+ case TYPE_CODE_FUNC: |
+ case TYPE_CODE_RANGE: |
+ case TYPE_CODE_INT: |
+ case TYPE_CODE_FLT: |
+ case TYPE_CODE_VOID: |
+ case TYPE_CODE_ERROR: |
+ case TYPE_CODE_UNDEF: |
+ case TYPE_CODE_BOOL: |
+ case TYPE_CODE_CHAR: |
+ generic_val_print (type, valaddr, embedded_offset, address, |
+ stream, recurse, original_value, options, |
+ &p_decorations); |
break; |
case TYPE_CODE_UNION: |
@@ -309,7 +305,7 @@ pascal_val_print (struct type *type, const gdb_byte *valaddr, |
-fvtable_thunks. (Otherwise, look under TYPE_CODE_PTR.) */ |
/* Extract the address, assume that it is unsigned. */ |
print_address_demangle |
- (gdbarch, |
+ (options, gdbarch, |
extract_unsigned_integer (valaddr + embedded_offset |
+ TYPE_FIELD_BITPOS (type, |
VTBL_FNADDR_OFFSET) / 8, |
@@ -338,142 +334,6 @@ pascal_val_print (struct type *type, const gdb_byte *valaddr, |
} |
break; |
- case TYPE_CODE_ENUM: |
- if (options->format) |
- { |
- val_print_scalar_formatted (type, valaddr, embedded_offset, |
- original_value, options, 0, stream); |
- break; |
- } |
- len = TYPE_NFIELDS (type); |
- val = unpack_long (type, valaddr + embedded_offset); |
- for (i = 0; i < len; i++) |
- { |
- QUIT; |
- if (val == TYPE_FIELD_BITPOS (type, i)) |
- { |
- break; |
- } |
- } |
- if (i < len) |
- { |
- fputs_filtered (TYPE_FIELD_NAME (type, i), stream); |
- } |
- else |
- { |
- print_longest (stream, 'd', 0, val); |
- } |
- break; |
- |
- case TYPE_CODE_FLAGS: |
- if (options->format) |
- val_print_scalar_formatted (type, valaddr, embedded_offset, |
- original_value, options, 0, stream); |
- else |
- val_print_type_code_flags (type, valaddr + embedded_offset, stream); |
- break; |
- |
- case TYPE_CODE_FUNC: |
- if (options->format) |
- { |
- val_print_scalar_formatted (type, valaddr, embedded_offset, |
- original_value, options, 0, stream); |
- break; |
- } |
- /* FIXME, we should consider, at least for ANSI C language, eliminating |
- the distinction made between FUNCs and POINTERs to FUNCs. */ |
- fprintf_filtered (stream, "{"); |
- type_print (type, "", stream, -1); |
- fprintf_filtered (stream, "} "); |
- /* Try to print what function it points to, and its address. */ |
- print_address_demangle (gdbarch, address, stream, demangle); |
- break; |
- |
- case TYPE_CODE_BOOL: |
- if (options->format || options->output_format) |
- { |
- struct value_print_options opts = *options; |
- |
- opts.format = (options->format ? options->format |
- : options->output_format); |
- val_print_scalar_formatted (type, valaddr, embedded_offset, |
- original_value, &opts, 0, stream); |
- } |
- else |
- { |
- val = unpack_long (type, valaddr + embedded_offset); |
- if (val == 0) |
- fputs_filtered ("false", stream); |
- else if (val == 1) |
- fputs_filtered ("true", stream); |
- else |
- { |
- fputs_filtered ("true (", stream); |
- fprintf_filtered (stream, "%ld)", (long int) val); |
- } |
- } |
- break; |
- |
- case TYPE_CODE_RANGE: |
- /* FIXME: create_range_type does not set the unsigned bit in a |
- range type (I think it probably should copy it from the target |
- type), so we won't print values which are too large to |
- fit in a signed integer correctly. */ |
- /* FIXME: Doesn't handle ranges of enums correctly. (Can't just |
- print with the target type, though, because the size of our type |
- and the target type might differ). */ |
- /* FALLTHROUGH */ |
- |
- case TYPE_CODE_INT: |
- if (options->format || options->output_format) |
- { |
- struct value_print_options opts = *options; |
- |
- opts.format = (options->format ? options->format |
- : options->output_format); |
- val_print_scalar_formatted (type, valaddr, embedded_offset, |
- original_value, &opts, 0, stream); |
- } |
- else |
- { |
- val_print_type_code_int (type, valaddr + embedded_offset, stream); |
- } |
- break; |
- |
- case TYPE_CODE_CHAR: |
- if (options->format || options->output_format) |
- { |
- struct value_print_options opts = *options; |
- |
- opts.format = (options->format ? options->format |
- : options->output_format); |
- val_print_scalar_formatted (type, valaddr, embedded_offset, |
- original_value, &opts, 0, stream); |
- } |
- else |
- { |
- val = unpack_long (type, valaddr + embedded_offset); |
- if (TYPE_UNSIGNED (type)) |
- fprintf_filtered (stream, "%u", (unsigned int) val); |
- else |
- fprintf_filtered (stream, "%d", (int) val); |
- fputs_filtered (" ", stream); |
- LA_PRINT_CHAR ((unsigned char) val, type, stream); |
- } |
- break; |
- |
- case TYPE_CODE_FLT: |
- if (options->format) |
- { |
- val_print_scalar_formatted (type, valaddr, embedded_offset, |
- original_value, options, 0, stream); |
- } |
- else |
- { |
- print_floating (valaddr + embedded_offset, type, stream); |
- } |
- break; |
- |
case TYPE_CODE_BITSTRING: |
case TYPE_CODE_SET: |
elttype = TYPE_INDEX_TYPE (type); |
@@ -556,30 +416,14 @@ pascal_val_print (struct type *type, const gdb_byte *valaddr, |
} |
break; |
- case TYPE_CODE_VOID: |
- fprintf_filtered (stream, "void"); |
- break; |
- |
- case TYPE_CODE_ERROR: |
- fprintf_filtered (stream, "%s", TYPE_ERROR_NAME (type)); |
- break; |
- |
- case TYPE_CODE_UNDEF: |
- /* This happens (without TYPE_FLAG_STUB set) on systems which don't use |
- dbx xrefs (NO_DBX_XREFS in gcc) if a file has a "struct foo *bar" |
- and no complete type for struct foo in that file. */ |
- fprintf_filtered (stream, "<incomplete type>"); |
- break; |
- |
default: |
error (_("Invalid pascal type code %d in symbol table."), |
TYPE_CODE (type)); |
} |
gdb_flush (stream); |
- return (0); |
} |
-int |
+void |
pascal_value_print (struct value *val, struct ui_file *stream, |
const struct value_print_options *options) |
{ |
@@ -613,7 +457,7 @@ pascal_value_print (struct value *val, struct ui_file *stream, |
fprintf_filtered (stream, ") "); |
} |
} |
- return common_val_print (val, stream, 0, &opts, current_language); |
+ common_val_print (val, stream, 0, &opts, current_language); |
} |
@@ -649,7 +493,7 @@ const char pascal_vtbl_ptr_name[] = |
int |
pascal_object_is_vtbl_ptr_type (struct type *type) |
{ |
- char *typename = type_name_no_tag (type); |
+ const char *typename = type_name_no_tag (type); |
return (typename != NULL |
&& strcmp (typename, pascal_vtbl_ptr_name) == 0); |
@@ -912,7 +756,7 @@ pascal_object_print_value (struct type *type, const gdb_byte *valaddr, |
{ |
int boffset = 0; |
struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i)); |
- char *basename = type_name_no_tag (baseclass); |
+ const char *basename = type_name_no_tag (baseclass); |
const gdb_byte *base_valaddr = NULL; |
int thisoffset; |
volatile struct gdb_exception ex; |