mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-06 15:38:45 +08:00
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:
@ -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.
|
||||||
|
@ -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);
|
||||||
|
Reference in New Issue
Block a user