mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-26 09:08:59 +00:00
* c-exp.y (qualified_name): Replace explicit check for valid
destructor name with call to destructor_name_p. * c-lang.h, c-typeprint.c (cp_type_print_method_args): Removed, no longer needed. * c-typeprint.c (c_type_print_varspec_prefix, c_type_print_base): Replace remaining fprintf_unfiltered calls with their filtered variant. (c_type_print_base): Do not print return type for destructors from template classes. Replace cp_type_print_method_args with cplus_demangle call to get consistent type output for stubbed and unstubbed methods. * cp-valprint.c (cp_print_class_method): Replace cp_type_print_method_args with cplus_demangle call to get consistent type output for stubbed and unstubbed methods. * gdbtypes.c, gdbtypes.h (get_destructor_fn_field): New function to find the destructor field indices for a type. * gdbtypes.h (struct type): Clarify comments for vptr_basetype and arg_types fields. (struct fn_field): Remove args field, no longer used. * symtab.c (decode_line_1), valops.c (value_struct_elt, check_field_in): Use get_destructor_fn_field to find the destructor field indices instead of assuming that the compiler passes the member function fields in a specific order. * symtab.c (find_methods): Pass NULL instead of SYMBOL_BLOCK_VALUE to lookup_symbol. (list_symbol): Replace cp_type_print_method_args with cplus_demangle call in zapped out code and explain why this code is zapped out.
This commit is contained in:
69
gdb/symtab.c
69
gdb/symtab.c
@@ -1,5 +1,5 @@
|
||||
/* Symbol table lookup for the GNU debugger, GDB.
|
||||
Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995
|
||||
Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
@@ -77,7 +77,7 @@ list_symbols PARAMS ((char *, int, int, int));
|
||||
static void
|
||||
output_source_filename PARAMS ((char *, int *));
|
||||
|
||||
static char *
|
||||
char *
|
||||
operator_chars PARAMS ((char *, char **));
|
||||
|
||||
static int find_line_common PARAMS ((struct linetable *, int, int *));
|
||||
@@ -1551,7 +1551,7 @@ find_function_start_sal (sym, funfirstline)
|
||||
some legitimate operator text, return a pointer to the
|
||||
beginning of the substring of the operator text.
|
||||
Otherwise, return "". */
|
||||
static char *
|
||||
char *
|
||||
operator_chars (p, end)
|
||||
char *p;
|
||||
char **end;
|
||||
@@ -1717,19 +1717,12 @@ find_methods (t, name, sym_arr)
|
||||
if (DESTRUCTOR_PREFIX_P (phys_name))
|
||||
continue;
|
||||
|
||||
/* FIXME: Why are we looking this up in the
|
||||
SYMBOL_BLOCK_VALUE (sym_class)? It is intended as a hook
|
||||
for nested types? If so, it should probably hook to the
|
||||
type, not the symbol. mipsread.c is the only symbol
|
||||
reader which sets the SYMBOL_BLOCK_VALUE for types, and
|
||||
this is not documented in symtab.h. -26Aug93. */
|
||||
|
||||
sym_arr[i1] = lookup_symbol (phys_name,
|
||||
SYMBOL_BLOCK_VALUE (sym_class),
|
||||
VAR_NAMESPACE,
|
||||
NULL, VAR_NAMESPACE,
|
||||
(int *) NULL,
|
||||
(struct symtab **) NULL);
|
||||
if (sym_arr[i1]) i1++;
|
||||
if (sym_arr[i1])
|
||||
i1++;
|
||||
else
|
||||
{
|
||||
fputs_filtered("(Cannot find method ", gdb_stdout);
|
||||
@@ -2029,25 +2022,22 @@ decode_line_1 (argptr, funfirstline, default_symtab, default_line, canonical)
|
||||
sym_arr = (struct symbol **) alloca(total_number_of_methods (t)
|
||||
* sizeof(struct symbol *));
|
||||
|
||||
/* Cfront objects don't have fieldlists. */
|
||||
if (destructor_name_p (copy, t) && TYPE_FN_FIELDLISTS (t) != NULL)
|
||||
if (destructor_name_p (copy, t))
|
||||
{
|
||||
/* destructors are a special case. */
|
||||
struct fn_field *f = TYPE_FN_FIELDLIST1 (t, 0);
|
||||
int len = TYPE_FN_FIELDLIST_LENGTH (t, 0) - 1;
|
||||
/* gcc 1.x puts destructor in last field,
|
||||
gcc 2.x puts destructor in first field. */
|
||||
char *phys_name = TYPE_FN_FIELD_PHYSNAME (f, len);
|
||||
if (!DESTRUCTOR_PREFIX_P (phys_name))
|
||||
/* Destructors are a special case. */
|
||||
int m_index, f_index;
|
||||
|
||||
if (get_destructor_fn_field (t, &m_index, &f_index))
|
||||
{
|
||||
phys_name = TYPE_FN_FIELD_PHYSNAME (f, 0);
|
||||
if (!DESTRUCTOR_PREFIX_P (phys_name))
|
||||
phys_name = "";
|
||||
struct fn_field *f = TYPE_FN_FIELDLIST1 (t, m_index);
|
||||
|
||||
sym_arr[i1] =
|
||||
lookup_symbol (TYPE_FN_FIELD_PHYSNAME (f, f_index),
|
||||
NULL, VAR_NAMESPACE, (int *) NULL,
|
||||
(struct symtab **)NULL);
|
||||
if (sym_arr[i1])
|
||||
i1++;
|
||||
}
|
||||
sym_arr[i1] =
|
||||
lookup_symbol (phys_name, SYMBOL_BLOCK_VALUE (sym_class),
|
||||
VAR_NAMESPACE, 0, (struct symtab **)NULL);
|
||||
if (sym_arr[i1]) i1++;
|
||||
}
|
||||
else
|
||||
i1 = find_methods (t, copy, sym_arr);
|
||||
@@ -2848,15 +2838,26 @@ list_symbols (regexp, class, bpt, from_tty)
|
||||
}
|
||||
else
|
||||
{
|
||||
# if 0 /* FIXME, why is this zapped out? */
|
||||
char buf[1024];
|
||||
# if 0
|
||||
/* Tiemann says: "info methods was never implemented." */
|
||||
char *demangled_name;
|
||||
c_type_print_base (TYPE_FN_FIELD_TYPE(t, i),
|
||||
gdb_stdout, 0, 0);
|
||||
c_type_print_varspec_prefix (TYPE_FN_FIELD_TYPE(t, i),
|
||||
gdb_stdout, 0);
|
||||
sprintf (buf, " %s::", type_name_no_tag (t));
|
||||
cp_type_print_method_args (TYPE_FN_FIELD_ARGS (t, i),
|
||||
buf, name, gdb_stdout);
|
||||
if (TYPE_FN_FIELD_STUB (t, i))
|
||||
check_stub_method (TYPE_DOMAIN_TYPE (type), j, i);
|
||||
demangled_name =
|
||||
cplus_demangle (TYPE_FN_FIELD_PHYSNAME (t, i),
|
||||
DMGL_ANSI | DMGL_PARAMS);
|
||||
if (demangled_name == NULL)
|
||||
fprintf_filtered (stream, "<badly mangled name %s>",
|
||||
TYPE_FN_FIELD_PHYSNAME (t, i));
|
||||
else
|
||||
{
|
||||
fputs_filtered (demangled_name, stream);
|
||||
free (demangled_name);
|
||||
}
|
||||
# endif
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user