aboutsummaryrefslogtreecommitdiff
path: root/gdb/ch-valprint.c
diff options
context:
space:
mode:
authorPer Bothner <per@bothner.com>1994-06-05 01:43:40 +0000
committerPer Bothner <per@bothner.com>1994-06-05 01:43:40 +0000
commite10cfcaa374a1a493e5aa68dc251534800d38124 (patch)
treed383531402da1319216a25ca121bef26f3610d54 /gdb/ch-valprint.c
parentc4d7d826d72aeabda9a30bf836a2734033c476e3 (diff)
downloadfsf-binutils-gdb-e10cfcaa374a1a493e5aa68dc251534800d38124.zip
fsf-binutils-gdb-e10cfcaa374a1a493e5aa68dc251534800d38124.tar.gz
fsf-binutils-gdb-e10cfcaa374a1a493e5aa68dc251534800d38124.tar.bz2
Fix value_print, which used to be ostensibly langauge-indepentdent,
but would print pointers and arrays in C syntax. Instead, call a language-specific function. See ChangeLog for details.
Diffstat (limited to 'gdb/ch-valprint.c')
-rw-r--r--gdb/ch-valprint.c87
1 files changed, 86 insertions, 1 deletions
diff --git a/gdb/ch-valprint.c b/gdb/ch-valprint.c
index 4eaaa96..00f5565 100644
--- a/gdb/ch-valprint.c
+++ b/gdb/ch-valprint.c
@@ -242,6 +242,13 @@ chill_val_print (type, valaddr, address, stream, format, deref_ref, recurse,
}
addr = unpack_pointer (type, valaddr);
elttype = TYPE_TARGET_TYPE (type);
+
+ /* We assume a NULL pointer is all zeros ... */
+ if (addr == 0)
+ {
+ fputs_filtered ("NULL", stream);
+ return 0;
+ }
if (TYPE_CODE (elttype) == TYPE_CODE_FUNC)
{
@@ -287,8 +294,16 @@ chill_val_print (type, valaddr, address, stream, format, deref_ref, recurse,
case TYPE_CODE_BITSTRING:
case TYPE_CODE_SET:
+ elttype = TYPE_FIELD_TYPE (type, 0);
+ check_stub_type (elttype);
+ if (TYPE_FLAGS (elttype) & TYPE_FLAG_STUB)
+ {
+ fprintf_filtered (stream, "<incomplete type>");
+ gdb_flush (stream);
+ break;
+ }
{
- struct type *range = TYPE_FIELD_TYPE (type, 0);
+ struct type *range = elttype;
int low_bound = TYPE_LOW_BOUND (range);
int high_bound = TYPE_HIGH_BOUND (range);
int i;
@@ -494,3 +509,73 @@ chill_print_value_fields (type, valaddr, stream, format, recurse, pretty,
}
fprintf_filtered (stream, "]");
}
+
+int
+chill_value_print (val, stream, format, pretty)
+ value_ptr val;
+ GDB_FILE *stream;
+ int format;
+ enum val_prettyprint pretty;
+{
+ /* A "repeated" value really contains several values in a row.
+ They are made by the @ operator.
+ Print such values as if they were arrays. */
+
+ if (VALUE_REPEATED (val))
+ {
+ register unsigned int n = VALUE_REPETITIONS (val);
+ register unsigned int typelen = TYPE_LENGTH (VALUE_TYPE (val));
+ fprintf_filtered (stream, "[");
+ /* Print arrays of characters using string syntax. */
+ if (typelen == 1 && TYPE_CODE (VALUE_TYPE (val)) == TYPE_CODE_INT
+ && format == 0)
+ LA_PRINT_STRING (stream, VALUE_CONTENTS (val), n, 0);
+ else
+ {
+ value_print_array_elements (val, stream, format, pretty);
+ }
+ fprintf_filtered (stream, "]");
+ return (n * typelen);
+ }
+ else
+ {
+ struct type *type = VALUE_TYPE (val);
+
+ /* If it is a pointer, indicate what it points to.
+
+ Print type also if it is a reference.
+
+ C++: if it is a member pointer, we will take care
+ of that when we print it. */
+ if (TYPE_CODE (type) == TYPE_CODE_PTR ||
+ TYPE_CODE (type) == TYPE_CODE_REF)
+ {
+ char *valaddr = VALUE_CONTENTS (val);
+ CORE_ADDR addr = unpack_pointer (type, valaddr);
+ if (TYPE_CODE (type) != TYPE_CODE_PTR || addr != 0)
+ {
+ int i;
+ char *name = TYPE_NAME (type);
+ if (name)
+ fputs_filtered (name, stream);
+ else if (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_VOID)
+ fputs_filtered ("PTR", stream);
+ else
+ {
+ fprintf_filtered (stream, "(");
+ type_print (type, "", stream, -1);
+ fprintf_filtered (stream, ")");
+ }
+ fprintf_filtered (stream, "(");
+ i = val_print (type, valaddr, VALUE_ADDRESS (val),
+ stream, format, 1, 0, pretty);
+ fprintf_filtered (stream, ")");
+ return i;
+ }
+ }
+ return (val_print (type, VALUE_CONTENTS (val),
+ VALUE_ADDRESS (val), stream, format, 1, 0, pretty));
+ }
+}
+
+