X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gdb%2Fc-valprint.c;h=315d03479de0acec7133e0e0600937a86c3c2c9c;hb=7ab98e9e4f7a1f9b904a1b9dbcbb9c9323a33f8f;hp=f9dbd033fcb184ba81657f6eef2dcb93903a53f0;hpb=d0352a18a504a4e7b761f6b3264cf11347d8d056;p=binutils-gdb.git diff --git a/gdb/c-valprint.c b/gdb/c-valprint.c index f9dbd033fcb..315d03479de 100644 --- a/gdb/c-valprint.c +++ b/gdb/c-valprint.c @@ -1,5 +1,6 @@ /* Support for printing C values for GDB, the GNU debugger. - Copyright 1986, 1988, 1989, 1991-1997, 2000 + Copyright 1986, 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, + 1998, 1999, 2000 Free Software Foundation, Inc. This file is part of GDB. @@ -24,12 +25,32 @@ #include "gdbtypes.h" #include "expression.h" #include "value.h" -#include "demangle.h" #include "valprint.h" #include "language.h" #include "c-lang.h" +#include "cp-abi.h" +/* Print function pointer with inferior address ADDRESS onto stdio + stream STREAM. */ + +static void +print_function_pointer_address (CORE_ADDR address, struct ui_file *stream) +{ + CORE_ADDR func_addr = CONVERT_FROM_FUNC_PTR_ADDR (address); + + /* If the function pointer is represented by a description, print the + address of the description. */ + if (addressprint && func_addr != address) + { + fputs_filtered ("@", stream); + print_address_numeric (address, 1, stream); + fputs_filtered (": ", stream); + } + print_address_demangle (func_addr, stream, demangle); +} + + /* Print data of type TYPE located at VALADDR (within GDB), which came from the inferior at address ADDRESS, onto stdio stream STREAM according to FORMAT (a letter or 0 for natural format). The data at VALADDR is in @@ -44,17 +65,9 @@ The PRETTY parameter controls prettyprinting. */ int -c_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; +c_val_print (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) { register unsigned int i = 0; /* Number of characters printed */ unsigned len; @@ -137,7 +150,7 @@ c_val_print (type, valaddr, embedded_offset, address, stream, format, deref_ref, -fvtable_thunks. (Otherwise, look under TYPE_CODE_STRUCT.) */ CORE_ADDR addr = extract_typed_address (valaddr + embedded_offset, type); - print_address_demangle (addr, stream, demangle); + print_function_pointer_address (addr, stream); break; } elttype = check_typedef (TYPE_TARGET_TYPE (type)); @@ -155,12 +168,11 @@ c_val_print (type, valaddr, embedded_offset, address, stream, format, deref_ref, { addr = unpack_pointer (type, valaddr + embedded_offset); print_unpacked_pointer: - elttype = check_typedef (TYPE_TARGET_TYPE (type)); if (TYPE_CODE (elttype) == TYPE_CODE_FUNC) { /* Try to print what function it points to. */ - print_address_demangle (addr, stream, demangle); + print_function_pointer_address (addr, stream); /* Return value is irrelevant except for string pointers. */ return (0); } @@ -291,6 +303,7 @@ c_val_print (type, valaddr, embedded_offset, address, stream, format, deref_ref, } /* Fall through. */ case TYPE_CODE_STRUCT: + /*FIXME: Abstract this away */ if (vtblprint && cp_is_vtbl_ptr_type (type)) { /* Print the unmangled name if desired. */ @@ -302,7 +315,7 @@ c_val_print (type, valaddr, embedded_offset, address, stream, format, deref_ref, CORE_ADDR addr = extract_typed_address (valaddr + offset, field_type); - print_address_demangle (addr, stream, demangle); + print_function_pointer_address (addr, stream); } else cp_print_value_fields (type, type, valaddr, embedded_offset, address, stream, format, @@ -454,11 +467,8 @@ c_val_print (type, valaddr, embedded_offset, address, stream, format, deref_ref, } int -c_value_print (val, stream, format, pretty) - value_ptr val; - struct ui_file *stream; - int format; - enum val_prettyprint pretty; +c_value_print (value_ptr val, struct ui_file *stream, int format, + enum val_prettyprint pretty) { struct type *type = VALUE_TYPE (val); struct type *real_type;