Sat Nov 21 17:15:40 1998 Philippe De Muyter <phdm@macqel.be>

* coffread.c (coff_symtab_read): Discard C_LABEL's that are not
	function entry points, to avoid getting them in the stack dump
	instead of the actual function.
This commit is contained in:
Stan Shebs
1998-11-21 19:59:37 +00:00
parent e78a799536
commit aa8938d581
2 changed files with 43 additions and 17 deletions

View File

@ -1,5 +1,9 @@
Sat Nov 21 17:15:40 1998 Philippe De Muyter <phdm@macqel.be> Sat Nov 21 17:15:40 1998 Philippe De Muyter <phdm@macqel.be>
* coffread.c (coff_symtab_read): Discard C_LABEL's that are not
function entry points, to avoid getting them in the stack dump
instead of the actual function.
* config/m68k/delta68.mh (NAT_FILE): Undo 1998-08-18 change; * config/m68k/delta68.mh (NAT_FILE): Undo 1998-08-18 change;
without NAT_FILE definition, configure will assume that GDB cannot without NAT_FILE definition, configure will assume that GDB cannot
run native. run native.

View File

@ -1,5 +1,5 @@
/* Read coff symbol tables and convert to internal format, for GDB. /* Read coff symbol tables and convert to internal format, for GDB.
Copyright 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1996, 1997 Copyright 1987, 88, 89, 90, 91, 92, 93, 94, 96, 97, 1998
Free Software Foundation, Inc. Free Software Foundation, Inc.
Contributed by David D. Johnson, Brown University (ddj@cs.brown.edu). Contributed by David D. Johnson, Brown University (ddj@cs.brown.edu).
@ -22,6 +22,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "defs.h" #include "defs.h"
#include "symtab.h" #include "symtab.h"
#include "gdbtypes.h" #include "gdbtypes.h"
#include "demangle.h"
#include "breakpoint.h" #include "breakpoint.h"
#include "bfd.h" #include "bfd.h"
@ -249,7 +250,7 @@ static void coff_end_symtab PARAMS ((struct objfile *));
static void complete_symtab PARAMS ((char *, CORE_ADDR, unsigned int)); static void complete_symtab PARAMS ((char *, CORE_ADDR, unsigned int));
static void coff_start_symtab PARAMS ((void)); static void coff_start_symtab PARAMS ((char *));
static void coff_record_line PARAMS ((int, CORE_ADDR)); static void coff_record_line PARAMS ((int, CORE_ADDR));
@ -468,14 +469,15 @@ coff_record_line (line, pc)
it indicates the start of data for one original source file. */ it indicates the start of data for one original source file. */
static void static void
coff_start_symtab () coff_start_symtab (name)
char *name;
{ {
start_symtab ( start_symtab (
/* We fill in the filename later. start_symtab puts /* We fill in the filename later. start_symtab puts
this pointer into last_source_file and we put it in this pointer into last_source_file and we put it in
subfiles->name, which end_symtab frees; that's why subfiles->name, which end_symtab frees; that's why
it must be malloc'd. */ it must be malloc'd. */
savestring ("", 0), savestring (name, strlen(name)),
/* We never know the directory name for COFF. */ /* We never know the directory name for COFF. */
NULL, NULL,
/* The start address is irrelevant, since we set /* The start address is irrelevant, since we set
@ -544,7 +546,6 @@ coff_end_symtab (objfile)
before (or because doing it now is simply an artifact of how this before (or because doing it now is simply an artifact of how this
file used to be written). */ file used to be written). */
subfiles->line_vector = line_vector; subfiles->line_vector = line_vector;
subfiles->name = last_source_file;
symtab = end_symtab (current_source_end_addr, objfile, 0); symtab = end_symtab (current_source_end_addr, objfile, 0);
@ -588,7 +589,7 @@ coff_symfile_init (objfile)
struct objfile *objfile; struct objfile *objfile;
{ {
/* Allocate struct to keep track of stab reading. */ /* Allocate struct to keep track of stab reading. */
objfile->sym_stab_info = (PTR) objfile->sym_stab_info = (struct dbx_symfile_info *)
xmmalloc (objfile->md, sizeof (struct dbx_symfile_info)); xmmalloc (objfile->md, sizeof (struct dbx_symfile_info));
memset ((PTR) objfile->sym_stab_info, 0, sizeof (struct dbx_symfile_info)); memset ((PTR) objfile->sym_stab_info, 0, sizeof (struct dbx_symfile_info));
@ -696,7 +697,7 @@ coff_symfile_read (objfile, section_offsets, mainline)
temp_sym = (char *) xmalloc temp_sym = (char *) xmalloc
(cdata->local_symesz + cdata->local_auxesz); (cdata->local_symesz + cdata->local_auxesz);
temp_aux = temp_sym + cdata->local_symesz; temp_aux = temp_sym + cdata->local_symesz;
back_to = make_cleanup (free_current_contents, &temp_sym); back_to = make_cleanup ((make_cleanup_func) free_current_contents, &temp_sym);
/* We need to know whether this is a PE file, because in PE files, /* We need to know whether this is a PE file, because in PE files,
unlike standard COFF files, symbol values are stored as offsets unlike standard COFF files, symbol values are stored as offsets
@ -712,7 +713,7 @@ coff_symfile_read (objfile, section_offsets, mainline)
info->max_lineno_offset = 0; info->max_lineno_offset = 0;
bfd_map_over_sections (abfd, find_linenos, (PTR) info); bfd_map_over_sections (abfd, find_linenos, (PTR) info);
make_cleanup (free_linetab, 0); make_cleanup ((make_cleanup_func) free_linetab, 0);
val = init_lineno (abfd, info->min_lineno_offset, val = init_lineno (abfd, info->min_lineno_offset,
info->max_lineno_offset - info->min_lineno_offset); info->max_lineno_offset - info->min_lineno_offset);
if (val < 0) if (val < 0)
@ -720,13 +721,13 @@ coff_symfile_read (objfile, section_offsets, mainline)
/* Now read the string table, all at once. */ /* Now read the string table, all at once. */
make_cleanup (free_stringtab, 0); make_cleanup ((make_cleanup_func) free_stringtab, 0);
val = init_stringtab (abfd, stringtab_offset); val = init_stringtab (abfd, stringtab_offset);
if (val < 0) if (val < 0)
error ("\"%s\": can't get string table", name); error ("\"%s\": can't get string table", name);
init_minimal_symbol_collection (); init_minimal_symbol_collection ();
make_cleanup (discard_minimal_symbols, 0); make_cleanup ((make_cleanup_func) discard_minimal_symbols, 0);
/* Now that the executable file is positioned at symbol table, /* Now that the executable file is positioned at symbol table,
process it and define symbols accordingly. */ process it and define symbols accordingly. */
@ -859,7 +860,7 @@ coff_symtab_read (symtab_offset, nsyms, section_offsets, objfile)
xmalloc (type_vector_length * sizeof (struct type *)); xmalloc (type_vector_length * sizeof (struct type *));
memset (type_vector, 0, type_vector_length * sizeof (struct type *)); memset (type_vector, 0, type_vector_length * sizeof (struct type *));
coff_start_symtab (); coff_start_symtab ("");
symnum = 0; symnum = 0;
while (symnum < nsyms) while (symnum < nsyms)
@ -873,7 +874,7 @@ coff_symtab_read (symtab_offset, nsyms, section_offsets, objfile)
if (last_source_file) if (last_source_file)
coff_end_symtab (objfile); coff_end_symtab (objfile);
coff_start_symtab (); coff_start_symtab ("_globals_");
complete_symtab ("_globals_", 0, 0); complete_symtab ("_globals_", 0, 0);
/* done with all files, everything from here on out is globals */ /* done with all files, everything from here on out is globals */
} }
@ -924,7 +925,7 @@ coff_symtab_read (symtab_offset, nsyms, section_offsets, objfile)
if (last_source_file) if (last_source_file)
{ {
coff_end_symtab (objfile); coff_end_symtab (objfile);
coff_start_symtab (); coff_start_symtab (filestring);
} }
in_source_file = 1; in_source_file = 1;
break; break;
@ -933,6 +934,10 @@ coff_symtab_read (symtab_offset, nsyms, section_offsets, objfile)
it here allows gdb to see static functions when no debug it here allows gdb to see static functions when no debug
info is available. */ info is available. */
case C_LABEL: case C_LABEL:
/* However, labels within a function can make weird backtraces,
so filter them out (from phdm@macquel.be). */
if (within_function)
break;
case C_STAT: case C_STAT:
case C_THUMBLABEL: case C_THUMBLABEL:
case C_THUMBSTAT: case C_THUMBSTAT:
@ -1038,10 +1043,17 @@ coff_symtab_read (symtab_offset, nsyms, section_offsets, objfile)
} }
if (cs->c_name[0] != '@' /* Skip tdesc symbols */) if (cs->c_name[0] != '@' /* Skip tdesc symbols */)
prim_record_minimal_symbol_and_info {
struct minimal_symbol *msym;
msym = prim_record_minimal_symbol_and_info
(cs->c_name, tmpaddr, ms_type, (char *)cs->c_sclass, sec, (cs->c_name, tmpaddr, ms_type, (char *)cs->c_sclass, sec,
NULL, objfile); NULL, objfile);
#ifdef COFF_MAKE_MSYMBOL_SPECIAL
if(msym)
COFF_MAKE_MSYMBOL_SPECIAL(cs->c_sclass, msym);
#endif
}
if (SDB_TYPE (cs->c_type)) if (SDB_TYPE (cs->c_type))
{ {
struct symbol *sym; struct symbol *sym;
@ -1559,6 +1571,8 @@ process_coff_symbol (cs, aux, section_offsets, objfile)
name = EXTERNAL_NAME (name, objfile->obfd); name = EXTERNAL_NAME (name, objfile->obfd);
SYMBOL_NAME (sym) = obsavestring (name, strlen (name), SYMBOL_NAME (sym) = obsavestring (name, strlen (name),
&objfile->symbol_obstack); &objfile->symbol_obstack);
SYMBOL_LANGUAGE (sym) = language_auto;
SYMBOL_INIT_DEMANGLED_NAME (sym, &objfile->symbol_obstack);
/* default assumptions */ /* default assumptions */
SYMBOL_VALUE (sym) = cs->c_value; SYMBOL_VALUE (sym) = cs->c_value;
@ -1900,6 +1914,10 @@ decode_base_type (cs, c_type, aux)
return lookup_fundamental_type (current_objfile, FT_INTEGER); return lookup_fundamental_type (current_objfile, FT_INTEGER);
case T_LONG: case T_LONG:
if (cs->c_sclass == C_FIELD
&& aux->x_sym.x_misc.x_lnsz.x_size > TARGET_LONG_BIT)
return lookup_fundamental_type (current_objfile, FT_LONG_LONG);
else
return lookup_fundamental_type (current_objfile, FT_LONG); return lookup_fundamental_type (current_objfile, FT_LONG);
case T_FLOAT: case T_FLOAT:
@ -1996,6 +2014,10 @@ decode_base_type (cs, c_type, aux)
return lookup_fundamental_type (current_objfile, FT_UNSIGNED_INTEGER); return lookup_fundamental_type (current_objfile, FT_UNSIGNED_INTEGER);
case T_ULONG: case T_ULONG:
if (cs->c_sclass == C_FIELD
&& aux->x_sym.x_misc.x_lnsz.x_size > TARGET_LONG_BIT)
return lookup_fundamental_type (current_objfile, FT_UNSIGNED_LONG_LONG);
else
return lookup_fundamental_type (current_objfile, FT_UNSIGNED_LONG); return lookup_fundamental_type (current_objfile, FT_UNSIGNED_LONG);
} }
complain (&unexpected_type_complaint, cs->c_name); complain (&unexpected_type_complaint, cs->c_name);