aboutsummaryrefslogtreecommitdiff
path: root/gdb/coffread.c
diff options
context:
space:
mode:
authorgdb-3.3 <gdb@fsf.org>1989-09-30 00:00:00 +0000
committerPedro Alves <palves@redhat.com>2012-06-03 15:36:32 +0100
commit4187119d59afd156703cfcbc6be287c5085f1867 (patch)
tree8ea0d77175611df1eeec928858f629d410dd6e05 /gdb/coffread.c
parente91b87a36830d061ef87d67be5f309e4d4ed918f (diff)
downloadgdb-4187119d59afd156703cfcbc6be287c5085f1867.zip
gdb-4187119d59afd156703cfcbc6be287c5085f1867.tar.gz
gdb-4187119d59afd156703cfcbc6be287c5085f1867.tar.bz2
gdb-3.3
Diffstat (limited to 'gdb/coffread.c')
-rw-r--r--gdb/coffread.c124
1 files changed, 91 insertions, 33 deletions
diff --git a/gdb/coffread.c b/gdb/coffread.c
index ae02d6f..46a47a1 100644
--- a/gdb/coffread.c
+++ b/gdb/coffread.c
@@ -4,22 +4,21 @@
Revised 11/27/87 ddj@cs.brown.edu
Copyright (C) 1987, 1988, 1989 Free Software Foundation, Inc.
-GDB is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY. No author or distributor accepts responsibility to anyone
-for the consequences of using it or for whether it serves any
-particular purpose or works at all, unless he says so in writing.
-Refer to the GDB General Public License for full details.
-
-Everyone is granted permission to copy, modify and redistribute GDB,
-but only under the conditions described in the GDB General Public
-License. A copy of this license is supposed to have been given to you
-along with GDB so you can know your rights and responsibilities. It
-should be in a file named COPYING. Among other things, the copyright
-notice and this notice must be preserved on all copies.
-
-In other words, go ahead and share GDB, but don't try to stop
-anyone else from sharing it farther. Help stamp out software hoarding!
-*/
+This file is part of GDB.
+
+GDB is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 1, or (at your option)
+any later version.
+
+GDB is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GDB; see the file COPYING. If not, write to
+the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "defs.h"
#include "param.h"
@@ -37,9 +36,6 @@ anyone else from sharing it farther. Help stamp out software hoarding!
#include <sys/param.h>
#include <sys/file.h>
-/* Avoid problems with A/UX predefine */
-#undef aux
-
static void add_symbol_to_list ();
static void read_coff_symtab ();
static void patch_opaque_types ();
@@ -58,6 +54,7 @@ static char *getsymname ();
static int init_lineno ();
static void enter_linenos ();
+extern int fclose ();
extern void free_all_symtabs ();
extern void free_all_psymtabs ();
@@ -73,6 +70,9 @@ static char *last_source_file;
static CORE_ADDR cur_src_start_addr;
static CORE_ADDR cur_src_end_addr;
+/* Core address of the end of the first object file. */
+static CORE_ADDR first_object_file_end;
+
/* End of the text segment of the executable file,
as found in the symbol _etext. */
@@ -84,10 +84,11 @@ static CORE_ADDR end_of_text_addr;
static FILE *nlist_stream_global;
static int nlist_nsyms_global;
-/* The file and text section headers of the symbol file */
+/* The file, a.out and text section headers of the symbol file */
static FILHDR file_hdr;
static SCNHDR text_hdr;
+static AOUTHDR aout_hdr;
/* The index in the symbol table of the last coff symbol that was processed. */
@@ -172,7 +173,8 @@ struct pending_block
struct pending_block *pending_blocks;
-extern CORE_ADDR first_object_file_end; /* From blockframe.c */
+extern CORE_ADDR startup_file_start; /* From blockframe.c */
+extern CORE_ADDR startup_file_end; /* From blockframe.c */
/* File name symbols were loaded from. */
@@ -423,6 +425,13 @@ complete_symtab (name, start_addr, size)
last_source_file = savestring (name, strlen (name));
cur_src_start_addr = start_addr;
cur_src_end_addr = start_addr + size;
+
+ if (aout_hdr.entry < cur_src_end_addr
+ && aout_hdr.entry >= cur_src_start_addr)
+ {
+ startup_file_start = cur_src_start_addr;
+ startup_file_end = cur_src_end_addr;
+ }
}
/* Finish the symbol definitions for one main source file,
@@ -541,6 +550,7 @@ record_misc_function (name, address)
}
misc_bunch->contents[misc_bunch_index].name = savestring (name, strlen (name));
misc_bunch->contents[misc_bunch_index].address = address;
+ misc_bunch->contents[misc_bunch_index].type = mf_unknown;
misc_bunch_index++;
misc_count++;
}
@@ -691,6 +701,9 @@ symbol_file_command (name)
return;
}
+ name = tilde_expand (name);
+ make_cleanup (free, name);
+
if (symtab_list && !query ("Load new symbol table from \"%s\"? ", name))
error ("Not confirmed.");
@@ -714,6 +727,23 @@ symbol_file_command (name)
if ((num_symbols = read_file_hdr (desc, &file_hdr)) < 0)
error ("File \"%s\" not in executable format.", name);
+ /* If an a.out header is present, read it in. If not (e.g. a .o file)
+ deal with its absence. */
+ if (file_hdr.f_opthdr == 0
+ || read_aout_hdr (desc, &aout_hdr, file_hdr.f_opthdr) < 0)
+ {
+ /* We will not actually be able to run code, since backtraces would
+ fly off the bottom of the stack (there is no way to reliably
+ detect bottom of stack), but that's fine since the kernel won't
+ run something without an a.out header anyway. Passive examination
+ of .o files is one place this might make sense. */
+ /* ~0 will not be in any file. */
+ aout_hdr.entry = ~0;
+ /* set the startup file to be an empty range. */
+ startup_file_start = 0;
+ startup_file_end = 0;
+ }
+
if (num_symbols == 0)
{
free_all_symtabs ();
@@ -844,7 +874,7 @@ read_coff_symtab (desc, nsyms)
int fcn_start_addr;
long fcn_line_ptr;
struct cleanup *old_chain;
- int fclose();
+
newfd = dup (desc);
if (newfd == -1)
@@ -973,7 +1003,11 @@ read_coff_symtab (desc, nsyms)
case C_FCN:
if (strcmp (cs->c_name, ".bf") == 0)
{
+#if 0
+ /* Don't do this; we want all functions to be on the
+ mfl now. */
unrecord_misc_function ();
+#endif
within_function = 1;
@@ -1079,6 +1113,9 @@ read_file_hdr (chan, file_hdr)
switch (file_hdr->f_magic)
{
+#ifdef MC68MAGIC
+ case MC68MAGIC:
+#endif
#ifdef NS32GMAGIC
case NS32GMAGIC:
case NS32SMAGIC:
@@ -1086,15 +1123,17 @@ read_file_hdr (chan, file_hdr)
#ifdef I386MAGIC
case I386MAGIC:
#endif
+#ifdef CLIPPERMAGIC
+ case CLIPPERMAGIC:
+#endif
return file_hdr->f_nsyms;
-
default:
#ifdef BADMAG
if (BADMAG(file_hdr))
- return -1;
+ return -1;
else
- return file_hdr->f_nsyms;
+ return file_hdr->f_nsyms;
#else
return -1;
#endif
@@ -1289,18 +1328,20 @@ enter_linenos (file_offset, first_line, last_line)
register int last_line;
{
register char *rawptr = &linetab[file_offset - linetab_offset];
- register struct lineno *lptr;
+ struct lineno lptr;
/* skip first line entry for each function */
rawptr += LINESZ;
/* line numbers start at one for the first line of the function */
first_line--;
- for (lptr = (struct lineno *)rawptr;
- lptr->l_lnno && lptr->l_lnno <= last_line;
- rawptr += LINESZ, lptr = (struct lineno *)rawptr)
+ /* Bcopy since occaisionally rawptr isn't pointing at long
+ boundaries. */
+ for (bcopy (rawptr, &lptr, LINESZ);
+ lptr.l_lnno && lptr.l_lnno <= last_line;
+ rawptr += LINESZ, bcopy (rawptr, &lptr, LINESZ))
{
- record_line (first_line + lptr->l_lnno, lptr->l_addr.l_paddr);
+ record_line (first_line + lptr.l_lnno, lptr.l_addr.l_paddr);
}
}
@@ -1478,7 +1519,6 @@ process_coff_symbol (cs, aux)
break;
case C_REG:
- case C_REGPARM:
SYMBOL_CLASS (sym) = LOC_REGISTER;
add_symbol_to_list (sym, &local_symbols);
break;
@@ -1489,6 +1529,7 @@ process_coff_symbol (cs, aux)
case C_ARG:
SYMBOL_CLASS (sym) = LOC_ARG;
add_symbol_to_list (sym, &local_symbols);
+#ifndef clipper
/* If PCC says a parameter is a short or a char,
it is really an int. */
if (SYMBOL_TYPE (sym) == builtin_type_char
@@ -1497,8 +1538,24 @@ process_coff_symbol (cs, aux)
else if (SYMBOL_TYPE (sym) == builtin_type_unsigned_char
|| SYMBOL_TYPE (sym) == builtin_type_unsigned_short)
SYMBOL_TYPE (sym) = builtin_type_unsigned_int;
+#endif
break;
+ case C_REGPARM:
+ SYMBOL_CLASS (sym) = LOC_REGPARM;
+ add_symbol_to_list (sym, &local_symbols);
+#ifndef clipper
+ /* If PCC says a parameter is a short or a char,
+ it is really an int. */
+ if (SYMBOL_TYPE (sym) == builtin_type_char
+ || SYMBOL_TYPE (sym) == builtin_type_short)
+ SYMBOL_TYPE (sym) = builtin_type_int;
+ else if (SYMBOL_TYPE (sym) == builtin_type_unsigned_char
+ || SYMBOL_TYPE (sym) == builtin_type_unsigned_short)
+ SYMBOL_TYPE (sym) = builtin_type_unsigned_int;
+#endif
+ break;
+
case C_TPDEF:
SYMBOL_CLASS (sym) = LOC_TYPEDEF;
SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
@@ -1935,13 +1992,14 @@ psymtab_to_symtab ()
}
/* These will stay zero all the time */
-struct partial_symbol *global_psymbols, *static_psymbols;
+struct psymbol_allocation_list global_psymbols, static_psymbols;
_initialize_coff ()
{
symfile = 0;
- static_psymbols = global_psymbols = (struct partial_symbol *) 0;
+ bzero (&global_psymbols, sizeof (global_psymbols));
+ bzero (&static_psymbols, sizeof (static_psymbols));
add_com ("symbol-file", class_files, symbol_file_command,
"Load symbol table (in coff format) from executable file FILE.");