From 7e86466e042a93e03168e155a3fda965c4b5cc0f Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Tue, 14 Oct 2003 06:51:14 +0000 Subject: [PATCH] * f-typeprint.c (f_type_print_base): Handle TYPE_CODE_REF. * f-valprint.c (f_val_print): Likewise. Tweak TYPE_CODE_PTR to match c_val_print a bit closer. --- gdb/ChangeLog | 6 ++++++ gdb/f-typeprint.c | 5 +++++ gdb/f-valprint.c | 52 +++++++++++++++++++++++++++++++++++++++-------- 3 files changed, 54 insertions(+), 9 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 1a77033b560..e6a8d3d30d9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2003-10-13 Richard Henderson + + * f-typeprint.c (f_type_print_base): Handle TYPE_CODE_REF. + * f-valprint.c (f_val_print): Likewise. Tweak TYPE_CODE_PTR to + match c_val_print a bit closer. + 2003-10-13 Kevin Buettner * frv-tdep.c (max_instrs_per_bundle, frv_instr_size): New constants. diff --git a/gdb/f-typeprint.c b/gdb/f-typeprint.c index 3a153a34075..9e148fb8306 100644 --- a/gdb/f-typeprint.c +++ b/gdb/f-typeprint.c @@ -329,6 +329,11 @@ f_type_print_base (struct type *type, struct ui_file *stream, int show, f_type_print_base (TYPE_TARGET_TYPE (type), stream, 0, level); break; + case TYPE_CODE_REF: + fprintf_filtered (stream, "REF TO -> ( "); + f_type_print_base (TYPE_TARGET_TYPE (type), stream, 0, level); + break; + case TYPE_CODE_VOID: fprintf_filtered (stream, "VOID"); break; diff --git a/gdb/f-valprint.c b/gdb/f-valprint.c index 7fdcabd7173..805590f0a91 100644 --- a/gdb/f-valprint.c +++ b/gdb/f-valprint.c @@ -384,11 +384,7 @@ f_val_print (struct type *type, char *valaddr, int embedded_offset, deref_ref, recurse, pretty); fprintf_filtered (stream, ")"); break; -#if 0 - /* Array of unspecified length: treat like pointer to first elt. */ - valaddr = (char *) &address; - /* FALL THROUGH */ -#endif + case TYPE_CODE_PTR: if (format && format != 's') { @@ -409,7 +405,7 @@ f_val_print (struct type *type, char *valaddr, int embedded_offset, } if (addressprint && format != 's') - fprintf_filtered (stream, "0x%s", paddr_nz (addr)); + print_address_numeric (addr, 1, stream); /* For a pointer to char or unsigned char, also print the string pointed to, unless pointer is null. */ @@ -419,9 +415,47 @@ f_val_print (struct type *type, char *valaddr, int embedded_offset, && addr != 0) i = val_print_string (addr, -1, TYPE_LENGTH (elttype), stream); - /* Return number of characters printed, plus one for the - terminating null if we have "reached the end". */ - return (i + (print_max && i != print_max)); + /* 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; + + case TYPE_CODE_REF: + elttype = check_typedef (TYPE_TARGET_TYPE (type)); + if (addressprint) + { + CORE_ADDR addr + = extract_typed_address (valaddr + embedded_offset, type); + fprintf_filtered (stream, "@"); + print_address_numeric (addr, 1, stream); + if (deref_ref) + fputs_filtered (": ", stream); + } + /* De-reference the reference. */ + if (deref_ref) + { + if (TYPE_CODE (elttype) != TYPE_CODE_UNDEF) + { + 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, + pretty); + } + else + fputs_filtered ("???", stream); } break; -- 2.30.2