aboutsummaryrefslogtreecommitdiff
path: root/gdb/coffread.c
diff options
context:
space:
mode:
authorMark Alexander <marka@cygnus>1996-07-03 05:11:40 +0000
committerMark Alexander <marka@cygnus>1996-07-03 05:11:40 +0000
commite74acce48c1b4efc29fd1e9e84639b77383aa002 (patch)
tree11d2d6bd0a7cdc15c36480e244625e817eb65e1b /gdb/coffread.c
parent7647e0dd79067a650898281d3cffc4746aa09fae (diff)
downloadgdb-e74acce48c1b4efc29fd1e9e84639b77383aa002.zip
gdb-e74acce48c1b4efc29fd1e9e84639b77383aa002.tar.gz
gdb-e74acce48c1b4efc29fd1e9e84639b77383aa002.tar.bz2
* coffread.c, dbxread.c, elfread.c, mipsread.c, nlmread.c,
os9kread.c: Replace identical sym_offsets functions with default_symfile_offsets. * somread.c (som_symfile_offsets): Use new SIZEOF_SECTION_OFFSETS macro to allocate section_offsets. * symfile.c (default_symfile_offsets): New function. * symfile.h: Declare default_symfile_offsets. * symtab.h: Define SIZEOF_SECTION_OFFSETS macro to simplify allocation of section_offsets.
Diffstat (limited to 'gdb/coffread.c')
-rw-r--r--gdb/coffread.c67
1 files changed, 39 insertions, 28 deletions
diff --git a/gdb/coffread.c b/gdb/coffread.c
index ec7aef2..c2a96a8 100644
--- a/gdb/coffread.c
+++ b/gdb/coffread.c
@@ -1,5 +1,5 @@
/* Read coff symbol tables and convert to internal format, for GDB.
- Copyright 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994
+ Copyright 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1996
Free Software Foundation, Inc.
Contributed by David D. Johnson, Brown University (ddj@cs.brown.edu).
@@ -17,7 +17,7 @@ GNU General Public License for more details.
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. */
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "defs.h"
#include "symtab.h"
@@ -25,7 +25,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "breakpoint.h"
#include "bfd.h"
-#include <obstack.h>
+#include "obstack.h"
#include "gdb_string.h"
#include <ctype.h>
@@ -139,6 +139,12 @@ static struct symbol *opaque_type_chain[HASHSIZE];
struct complaint ef_complaint =
{"Unmatched .ef symbol(s) ignored starting at symnum %d", 0, 0};
+struct complaint ef_stack_complaint =
+ {"`.ef' symbol without matching `.bf' symbol ignored starting at symnum %d", 0, 0};
+
+struct complaint eb_stack_complaint =
+ {"`.eb' symbol without matching `.bb' symbol ignored starting at symnum %d", 0, 0};
+
struct complaint bf_no_aux_complaint =
{"`.bf' symbol %d has no aux entry", 0, 0};
@@ -510,9 +516,7 @@ coff_end_symtab (objfile)
subfiles->line_vector = line_vector;
subfiles->name = last_source_file;
- /* sort_pending is needed for amdcoff, at least.
- sort_linevec is needed for the SCO compiler. */
- symtab = end_symtab (current_source_end_addr, 1, 1, objfile, 0);
+ symtab = end_symtab (current_source_end_addr, objfile, 0);
if (symtab != NULL)
free_named_symtabs (symtab->filename);
@@ -568,6 +572,11 @@ coff_symfile_init (objfile)
memset (objfile->sym_private, 0, sizeof (struct coff_symfile_info));
+ /* COFF objects may be reordered, so set OBJF_REORDERED. If we
+ find this causes a significant slowdown in gdb then we could
+ set it in the debug symbol readers only when necessary. */
+ objfile->flags |= OBJF_REORDERED;
+
init_entry_point_info (objfile);
}
@@ -892,6 +901,10 @@ coff_symtab_read (symtab_offset, nsyms, section_offsets, objfile)
in_source_file = 1;
break;
+ /* C_LABEL is used for labels and static functions. Including
+ it here allows gdb to see static functions when no debug
+ info is available. */
+ case C_LABEL:
case C_STAT:
if (cs->c_name[0] == '.')
{
@@ -1029,6 +1042,14 @@ coff_symtab_read (symtab_offset, nsyms, section_offsets, objfile)
not useful for gdb. */
/* { main_aux.x_sym.x_misc.x_lnsz.x_lnno
contains number of lines to '}' */
+
+ if (context_stack_depth <= 0)
+ { /* We attempted to pop an empty context stack */
+ complain (&ef_stack_complaint, cs->c_symnum);
+ within_function = 0;
+ break;
+ }
+
new = pop_context ();
/* Stack must be empty now. */
if (context_stack_depth > 0 || new == NULL)
@@ -1082,6 +1103,12 @@ coff_symtab_read (symtab_offset, nsyms, section_offsets, objfile)
}
else if (STREQ (cs->c_name, ".eb"))
{
+ if (context_stack_depth <= 0)
+ { /* We attempted to pop an empty context stack */
+ complain (&eb_stack_complaint, cs->c_symnum);
+ break;
+ }
+
new = pop_context ();
if (depth-- != new->depth)
{
@@ -1182,7 +1209,7 @@ init_stringtab (abfd, offset)
val = bfd_read ((char *)lengthbuf, sizeof lengthbuf, 1, abfd);
length = bfd_h_get_32 (symfile_bfd, lengthbuf);
-
+
/* If no string table is needed, then the file may end immediately
after the symbols. Just return with `stringtab' set to null. */
if (val != sizeof lengthbuf || length < sizeof lengthbuf)
@@ -1802,6 +1829,9 @@ decode_base_type (cs, c_type, aux)
case T_DOUBLE:
return lookup_fundamental_type (current_objfile, FT_DBL_PREC_FLOAT);
+ case T_LNGDBL:
+ return lookup_fundamental_type (current_objfile, FT_EXT_PREC_FLOAT);
+
case T_STRUCT:
if (cs->c_naux != 1)
{
@@ -2098,26 +2128,6 @@ coff_read_enum_type (index, length, lastsym)
return type;
}
-struct section_offsets *
-coff_symfile_offsets (objfile, addr)
- struct objfile *objfile;
- CORE_ADDR addr;
-{
- struct section_offsets *section_offsets;
- int i;
-
- objfile->num_sections = SECT_OFF_MAX;
- section_offsets = (struct section_offsets *)
- obstack_alloc (&objfile -> psymbol_obstack,
- sizeof (struct section_offsets)
- + sizeof (section_offsets->offsets) * SECT_OFF_MAX);
-
- for (i = 0; i < SECT_OFF_MAX; i++)
- ANOFFSET (section_offsets, i) = addr;
-
- return section_offsets;
-}
-
/* Register our ability to parse symbols for coff BFD files. */
static struct sym_fns coff_sym_fns =
@@ -2127,7 +2137,8 @@ static struct sym_fns coff_sym_fns =
coff_symfile_init, /* sym_init: read initial info, setup for sym_read() */
coff_symfile_read, /* sym_read: read a symbol file into symtab */
coff_symfile_finish, /* sym_finish: finished with file, cleanup */
- coff_symfile_offsets, /* sym_offsets: xlate external to internal form */
+ default_symfile_offsets,
+ /* sym_offsets: xlate external to internal form */
NULL /* next: pointer to next struct sym_fns */
};