Some improvements to g++ debugging.

* symtab.c (list_symbols): demangle before pattern matching.
	* symtab.c:  Other fixes to improve handing of operators.
	* valprint.c (type_print_base):  Fix test for constructor.
	* values.c (value_static_field):  Allow evaluation of
	CLASS::METHOD, returning a function pointer.
This commit is contained in:
Per Bothner
1992-03-19 00:05:35 +00:00
parent c976b3499c
commit 2cd9998540
4 changed files with 192 additions and 54 deletions

View File

@@ -17,10 +17,10 @@ You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include <stdio.h>
#include <string.h>
#include "defs.h"
#include <string.h>
#include "symtab.h"
#include "gdbtypes.h"
#include "value.h"
#include "gdbcore.h"
#include "gdbcmd.h"
@@ -29,11 +29,59 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "language.h"
#include <errno.h>
/* Prototypes for local functions */
static void
print_string PARAMS ((FILE *, char *, unsigned int, int));
static void
show_print PARAMS ((char *, int));
static void
set_print PARAMS ((char *, int));
static void
set_radix PARAMS ((char *, int, struct cmd_list_element *));
static void
set_output_radix PARAMS ((char *, int, struct cmd_list_element *));
static void
type_print_base PARAMS ((struct type *, FILE *, int, int));
static void
type_print_varspec_suffix PARAMS ((struct type *, FILE *, int, int));
static void
type_print_varspec_prefix PARAMS ((struct type *, FILE *, int, int));
static void
type_print_derivation_info PARAMS ((FILE *, struct type *));
static void
type_print_method_args PARAMS ((struct type **, char *, char *, int, FILE *));
static void
cplus_val_print PARAMS ((struct type *, char *, FILE *, int, int,
enum val_prettyprint, struct type **));
static void
val_print_fields PARAMS ((struct type *, char *, FILE *, int, int,
enum val_prettyprint, struct type **));
static int
is_vtbl_member PARAMS ((struct type *));
static int
is_vtbl_ptr_type PARAMS ((struct type *));
static void
print_hex_chars PARAMS ((FILE *, unsigned char *, unsigned));
extern int sys_nerr;
extern char *sys_errlist[];
extern void print_scalar_formatted(); /* printcmd.c */
extern void print_address_demangle(); /* printcmd.c */
extern int demangle; /* whether to print C++ syms raw or source-form */
/* Maximum number of chars to print for a string pointer value
@@ -41,11 +89,6 @@ extern int demangle; /* whether to print C++ syms raw or source-form */
static unsigned int print_max;
static void type_print_varspec_suffix ();
static void type_print_varspec_prefix ();
static void type_print_base ();
static void type_print_method_args ();
/* Default input and output radixes, and output format letter. */
unsigned input_radix = 10;
@@ -74,14 +117,13 @@ int objectprint; /* Controls looking up an object's derived type
struct obstack dont_print_obstack;
static void cplus_val_print ();
/* Print the character string STRING, printing at most LENGTH characters.
Printing stops early if the number hits print_max; repeat counts
are printed as appropriate. Print ellipses at the end if we
had to stop before printing LENGTH characters, or if FORCE_ELLIPSES. */
void
static void
print_string (stream, string, length, force_ellipses)
FILE *stream;
char *string;
@@ -286,7 +328,7 @@ int
value_print (val, stream, format, pretty)
value val;
FILE *stream;
char format;
int format;
enum val_prettyprint pretty;
{
register unsigned int i, n, typelen;
@@ -439,12 +481,13 @@ is_vtbl_member(type)
DONT_PRINT is an array of baseclass types that we
should not print, or zero if called from top level. */
static void
val_print_fields (type, valaddr, stream, format, recurse, pretty, dont_print)
struct type *type;
char *valaddr;
FILE *stream;
char format;
int format;
int recurse;
enum val_prettyprint pretty;
struct type **dont_print;
@@ -547,7 +590,7 @@ cplus_val_print (type, valaddr, stream, format, recurse, pretty, dont_print)
struct type *type;
char *valaddr;
FILE *stream;
char format;
int format;
int recurse;
enum val_prettyprint pretty;
struct type **dont_print;
@@ -634,13 +677,12 @@ cplus_val_print (type, valaddr, stream, format, recurse, pretty, dont_print)
The PRETTY parameter controls prettyprinting. */
int
val_print (type, valaddr, address, stream, format,
deref_ref, recurse, pretty)
val_print (type, valaddr, address, stream, format, deref_ref, recurse, pretty)
struct type *type;
char *valaddr;
CORE_ADDR address;
FILE *stream;
char format;
int format;
int deref_ref;
int recurse;
enum val_prettyprint pretty;
@@ -927,10 +969,17 @@ val_print (type, valaddr, address, stream, format,
slower if print_max is set high, e.g. if you set
print_max to 1000, not only will it take a long
time to fetch short strings, but if you are near
the end of the address space, it might not work.
FIXME. */
the end of the address space, it might not work. */
QUIT;
errcode = target_read_memory (addr, string, print_max);
if (errcode != 0)
{
/* Try reading just one character. If that succeeds,
assume we hit the end of the address space, but
the initial part of the string is probably safe. */
char x[1];
errcode = target_read_memory (addr, x, 1);
}
if (errcode != 0)
force_ellipses = 0;
else
@@ -974,13 +1023,12 @@ val_print (type, valaddr, address, stream, format,
{
CORE_ADDR vt_address = unpack_pointer (type, valaddr);
int vt_index = find_pc_misc_function (vt_address);
if (vt_index >= 0
&& vt_address == misc_function_vector[vt_index].address)
struct minimal_symbol *msymbol =
lookup_minimal_symbol_by_pc (vt_address);
if ((msymbol != NULL) && (vt_address == msymbol -> address))
{
fputs_filtered (" <", stream);
fputs_demangled (misc_function_vector[vt_index].name,
stream, 1);
fputs_demangled (msymbol -> name, stream, 1);
fputs_filtered (">", stream);
}
if (vtblprint)
@@ -1698,7 +1746,7 @@ type_print_base (type, stream, show, level)
struct fn_field *f = TYPE_FN_FIELDLIST1 (type, i);
int j, len2 = TYPE_FN_FIELDLIST_LENGTH (type, i);
char *method_name = TYPE_FN_FIELDLIST_NAME (type, i);
int is_constructor = strcmp(method_name, TYPE_NAME (type)) == 0;
int is_constructor = name && strcmp(method_name, name) == 0;
for (j = 0; j < len2; j++)
{
QUIT;
@@ -1723,7 +1771,6 @@ type_print_base (type, stream, show, level)
if (TYPE_FN_FIELD_STUB (f, j))
{
/* Build something we can demangle. */
char *strchr (), *gdb_mangle_name (), *cplus_demangle ();
char *mangled_name = gdb_mangle_name (type, i, j);
char *demangled_name = cplus_demangle (mangled_name, 1);
if (demangled_name == 0)
@@ -2011,7 +2058,7 @@ _initialize_valprint ()
"Set default input and output number radix.",
&setlist);
add_show_from_set (c, &showlist);
c->function = set_radix;
c->function.sfunc = set_radix;
/* Give people the defaults which they are used to. */
prettyprint = 0;