#include "value.h"
#include "language.h"
#include "demangle.h"
+#include "c-lang.h" /* For c_val_print */
static void
-chill_print_value_fields PARAMS ((struct type *, char *, FILE *, int, int,
+chill_print_value_fields PARAMS ((struct type *, char *, GDB_FILE *, int, int,
enum val_prettyprint, struct type **));
\f
struct type *type;
char *valaddr;
CORE_ADDR address;
- FILE *stream;
+ GDB_FILE *stream;
int format;
int deref_ref;
int recurse;
LONGEST val;
unsigned int i = 0; /* Number of characters printed. */
struct type *elttype;
- unsigned eltlen;
CORE_ADDR addr;
switch (TYPE_CODE (type))
}
if (addressprint && format != 's')
{
- fprintf_filtered (stream, "0x%x", addr);
+ fprintf_filtered (stream, "H'%lx", (unsigned long) addr);
}
/* For a pointer to char or unsigned char, also print the string
print_scalar_formatted (valaddr, type, format, 0, stream);
break;
}
- if (addressprint && format != 's')
- {
- fprintf_filtered (stream, "0x%x ", addr);
- }
i = TYPE_LENGTH (type);
LA_PRINT_STRING (stream, valaddr, i, 0);
/* Return number of characters printed, plus one for the terminating
return (i + (print_max && i != print_max));
break;
+ case TYPE_CODE_BITSTRING:
+ case TYPE_CODE_SET:
+ {
+ struct type *range = TYPE_FIELD_TYPE (type, 0);
+ int low_bound = TYPE_LOW_BOUND (range);
+ int high_bound = TYPE_HIGH_BOUND (range);
+ int i;
+ int is_bitstring = TYPE_CODE (type) == TYPE_CODE_BITSTRING;
+ int need_comma = 0;
+ int in_range = 0;
+
+ if (is_bitstring)
+ fputs_filtered ("B'", stream);
+ else
+ fputs_filtered ("[", stream);
+ for (i = low_bound; i <= high_bound; i++)
+ {
+ int element = value_bit_index (type, valaddr, i);
+ if (is_bitstring)
+ fprintf_filtered (stream, "%d", element);
+ else if (element)
+ {
+ if (need_comma)
+ fputs_filtered (", ", stream);
+ print_type_scalar (TYPE_TARGET_TYPE (range), i, stream);
+ need_comma = 1;
+
+ /* Look for a continuous range of true elements. */
+ if (i+1 <= high_bound && value_bit_index (type, valaddr, ++i))
+ {
+ int j = i; /* j is the upper bound so far of the range */
+ fputs_filtered (":", stream);
+ while (i+1 <= high_bound
+ && value_bit_index (type, valaddr, ++i))
+ j = i;
+ print_type_scalar (TYPE_TARGET_TYPE (range), j, stream);
+ }
+ }
+ }
+ if (is_bitstring)
+ fputs_filtered ("'", stream);
+ else
+ fputs_filtered ("]", stream);
+ }
+ break;
+
case TYPE_CODE_STRUCT:
+ if (chill_is_varying_struct (type))
+ {
+ struct type *inner = TYPE_FIELD_TYPE (type, 1);
+ long length = unpack_long (TYPE_FIELD_TYPE (type, 0), valaddr);
+ char *data_addr = valaddr + TYPE_FIELD_BITPOS (type, 1) / 8;
+
+ switch (TYPE_CODE (inner))
+ {
+ case TYPE_CODE_STRING:
+ if (length > TYPE_LENGTH (type))
+ {
+ fprintf_filtered (stream,
+ "<dynamic length %d > static length %d>",
+ length, TYPE_LENGTH (type));
+ length > TYPE_LENGTH (type);
+ }
+ LA_PRINT_STRING (stream, data_addr, length, 0);
+ return length;
+ }
+ }
chill_print_value_fields (type, valaddr, stream, format, recurse, pretty,
0);
break;
- case TYPE_CODE_MEMBER:
case TYPE_CODE_REF:
- case TYPE_CODE_UNION:
+ if (addressprint)
+ {
+ fprintf_filtered (stream, "LOC(H'%lx)",
+ unpack_long (builtin_type_int, valaddr));
+ if (deref_ref)
+ fputs_filtered (": ", stream);
+ }
+ /* De-reference the reference. */
+ if (deref_ref)
+ {
+ if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_UNDEF)
+ {
+ value deref_val =
+ value_at
+ (TYPE_TARGET_TYPE (type),
+ unpack_pointer (lookup_pointer_type (builtin_type_void),
+ valaddr));
+ val_print (VALUE_TYPE (deref_val),
+ VALUE_CONTENTS (deref_val),
+ VALUE_ADDRESS (deref_val), stream, format,
+ deref_ref, recurse + 1, pretty);
+ }
+ else
+ fputs_filtered ("???", stream);
+ }
+ break;
+
case TYPE_CODE_ENUM:
- case TYPE_CODE_FUNC:
- case TYPE_CODE_VOID:
- case TYPE_CODE_ERROR:
+ c_val_print (type, valaddr, address, stream, format,
+ deref_ref, recurse, pretty);
+ break;
+
case TYPE_CODE_RANGE:
- error ("Unimplemented chill_val_print support for type %d",
- TYPE_CODE (type));
+ if (TYPE_TARGET_TYPE (type))
+ chill_val_print (TYPE_TARGET_TYPE (type), valaddr, address, stream,
+ format, deref_ref, recurse, pretty);
break;
+ case TYPE_CODE_MEMBER:
+ case TYPE_CODE_UNION:
+ case TYPE_CODE_FUNC:
+ case TYPE_CODE_VOID:
+ case TYPE_CODE_ERROR:
default:
- error ("Invalid Chill type code %d in symbol table.", TYPE_CODE (type));
+ /* Let's defer printing to the C printer, rather than
+ print an error message. FIXME! */
+ c_val_print (type, valaddr, address, stream, format,
+ deref_ref, recurse, pretty);
}
- fflush (stream);
+ gdb_flush (stream);
return (0);
}
dont_print)
struct type *type;
char *valaddr;
- FILE *stream;
+ GDB_FILE *stream;
int format;
int recurse;
enum val_prettyprint pretty;
check_stub_type (type);
- fprintf_filtered (stream, "(");
+ fprintf_filtered (stream, "[");
len = TYPE_NFIELDS (type);
if (len == 0)
{
{
wrap_here (n_spaces (2 + 2 * recurse));
}
+ fputs_filtered (".", stream);
fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
language_chill, DMGL_NO_OPTS);
- fputs_filtered (" = ", stream);
+ fputs_filtered (": ", stream);
if (TYPE_FIELD_PACKED (type, i))
{
value v;
print_spaces_filtered (2 * recurse, stream);
}
}
- fprintf_filtered (stream, ")");
+ fprintf_filtered (stream, "]");
}
-