* symtab.h (DESTRUCTOR_PREFIX_P): New macro to check if physname
is a C++ destructor. * symtab.c (gdb_mangle_name): Use it. * symtab.c (find_methods): Do not add destructors to choice list for constructors. * symtab.c (decode_line_1): Make breakpoints on destructors work for gcc-2.x again.
This commit is contained in:
parent
98a445b0fa
commit
ca6a826d84
|
@ -1,3 +1,13 @@
|
||||||
|
Thu Apr 8 10:34:37 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de)
|
||||||
|
|
||||||
|
* symtab.h (DESTRUCTOR_PREFIX_P): New macro to check if physname
|
||||||
|
is a C++ destructor.
|
||||||
|
* symtab.c (gdb_mangle_name): Use it.
|
||||||
|
* symtab.c (find_methods): Do not add destructors to choice list
|
||||||
|
for constructors.
|
||||||
|
* symtab.c (decode_line_1): Make breakpoints on destructors work
|
||||||
|
for gcc-2.x again.
|
||||||
|
|
||||||
Wed Apr 7 18:43:09 1993 Stu Grossman (grossman@cygnus.com)
|
Wed Apr 7 18:43:09 1993 Stu Grossman (grossman@cygnus.com)
|
||||||
|
|
||||||
* ser-go32.c: Make it use serial port name.
|
* ser-go32.c: Make it use serial port name.
|
||||||
|
|
45
gdb/symtab.c
45
gdb/symtab.c
|
@ -255,8 +255,7 @@ gdb_mangle_name (type, i, j)
|
||||||
char *physname = TYPE_FN_FIELD_PHYSNAME (f, j);
|
char *physname = TYPE_FN_FIELD_PHYSNAME (f, j);
|
||||||
char *newname = type_name_no_tag (type);
|
char *newname = type_name_no_tag (type);
|
||||||
int is_constructor = STREQ (field_name, newname);
|
int is_constructor = STREQ (field_name, newname);
|
||||||
int is_destructor = is_constructor && physname[0] == '_'
|
int is_destructor = is_constructor && DESTRUCTOR_PREFIX_P (physname);
|
||||||
&& physname[1] == CPLUS_MARKER && physname[2] == '_';
|
|
||||||
/* Need a new type prefix. */
|
/* Need a new type prefix. */
|
||||||
char *const_prefix = method->is_const ? "C" : "";
|
char *const_prefix = method->is_const ? "C" : "";
|
||||||
char *volatile_prefix = method->is_volatile ? "V" : "";
|
char *volatile_prefix = method->is_volatile ? "V" : "";
|
||||||
|
@ -920,8 +919,11 @@ find_pc_symtab (pc)
|
||||||
register struct block *b;
|
register struct block *b;
|
||||||
struct blockvector *bv;
|
struct blockvector *bv;
|
||||||
register struct symtab *s = NULL;
|
register struct symtab *s = NULL;
|
||||||
|
register struct symtab *best_s = NULL;
|
||||||
register struct partial_symtab *ps;
|
register struct partial_symtab *ps;
|
||||||
register struct objfile *objfile;
|
register struct objfile *objfile;
|
||||||
|
int distance = 0;;
|
||||||
|
|
||||||
|
|
||||||
/* Search all symtabs for one whose file contains our pc */
|
/* Search all symtabs for one whose file contains our pc */
|
||||||
|
|
||||||
|
@ -930,10 +932,18 @@ find_pc_symtab (pc)
|
||||||
bv = BLOCKVECTOR (s);
|
bv = BLOCKVECTOR (s);
|
||||||
b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
|
b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
|
||||||
if (BLOCK_START (b) <= pc
|
if (BLOCK_START (b) <= pc
|
||||||
&& BLOCK_END (b) > pc)
|
&& BLOCK_END (b) > pc
|
||||||
return (s);
|
&& (distance == 0
|
||||||
|
|| BLOCK_END (b) - BLOCK_START (b) < distance))
|
||||||
|
{
|
||||||
|
distance = BLOCK_END (b) - BLOCK_START (b);
|
||||||
|
best_s = s;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (best_s != NULL)
|
||||||
|
return(best_s);
|
||||||
|
|
||||||
s = NULL;
|
s = NULL;
|
||||||
ps = find_pc_psymtab (pc);
|
ps = find_pc_psymtab (pc);
|
||||||
if (ps)
|
if (ps)
|
||||||
|
@ -1380,6 +1390,9 @@ find_methods (t, name, sym_arr)
|
||||||
if (TYPE_FN_FIELD_STUB (f, field_counter))
|
if (TYPE_FN_FIELD_STUB (f, field_counter))
|
||||||
check_stub_method (t, method_counter, field_counter);
|
check_stub_method (t, method_counter, field_counter);
|
||||||
phys_name = TYPE_FN_FIELD_PHYSNAME (f, field_counter);
|
phys_name = TYPE_FN_FIELD_PHYSNAME (f, field_counter);
|
||||||
|
/* Destructor is handled by caller, dont add it to the list */
|
||||||
|
if (DESTRUCTOR_PREFIX_P (phys_name))
|
||||||
|
continue;
|
||||||
sym_arr[i1] = lookup_symbol (phys_name,
|
sym_arr[i1] = lookup_symbol (phys_name,
|
||||||
SYMBOL_BLOCK_VALUE (sym_class),
|
SYMBOL_BLOCK_VALUE (sym_class),
|
||||||
VAR_NAMESPACE,
|
VAR_NAMESPACE,
|
||||||
|
@ -1599,7 +1612,15 @@ decode_line_1 (argptr, funfirstline, default_symtab, default_line)
|
||||||
/* destructors are a special case. */
|
/* destructors are a special case. */
|
||||||
struct fn_field *f = TYPE_FN_FIELDLIST1 (t, 0);
|
struct fn_field *f = TYPE_FN_FIELDLIST1 (t, 0);
|
||||||
int len = TYPE_FN_FIELDLIST_LENGTH (t, 0) - 1;
|
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);
|
char *phys_name = TYPE_FN_FIELD_PHYSNAME (f, len);
|
||||||
|
if (!DESTRUCTOR_PREFIX_P (phys_name))
|
||||||
|
{
|
||||||
|
phys_name = TYPE_FN_FIELD_PHYSNAME (f, 0);
|
||||||
|
if (!DESTRUCTOR_PREFIX_P (phys_name))
|
||||||
|
phys_name = "";
|
||||||
|
}
|
||||||
sym_arr[i1] =
|
sym_arr[i1] =
|
||||||
lookup_symbol (phys_name, SYMBOL_BLOCK_VALUE (sym_class),
|
lookup_symbol (phys_name, SYMBOL_BLOCK_VALUE (sym_class),
|
||||||
VAR_NAMESPACE, 0, (struct symtab **)NULL);
|
VAR_NAMESPACE, 0, (struct symtab **)NULL);
|
||||||
|
@ -2258,7 +2279,21 @@ list_symbols (regexp, class, bpt)
|
||||||
{
|
{
|
||||||
/* Set a breakpoint here, if it's a function */
|
/* Set a breakpoint here, if it's a function */
|
||||||
if (class == 1)
|
if (class == 1)
|
||||||
break_command (SYMBOL_NAME(sym), 0);
|
{
|
||||||
|
/* There may be more than one function with the
|
||||||
|
same name but in different files. In order to
|
||||||
|
set breakpoints on all of them, we must give
|
||||||
|
both the file name and the function name to
|
||||||
|
break_command. */
|
||||||
|
char *string =
|
||||||
|
(char *) alloca (strlen (s->filename)
|
||||||
|
+ strlen (SYMBOL_NAME(sym))
|
||||||
|
+ 2);
|
||||||
|
strcpy (string, s->filename);
|
||||||
|
strcat (string, ":");
|
||||||
|
strcat (string, SYMBOL_NAME(sym));
|
||||||
|
break_command (string, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (!found_in_file)
|
else if (!found_in_file)
|
||||||
{
|
{
|
||||||
|
|
38
gdb/symtab.h
38
gdb/symtab.h
|
@ -100,6 +100,13 @@ struct general_symbol_info
|
||||||
/* end-sanitize-chill */
|
/* end-sanitize-chill */
|
||||||
} lang_u;
|
} lang_u;
|
||||||
} lang_specific;
|
} lang_specific;
|
||||||
|
|
||||||
|
/* Which section is this symbol in? This is an index into
|
||||||
|
section_offsets for this objfile. Negative means that the symbol
|
||||||
|
does not get relocated relative to a section. */
|
||||||
|
/* Disclaimer: currently this is just used for xcoff, so don't expect
|
||||||
|
all symbol-reading code to set it correctly. */
|
||||||
|
int section;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define SYMBOL_NAME(symbol) (symbol)->ginfo.name
|
#define SYMBOL_NAME(symbol) (symbol)->ginfo.name
|
||||||
|
@ -109,6 +116,7 @@ struct general_symbol_info
|
||||||
#define SYMBOL_BLOCK_VALUE(symbol) (symbol)->ginfo.value.block
|
#define SYMBOL_BLOCK_VALUE(symbol) (symbol)->ginfo.value.block
|
||||||
#define SYMBOL_VALUE_CHAIN(symbol) (symbol)->ginfo.value.chain
|
#define SYMBOL_VALUE_CHAIN(symbol) (symbol)->ginfo.value.chain
|
||||||
#define SYMBOL_LANGUAGE(symbol) (symbol)->ginfo.lang_specific.language
|
#define SYMBOL_LANGUAGE(symbol) (symbol)->ginfo.lang_specific.language
|
||||||
|
#define SYMBOL_SECTION(symbol) (symbol)->ginfo.section
|
||||||
|
|
||||||
#define SYMBOL_CPLUS_DEMANGLED_NAME(symbol) \
|
#define SYMBOL_CPLUS_DEMANGLED_NAME(symbol) \
|
||||||
(symbol)->ginfo.lang_specific.lang_u.cplus_specific.demangled_name
|
(symbol)->ginfo.lang_specific.lang_u.cplus_specific.demangled_name
|
||||||
|
@ -507,7 +515,7 @@ enum address_class
|
||||||
|
|
||||||
LOC_BLOCK,
|
LOC_BLOCK,
|
||||||
|
|
||||||
/* Value is a constant byte-sequence pointed to by SYMBOL_VALUE_ADDRESS, in
|
/* Value is a constant byte-sequence pointed to by SYMBOL_VALUE_BYTES, in
|
||||||
target byte order. */
|
target byte order. */
|
||||||
|
|
||||||
LOC_CONST_BYTES,
|
LOC_CONST_BYTES,
|
||||||
|
@ -518,8 +526,12 @@ enum address_class
|
||||||
(FRAME_ARGS_ADDRESS). Added for i960, which passes args in regs then
|
(FRAME_ARGS_ADDRESS). Added for i960, which passes args in regs then
|
||||||
copies to frame. */
|
copies to frame. */
|
||||||
|
|
||||||
LOC_LOCAL_ARG
|
LOC_LOCAL_ARG,
|
||||||
|
|
||||||
|
/* The variable does not actually exist in the program.
|
||||||
|
The SYMBOL_VALUE is ignored. */
|
||||||
|
|
||||||
|
LOC_OPTIMIZED_OUT
|
||||||
};
|
};
|
||||||
|
|
||||||
struct symbol
|
struct symbol
|
||||||
|
@ -679,6 +691,17 @@ struct symtab
|
||||||
|
|
||||||
struct linetable *linetable;
|
struct linetable *linetable;
|
||||||
|
|
||||||
|
/* Section in objfile->section_offsets for the blockvector and
|
||||||
|
the linetable. */
|
||||||
|
|
||||||
|
int block_line_section;
|
||||||
|
|
||||||
|
/* If several symtabs share a blockvector, exactly one of them
|
||||||
|
should be designed the primary, so that the blockvector
|
||||||
|
is relocated exactly once by objfile_relocate. */
|
||||||
|
|
||||||
|
int primary;
|
||||||
|
|
||||||
/* Name of this source file. */
|
/* Name of this source file. */
|
||||||
|
|
||||||
char *filename;
|
char *filename;
|
||||||
|
@ -854,9 +877,18 @@ struct partial_symtab
|
||||||
#define OPNAME_PREFIX_P(NAME) \
|
#define OPNAME_PREFIX_P(NAME) \
|
||||||
((NAME)[0] == 'o' && (NAME)[1] == 'p' && (NAME)[2] == CPLUS_MARKER)
|
((NAME)[0] == 'o' && (NAME)[1] == 'p' && (NAME)[2] == CPLUS_MARKER)
|
||||||
|
|
||||||
|
/* Macro that yields non-zero value iff NAME is the prefix for C++ vtbl
|
||||||
|
names. */
|
||||||
|
|
||||||
#define VTBL_PREFIX_P(NAME) \
|
#define VTBL_PREFIX_P(NAME) \
|
||||||
((NAME)[3] == CPLUS_MARKER && !strncmp ((NAME), "_vt", 3))
|
((NAME)[3] == CPLUS_MARKER && !strncmp ((NAME), "_vt", 3))
|
||||||
|
|
||||||
|
/* Macro that yields non-zero value iff NAME is the prefix for C++ destructor
|
||||||
|
names. */
|
||||||
|
|
||||||
|
#define DESTRUCTOR_PREFIX_P(NAME) \
|
||||||
|
((NAME)[0] == '_' && (NAME)[1] == CPLUS_MARKER && (NAME)[2] == '_')
|
||||||
|
|
||||||
|
|
||||||
/* External variables and functions for the objects described above. */
|
/* External variables and functions for the objects described above. */
|
||||||
|
|
||||||
|
@ -935,7 +967,7 @@ prim_record_minimal_symbol PARAMS ((const char *, CORE_ADDR,
|
||||||
extern void
|
extern void
|
||||||
prim_record_minimal_symbol_and_info PARAMS ((const char *, CORE_ADDR,
|
prim_record_minimal_symbol_and_info PARAMS ((const char *, CORE_ADDR,
|
||||||
enum minimal_symbol_type,
|
enum minimal_symbol_type,
|
||||||
char *info));
|
char *info, int section));
|
||||||
|
|
||||||
extern struct minimal_symbol *
|
extern struct minimal_symbol *
|
||||||
lookup_minimal_symbol PARAMS ((const char *, struct objfile *));
|
lookup_minimal_symbol PARAMS ((const char *, struct objfile *));
|
||||||
|
|
Loading…
Reference in New Issue