Browse Source

Mostly changes to dbxread.c to preserve stringtab's on a per-objfile

basis, for use in expanding psymtabs to full symtabs.  See ChangeLog
for other details.
gdb-4_18-branch
Fred Fish 35 years ago
parent
commit
3624c87592
  1. 45
      gdb/ChangeLog
  2. 41
      gdb/coffread.c
  3. 249
      gdb/dbxread.c
  4. 9
      gdb/objfiles.c
  5. 248
      gdb/utils.c

45
gdb/ChangeLog

@ -1,3 +1,48 @@
Thu Mar 26 17:01:18 1992 Fred Fish (fnf@cygnus.com)
* coffread.c (coff_symfile_init): Update comment.
* dbxread.c (DBX_SYMFILE_INFO, DBX_TEXT_SECT, DBX_SYMCOUNT,
DBX_STRINGTAB, DBX_STRINGTAB_SIZE, DBX_SYMTAB_OFFSET): Define
macros to access the dbx specific objfile information.
* dbxread.c (symfile_string_table, symfile_string_table_size):
Remove these local variables.
* dbxread.c (read_ofile_symtab, psymtab_to_symtab_1,
read_dbx_symtab): Remove the stringtab and stringtab_size params
from the function prototypes, the function definition, and the
function calls. These are now available via DBX_STRINGTAB and
DBX_STRINGTAB_SIZE using the objfile pointer.
* dbxread.c (dbx_symfile_read): Relocate addr before using as
an arg to read_dbx_symtab.
* dbxread.c (dbx_symfile_read): Remove code that free'd the
stringtab and the dbx specific per-objfile private info.
* dbxread.c (init_psymbol_list): Remove symbol count from passed
args in prototype, function definition, and function calls. It is
now available via the DBX_SYMCOUNT macro using the objfile
pointer.
* dbxread.c (dbx_symfile_read, dbx_symfile_init): Remove the
local instance of struct dbx_symfile_info and replace with DBX_*
macros.
* dbxread.c (dbx_symfile_read): Remove init's of now deleted
symfile_string_table and symfile_string_table_size.
* dbxread.c (dbx_symfile_finish): Remove now obsolete free of
symfile_string_table.
* dbxread.c (init_psymbol_list): Use DBX_SYMCOUNT.
* dbxread.c (dbx_psymtab_to_symtab): Remove local stringtab and
stringtab size variables. Remove all code that used to reread
the stringtab.
* objfiles.c (allocate_objfile): Move calls to init_malloc()
to prior to any calls to mmalloc for the objfile specific heap.
* utils.c (init_malloc): Document the requirement that for each
heap for which corruption checking is desired, that init_mmalloc
must be called prior to any mmalloc calls on the heap.
Thu Mar 26 13:20:06 1992 Per Bothner (bothner@cygnus.com)
* rs6000-pinsn.c: Make dis-assembly output more like
other targets: Don't print instruction in hex before
the assembly; use print_address to print out jump
destinations.
Wed Mar 25 16:52:35 1992 Per Bothner (bothner@cygnus.com) Wed Mar 25 16:52:35 1992 Per Bothner (bothner@cygnus.com)
* c-exp.y, gdbtypes.h: Add builtin_type_signed_char. * c-exp.y, gdbtypes.h: Add builtin_type_signed_char.

41
gdb/coffread.c

@ -24,6 +24,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "breakpoint.h" #include "breakpoint.h"
#include "bfd.h" #include "bfd.h"
#include "symfile.h" #include "symfile.h"
#include "objfiles.h"
#include "buildsym.h" #include "buildsym.h"
#include <obstack.h> #include <obstack.h>
@ -162,9 +163,6 @@ struct type *in_function_type;
struct pending_block *pending_blocks; struct pending_block *pending_blocks;
extern CORE_ADDR startup_file_start; /* From blockframe.c */
extern CORE_ADDR startup_file_end; /* From blockframe.c */
/* Complaints about various problems in the file being read */ /* Complaints about various problems in the file being read */
struct complaint ef_complaint = struct complaint ef_complaint =
@ -547,11 +545,11 @@ complete_symtab (name, start_addr, size)
cur_src_start_addr = start_addr; cur_src_start_addr = start_addr;
cur_src_end_addr = start_addr + size; cur_src_end_addr = start_addr + size;
if (entry_point < cur_src_end_addr if (current_objfile -> ei.entry_point >= cur_src_start_addr &&
&& entry_point >= cur_src_start_addr) current_objfile -> ei.entry_point < cur_src_end_addr)
{ {
startup_file_start = cur_src_start_addr; current_objfile -> ei.entry_file_lowpc = cur_src_start_addr;
startup_file_end = cur_src_end_addr; current_objfile -> ei.entry_file_highpc = cur_src_end_addr;
} }
} }
@ -639,7 +637,7 @@ record_minimal_symbol (name, address)
/* coff_symfile_init () /* coff_symfile_init ()
is the coff-specific initialization routine for reading symbols. is the coff-specific initialization routine for reading symbols.
It is passed a struct sym_fns which contains, among other things, It is passed a struct objfile which contains, among other things,
the BFD for the file whose symbols are being read, and a slot for the BFD for the file whose symbols are being read, and a slot for
a pointer to "private data" which we fill with cookies and other a pointer to "private data" which we fill with cookies and other
treats for coff_symfile_read (). treats for coff_symfile_read ().
@ -668,28 +666,13 @@ coff_symfile_init (objfile)
objfile -> sym_private = xmmalloc (objfile -> md, objfile -> sym_private = xmmalloc (objfile -> md,
sizeof (struct coff_symfile_info)); sizeof (struct coff_symfile_info));
/* Save startup file's range of PC addresses to help blockframe.c init_entry_point_info (objfile);
decide where the bottom of the stack is. */
if (bfd_get_file_flags (abfd) & EXEC_P) /* Save the section number for the text section */
{ if (section = bfd_get_section_by_name(abfd,".text"))
/* Executable file -- record its entry point so we'll recognize text_bfd_scnum = section->index;
the startup file because it contains the entry point. */
entry_point = bfd_get_start_address (abfd);
}
else else
{ text_bfd_scnum = -1;
/* Examination of non-executable.o files. Short-circuit this stuff. */
/* ~0 will not be in any file, we hope. */
entry_point = ~0;
/* set the startup file to be an empty range. */
startup_file_start = 0;
startup_file_end = 0;
}
/* Save the section number for the text section */
if (section = bfd_get_section_by_name(abfd,".text"))
text_bfd_scnum = section->index;
else
text_bfd_scnum = -1;
} }
/* This function is called for every section; it finds the outer limits /* This function is called for every section; it finds the outer limits

249
gdb/dbxread.c

@ -55,6 +55,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "gdbcore.h" /* for bfd stuff */ #include "gdbcore.h" /* for bfd stuff */
#include "libaout.h" /* FIXME Secret internal BFD stuff for a.out */ #include "libaout.h" /* FIXME Secret internal BFD stuff for a.out */
#include "symfile.h" #include "symfile.h"
#include "objfiles.h"
#include "buildsym.h" #include "buildsym.h"
#include "aout/aout64.h" #include "aout/aout64.h"
@ -62,7 +63,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
/* Information is passed among various dbxread routines for accessing /* Information is passed among various dbxread routines for accessing
symbol files. A pointer to this structure is kept in the sym_private symbol files. A pointer to this structure is kept in the sym_private
field of the objfile struct passed in by symfile.h. */ field of the objfile struct. */
struct dbx_symfile_info { struct dbx_symfile_info {
asection *text_sect; /* Text section accessor */ asection *text_sect; /* Text section accessor */
@ -72,6 +73,12 @@ struct dbx_symfile_info {
off_t symtab_offset; /* Offset in file to symbol table */ off_t symtab_offset; /* Offset in file to symbol table */
}; };
#define DBX_SYMFILE_INFO(o) ((struct dbx_symfile_info *)((o)->sym_private))
#define DBX_TEXT_SECT(o) (DBX_SYMFILE_INFO(o)->text_sect)
#define DBX_SYMCOUNT(o) (DBX_SYMFILE_INFO(o)->symcount)
#define DBX_STRINGTAB(o) (DBX_SYMFILE_INFO(o)->stringtab)
#define DBX_STRINGTAB_SIZE(o) (DBX_SYMFILE_INFO(o)->stringtab_size)
#define DBX_SYMTAB_OFFSET(o) (DBX_SYMFILE_INFO(o)->symtab_offset)
/* Each partial symbol table entry contains a pointer to private data for the /* Each partial symbol table entry contains a pointer to private data for the
read_symtab() function to use when expanding a partial symbol table entry read_symtab() function to use when expanding a partial symbol table entry
@ -129,13 +136,6 @@ static bfd *symfile_bfd;
static struct objfile *our_objfile; static struct objfile *our_objfile;
/* String table for the main symbol file. It is kept in memory
permanently, to speed up symbol reading. Other files' symbol tables
are read in on demand. FIXME, this should be cleaner. */
static char *symfile_string_table;
static int symfile_string_table_size;
/* The size of each symbol in the symbol file (in external form). /* The size of each symbol in the symbol file (in external form).
This is set by dbx_symfile_read when building psymtabs, and by This is set by dbx_symfile_read when building psymtabs, and by
dbx_psymtab_to_symtab when building symtabs. */ dbx_psymtab_to_symtab when building symtabs. */
@ -191,18 +191,16 @@ static struct pending *
copy_pending PARAMS ((struct pending *, int, struct pending *)); copy_pending PARAMS ((struct pending *, int, struct pending *));
static struct symtab * static struct symtab *
read_ofile_symtab PARAMS ((struct objfile *, char *, unsigned int, int, int, read_ofile_symtab PARAMS ((struct objfile *, int, int, CORE_ADDR, int, int));
CORE_ADDR, int, int));
static void static void
dbx_psymtab_to_symtab PARAMS ((struct partial_symtab *)); dbx_psymtab_to_symtab PARAMS ((struct partial_symtab *));
static void static void
psymtab_to_symtab_1 PARAMS ((struct partial_symtab *, char *, int, int)); psymtab_to_symtab_1 PARAMS ((struct partial_symtab *, int));
static void static void
read_dbx_symtab PARAMS ((CORE_ADDR, struct objfile *, char *, long, int, read_dbx_symtab PARAMS ((CORE_ADDR, struct objfile *, CORE_ADDR, int));
CORE_ADDR, int));
static void static void
free_bincl_list PARAMS ((struct objfile *)); free_bincl_list PARAMS ((struct objfile *));
@ -217,7 +215,7 @@ static void
init_bincl_list PARAMS ((int, struct objfile *)); init_bincl_list PARAMS ((int, struct objfile *));
static void static void
init_psymbol_list PARAMS ((int, struct objfile *)); init_psymbol_list PARAMS ((struct objfile *));
static char * static char *
dbx_next_symbol_text PARAMS ((void)); dbx_next_symbol_text PARAMS ((void));
@ -417,8 +415,8 @@ record_minimal_symbol (name, address, type, objfile)
/* Scan and build partial symbols for a symbol file. /* Scan and build partial symbols for a symbol file.
We have been initialized by a call to dbx_symfile_init, which We have been initialized by a call to dbx_symfile_init, which
put all the relevant info into a "struct dbx_symfile_info" put all the relevant info into a "struct dbx_symfile_info",
hung off the struct sym_fns SF. hung off the objfile structure.
ADDR is the address relative to which the symbols in it are (e.g. ADDR is the address relative to which the symbols in it are (e.g.
the base address of the text segment). the base address of the text segment).
@ -431,26 +429,17 @@ dbx_symfile_read (objfile, addr, mainline)
CORE_ADDR addr; CORE_ADDR addr;
int mainline; /* FIXME comments above */ int mainline; /* FIXME comments above */
{ {
struct dbx_symfile_info *info;
bfd *sym_bfd; bfd *sym_bfd;
int val; int val;
sym_bfd = objfile->obfd; sym_bfd = objfile->obfd;
info = (struct dbx_symfile_info *) (objfile -> sym_private); val = bfd_seek (objfile->obfd, DBX_SYMTAB_OFFSET (objfile), L_SET);
val = bfd_seek (objfile->obfd, info->symtab_offset, L_SET);
if (val < 0) if (val < 0)
perror_with_name (objfile->name); perror_with_name (objfile->name);
/* If mainline, set global string table pointers, and reinitialize global
partial symbol list. */
if (mainline) {
symfile_string_table = info->stringtab;
symfile_string_table_size = info->stringtab_size;
}
/* If we are reinitializing, or if we have never loaded syms yet, init */ /* If we are reinitializing, or if we have never loaded syms yet, init */
if (mainline || objfile->global_psymbols.size == 0 || objfile->static_psymbols.size == 0) if (mainline || objfile->global_psymbols.size == 0 || objfile->static_psymbols.size == 0)
init_psymbol_list (info->symcount, objfile); init_psymbol_list (objfile);
/* FIXME POKING INSIDE BFD DATA STRUCTURES */ /* FIXME POKING INSIDE BFD DATA STRUCTURES */
symbol_size = obj_symbol_entry_size (sym_bfd); symbol_size = obj_symbol_entry_size (sym_bfd);
@ -464,25 +453,16 @@ dbx_symfile_read (objfile, addr, mainline)
/* Now that the symbol table data of the executable file are all in core, /* Now that the symbol table data of the executable file are all in core,
process them and define symbols accordingly. */ process them and define symbols accordingly. */
read_dbx_symtab (addr - bfd_section_vma (sym_bfd, info->text_sect), /*offset*/ addr -= bfd_section_vma (sym_bfd, DBX_TEXT_SECT (objfile)); /*offset*/
objfile, info->stringtab, info->stringtab_size, read_dbx_symtab (addr, objfile,
info->symcount, bfd_section_vma (sym_bfd, DBX_TEXT_SECT (objfile)),
bfd_section_vma (sym_bfd, info->text_sect), bfd_section_size (sym_bfd, DBX_TEXT_SECT (objfile)));
bfd_section_size (sym_bfd, info->text_sect));
/* Install any minimal symbols that have been collected as the current /* Install any minimal symbols that have been collected as the current
minimal symbols for this objfile. */ minimal symbols for this objfile. */
install_minimal_symbols (objfile); install_minimal_symbols (objfile);
/* Free up any memory we allocated for ourselves. */
if (!mainline) {
mfree (objfile->md, info->stringtab); /* Stringtab is only saved for mainline */
}
mfree (objfile->md, info);
/* Zap pointer to our (now gone) info struct */
objfile -> sym_private = NULL;
if (!have_partial_symbols ()) { if (!have_partial_symbols ()) {
wrap_here (""); wrap_here ("");
printf_filtered ("(no debugging symbols found)..."); printf_filtered ("(no debugging symbols found)...");
@ -523,56 +503,64 @@ dbx_symfile_init (objfile)
int val; int val;
bfd *sym_bfd = objfile->obfd; bfd *sym_bfd = objfile->obfd;
char *name = bfd_get_filename (sym_bfd); char *name = bfd_get_filename (sym_bfd);
struct dbx_symfile_info *info;
unsigned char size_temp[4]; unsigned char size_temp[4];
/* Allocate struct to keep track of the symfile */ /* Allocate struct to keep track of the symfile */
objfile-> sym_private = xmmalloc (objfile -> md, sizeof (*info)); DBX_SYMFILE_INFO (objfile) = (struct dbx_symfile_info *)
info = (struct dbx_symfile_info *) objfile -> sym_private; xmmalloc (objfile -> md, sizeof (struct dbx_symfile_info));
/* FIXME POKING INSIDE BFD DATA STRUCTURES */ /* FIXME POKING INSIDE BFD DATA STRUCTURES */
#define STRING_TABLE_OFFSET (sym_bfd->origin + obj_str_filepos (sym_bfd)) #define STRING_TABLE_OFFSET (sym_bfd->origin + obj_str_filepos (sym_bfd))
#define SYMBOL_TABLE_OFFSET (sym_bfd->origin + obj_sym_filepos (sym_bfd)) #define SYMBOL_TABLE_OFFSET (sym_bfd->origin + obj_sym_filepos (sym_bfd))
/* FIXME POKING INSIDE BFD DATA STRUCTURES */ /* FIXME POKING INSIDE BFD DATA STRUCTURES */
info->text_sect = bfd_get_section_by_name (sym_bfd, ".text"); DBX_TEXT_SECT (objfile) = bfd_get_section_by_name (sym_bfd, ".text");
if (!info->text_sect) if (!DBX_TEXT_SECT (objfile))
abort(); abort();
info->symcount = bfd_get_symcount (sym_bfd); DBX_SYMCOUNT (objfile) = bfd_get_symcount (sym_bfd);
/* Read the string table and stash it away in the psymbol_obstack. It is
only needed as long as we need to expand psymbols into full symbols,
so when we blow away the psymbol the string table goes away as well.
Note that gdb used to use the results of attempting to malloc the
string table, based on the size it read, as a form of sanity check
for botched byte swapping, on the theory that a byte swapped string
table size would be so totally bogus that the malloc would fail. Now
that we put in on the psymbol_obstack, we can't do this since gdb gets
a fatal error (out of virtual memory) if the size is bogus. We can
however at least check to see if the size is zero or some negative
value. */
/* Read the string table size and check it for bogosity. */
val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, L_SET); val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, L_SET);
if (val < 0) if (val < 0)
perror_with_name (name); perror_with_name (name);
val = bfd_read (size_temp, sizeof (long), 1, sym_bfd); val = bfd_read (size_temp, sizeof (long), 1, sym_bfd);
if (val < 0) if (val < 0)
perror_with_name (name); perror_with_name (name);
info->stringtab_size = bfd_h_get_32 (sym_bfd, size_temp);
DBX_STRINGTAB_SIZE (objfile) = bfd_h_get_32 (sym_bfd, size_temp);
if (info->stringtab_size >= 0) if (DBX_STRINGTAB_SIZE (objfile) <= 0)
{ error ("ridiculous string table size (%d bytes).",
/* Yes, this should be malloc, not xmalloc. We check its result. */ DBX_STRINGTAB_SIZE (objfile));
info->stringtab = (char *) mmalloc (objfile->md, info->stringtab_size);
/* Caller is responsible for freeing the string table. No cleanup. */ DBX_STRINGTAB (objfile) =
} (char *) obstack_alloc (&objfile -> psymbol_obstack,
else DBX_STRINGTAB_SIZE (objfile));
info->stringtab = NULL;
if (info->stringtab == NULL && info->stringtab_size != 0)
error ("ridiculous string table size: %d bytes", info->stringtab_size);
/* Now read in the string table in one big gulp. */ /* Now read in the string table in one big gulp. */
val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, L_SET); val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, L_SET);
if (val < 0) if (val < 0)
perror_with_name (name); perror_with_name (name);
val = bfd_read (info->stringtab, info->stringtab_size, 1, sym_bfd); val = bfd_read (DBX_STRINGTAB (objfile), DBX_STRINGTAB_SIZE (objfile), 1,
if (val != info->stringtab_size) sym_bfd);
if (val != DBX_STRINGTAB_SIZE (objfile))
perror_with_name (name); perror_with_name (name);
/* Record the position of the symbol table for later use. */ /* Record the position of the symbol table for later use. */
info->symtab_offset = SYMBOL_TABLE_OFFSET; DBX_SYMTAB_OFFSET (objfile) = SYMBOL_TABLE_OFFSET;
} }
/* Perform any local cleanups required when we are done with a particular /* Perform any local cleanups required when we are done with a particular
@ -584,15 +572,9 @@ static void
dbx_symfile_finish (objfile) dbx_symfile_finish (objfile)
struct objfile *objfile; struct objfile *objfile;
{ {
if (objfile -> sym_private != NULL) if (DBX_SYMFILE_INFO (objfile) != NULL)
{
mfree (objfile -> md, objfile -> sym_private);
}
if (symfile_string_table)
{ {
free (symfile_string_table); mfree (objfile -> md, DBX_SYMFILE_INFO (objfile));
symfile_string_table = 0;
symfile_string_table_size = 0;
} }
free_header_files (); free_header_files ();
} }
@ -662,8 +644,7 @@ dbx_next_symbol_text ()
created by read_dbx_symtab and subsidiaries. */ created by read_dbx_symtab and subsidiaries. */
static void static void
init_psymbol_list (total_symbols, objfile) init_psymbol_list (objfile)
int total_symbols;
struct objfile *objfile; struct objfile *objfile;
{ {
/* Free any previously allocated psymbol lists. */ /* Free any previously allocated psymbol lists. */
@ -675,8 +656,8 @@ init_psymbol_list (total_symbols, objfile)
/* Current best guess is that there are approximately a twentieth /* Current best guess is that there are approximately a twentieth
of the total symbols (in a debugging file) are global or static of the total symbols (in a debugging file) are global or static
oriented symbols */ oriented symbols */
objfile -> global_psymbols.size = total_symbols / 10; objfile -> global_psymbols.size = DBX_SYMCOUNT (objfile) / 10;
objfile -> static_psymbols.size = total_symbols / 10; objfile -> static_psymbols.size = DBX_SYMCOUNT (objfile) / 10;
objfile -> global_psymbols.next = objfile -> global_psymbols.list = (struct partial_symbol *) objfile -> global_psymbols.next = objfile -> global_psymbols.list = (struct partial_symbol *)
xmmalloc (objfile -> md, objfile -> global_psymbols.size * sizeof (struct partial_symbol)); xmmalloc (objfile -> md, objfile -> global_psymbols.size * sizeof (struct partial_symbol));
objfile -> static_psymbols.next = objfile -> static_psymbols.list = (struct partial_symbol *) objfile -> static_psymbols.next = objfile -> static_psymbols.list = (struct partial_symbol *)
@ -749,20 +730,14 @@ free_bincl_list (objfile)
/* Given pointers to an a.out symbol table in core containing dbx /* Given pointers to an a.out symbol table in core containing dbx
style data, setup partial_symtab's describing each source file for style data, setup partial_symtab's describing each source file for
which debugging information is available. NLISTLEN is the number which debugging information is available.
of symbols in the symbol table. All symbol names are given as SYMFILE_NAME is the name of the file we are reading from
offsets relative to STRINGTAB. STRINGTAB_SIZE is the size of
STRINGTAB. SYMFILE_NAME is the name of the file we are reading from
and ADDR is its relocated address (if incremental) or 0 (if not). */ and ADDR is its relocated address (if incremental) or 0 (if not). */
static void static void
read_dbx_symtab (addr, objfile, stringtab, stringtab_size, nlistlen, read_dbx_symtab (addr, objfile, text_addr, text_size)
text_addr, text_size)
CORE_ADDR addr; CORE_ADDR addr;
struct objfile *objfile; struct objfile *objfile;
register char *stringtab;
register long stringtab_size;
register int nlistlen;
CORE_ADDR text_addr; CORE_ADDR text_addr;
int text_size; int text_size;
{ {
@ -789,7 +764,7 @@ read_dbx_symtab (addr, objfile, stringtab, stringtab_size, nlistlen,
struct partial_symtab **dependency_list; struct partial_symtab **dependency_list;
int dependencies_used, dependencies_allocated; int dependencies_used, dependencies_allocated;
stringtab_global = stringtab; stringtab_global = DBX_STRINGTAB (objfile);
pst = (struct partial_symtab *) 0; pst = (struct partial_symtab *) 0;
@ -823,7 +798,7 @@ read_dbx_symtab (addr, objfile, stringtab, stringtab_size, nlistlen,
symbuf_end = symbuf_idx = 0; symbuf_end = symbuf_idx = 0;
next_symbol_text_func = dbx_next_symbol_text; next_symbol_text_func = dbx_next_symbol_text;
for (symnum = 0; symnum < nlistlen; symnum++) for (symnum = 0; symnum < DBX_SYMCOUNT (objfile); symnum++)
{ {
/* Get the symbol for this run and pull out some info */ /* Get the symbol for this run and pull out some info */
QUIT; /* allow this to be interruptable */ QUIT; /* allow this to be interruptable */
@ -854,11 +829,11 @@ read_dbx_symtab (addr, objfile, stringtab, stringtab_size, nlistlen,
give a fake name, and print a single error message per symbol file read, give a fake name, and print a single error message per symbol file read,
rather than abort the symbol reading or flood the user with messages. */ rather than abort the symbol reading or flood the user with messages. */
#define SET_NAMESTRING()\ #define SET_NAMESTRING()\
if (((unsigned)bufp->n_strx) >= stringtab_size) { \ if (((unsigned)bufp->n_strx) >= DBX_STRINGTAB_SIZE (objfile)) { \
complain (&string_table_offset_complaint, (char *) symnum); \ complain (&string_table_offset_complaint, (char *) symnum); \
namestring = "foo"; \ namestring = "foo"; \
} else \ } else \
namestring = bufp->n_strx + stringtab namestring = bufp->n_strx + DBX_STRINGTAB (objfile)
#define CUR_SYMBOL_TYPE bufp->n_type #define CUR_SYMBOL_TYPE bufp->n_type
#define CUR_SYMBOL_VALUE bufp->n_value #define CUR_SYMBOL_VALUE bufp->n_value
@ -872,12 +847,12 @@ read_dbx_symtab (addr, objfile, stringtab, stringtab_size, nlistlen,
} }
/* If there's stuff to be cleaned up, clean it up. */ /* If there's stuff to be cleaned up, clean it up. */
if (nlistlen > 0 /* We have some syms */ if (DBX_SYMCOUNT (objfile) > 0 /* We have some syms */
&& entry_point < bufp->n_value && objfile -> ei.entry_point < bufp->n_value
&& entry_point >= last_o_file_start) && objfile -> ei.entry_point >= last_o_file_start)
{ {
startup_file_start = last_o_file_start; objfile -> ei.entry_file_lowpc = last_o_file_start;
startup_file_end = bufp->n_value; objfile -> ei.entry_file_highpc = bufp->n_value;
} }
if (pst) if (pst)
@ -1034,10 +1009,8 @@ end_psymtab (pst, include_list, num_includes, capping_symbol_offset,
} }
static void static void
psymtab_to_symtab_1 (pst, stringtab, stringtab_size, sym_offset) psymtab_to_symtab_1 (pst, sym_offset)
struct partial_symtab *pst; struct partial_symtab *pst;
char *stringtab;
int stringtab_size;
int sym_offset; int sym_offset;
{ {
struct cleanup *old_chain; struct cleanup *old_chain;
@ -1068,8 +1041,7 @@ psymtab_to_symtab_1 (pst, stringtab, stringtab_size, sym_offset)
wrap_here (""); /* Flush output */ wrap_here (""); /* Flush output */
fflush (stdout); fflush (stdout);
} }
psymtab_to_symtab_1 (pst->dependencies[i], psymtab_to_symtab_1 (pst->dependencies[i], sym_offset);
stringtab, stringtab_size, sym_offset);
} }
if (LDSYMLEN(pst)) /* Otherwise it's a dummy */ if (LDSYMLEN(pst)) /* Otherwise it's a dummy */
@ -1081,10 +1053,9 @@ psymtab_to_symtab_1 (pst, stringtab, stringtab_size, sym_offset)
/* Read in this files symbols */ /* Read in this files symbols */
bfd_seek (pst->objfile->obfd, sym_offset, L_SET); bfd_seek (pst->objfile->obfd, sym_offset, L_SET);
pst->symtab = pst->symtab =
read_ofile_symtab (pst->objfile, stringtab, stringtab_size, read_ofile_symtab (pst->objfile, LDSYMOFF(pst), LDSYMLEN(pst),
LDSYMOFF(pst), pst->textlow, pst->texthigh - pst->textlow,
LDSYMLEN(pst), pst->textlow, pst->addr);
pst->texthigh - pst->textlow, pst->addr);
sort_symtab_syms (pst->symtab); sort_symtab_syms (pst->symtab);
do_cleanups (old_chain); do_cleanups (old_chain);
@ -1101,8 +1072,7 @@ static void
dbx_psymtab_to_symtab (pst) dbx_psymtab_to_symtab (pst)
struct partial_symtab *pst; struct partial_symtab *pst;
{ {
char *stringtab; int val;
int stsize, val;
bfd *sym_bfd; bfd *sym_bfd;
long st_temp; long st_temp;
@ -1128,58 +1098,6 @@ dbx_psymtab_to_symtab (pst)
sym_bfd = pst->objfile->obfd; sym_bfd = pst->objfile->obfd;
/* We keep the string table for the main symfile resident in memory, but
not the string table for any other symbol files. */
if (symfile_objfile != pst->objfile)
{
/* Read in the string table */
/* FIXME, this uses internal BFD variables. See above in
dbx_symbol_file_open where the macro is defined! */
bfd_seek (sym_bfd, STRING_TABLE_OFFSET, L_SET);
val = bfd_read (&st_temp, sizeof st_temp, 1, sym_bfd);
if (val < 0)
perror_with_name (pst->objfile->name);
stsize = bfd_h_get_32 (sym_bfd, (unsigned char *)&st_temp);
#if 0
/* BFD doesn't provide a way to know the total file size, sigh */
struct stat statbuf;
if (fstat (desc, &statbuf) < 0)
perror_with_name (pst->objfile->name);
if (stsize >= 0 && stsize < statbuf.st_size)
#else
if (stsize >= 0)
#endif
{
#ifdef BROKEN_LARGE_ALLOCA
stringtab = (char *) xmalloc (stsize);
make_cleanup (free, stringtab);
#else
stringtab = (char *) alloca (stsize);
#endif
}
else
stringtab = NULL;
if (stringtab == NULL && stsize != 0)
error ("ridiculous string table size: %d bytes", stsize);
/* FIXME, this uses internal BFD variables. See above in
dbx_symbol_file_open where the macro is defined! */
val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, L_SET);
if (val < 0)
perror_with_name (pst->objfile->name);
val = bfd_read (stringtab, stsize, 1, sym_bfd);
if (val < 0)
perror_with_name (pst->objfile->name);
}
else
{
stringtab = symfile_string_table;
stsize = symfile_string_table_size;
}
/* FIXME POKING INSIDE BFD DATA STRUCTURES */ /* FIXME POKING INSIDE BFD DATA STRUCTURES */
symbol_size = obj_symbol_entry_size (sym_bfd); symbol_size = obj_symbol_entry_size (sym_bfd);
@ -1187,8 +1105,7 @@ dbx_psymtab_to_symtab (pst)
/* FIXME, this uses internal BFD variables. See above in /* FIXME, this uses internal BFD variables. See above in
dbx_symbol_file_open where the macro is defined! */ dbx_symbol_file_open where the macro is defined! */
psymtab_to_symtab_1 (pst, stringtab, stsize, psymtab_to_symtab_1 (pst, SYMBOL_TABLE_OFFSET);
SYMBOL_TABLE_OFFSET);
/* Match with global symbols. This only needs to be done once, /* Match with global symbols. This only needs to be done once,
after all of the symtabs and dependencies have been read in. */ after all of the symtabs and dependencies have been read in. */
@ -1205,22 +1122,18 @@ dbx_psymtab_to_symtab (pst)
* *
* DESC is the file descriptor for the file, positioned at the * DESC is the file descriptor for the file, positioned at the
* beginning of the symtab * beginning of the symtab
* STRINGTAB is a pointer to the files string
* table, already read in
* SYM_OFFSET is the offset within the file of * SYM_OFFSET is the offset within the file of
* the beginning of the symbols we want to read, NUM_SUMBOLS is the * the beginning of the symbols we want to read
* number of symbols to read * SYM_SIZE is the size of the symbol info to read in.
* TEXT_OFFSET is the beginning of the text segment we are reading symbols for * TEXT_OFFSET is the beginning of the text segment we are reading symbols for
* TEXT_SIZE is the size of the text segment read in. * TEXT_SIZE is the size of the text segment read in.
* OFFSET is a relocation offset which gets added to each symbol * OFFSET is a relocation offset which gets added to each symbol
*/ */
static struct symtab * static struct symtab *
read_ofile_symtab (objfile, stringtab, stringtab_size, sym_offset, read_ofile_symtab (objfile, sym_offset, sym_size, text_offset, text_size,
sym_size, text_offset, text_size, offset) offset)
struct objfile *objfile; struct objfile *objfile;
register char *stringtab;
unsigned int stringtab_size;
int sym_offset; int sym_offset;
int sym_size; int sym_size;
CORE_ADDR text_offset; CORE_ADDR text_offset;
@ -1236,7 +1149,7 @@ read_ofile_symtab (objfile, stringtab, stringtab_size, sym_offset,
current_objfile = objfile; current_objfile = objfile;
subfile_stack = 0; subfile_stack = 0;
stringtab_global = stringtab; stringtab_global = DBX_STRINGTAB (objfile);
last_source_file = 0; last_source_file = 0;
abfd = objfile->obfd; abfd = objfile->obfd;

9
gdb/objfiles.c

@ -88,6 +88,8 @@ allocate_objfile (abfd, mapped)
} }
else if ((objfile = (struct objfile *) mmalloc_getkey (md, 0)) != NULL) else if ((objfile = (struct objfile *) mmalloc_getkey (md, 0)) != NULL)
{ {
/* Update memory corruption handler function addresses. */
init_malloc (md);
objfile -> md = md; objfile -> md = md;
/* Update pointers to functions to *our* copies */ /* Update pointers to functions to *our* copies */
obstack_chunkfun (&objfile -> psymbol_obstack, xmmalloc); obstack_chunkfun (&objfile -> psymbol_obstack, xmmalloc);
@ -96,11 +98,12 @@ allocate_objfile (abfd, mapped)
obstack_freefun (&objfile -> symbol_obstack, mfree); obstack_freefun (&objfile -> symbol_obstack, mfree);
obstack_chunkfun (&objfile -> type_obstack, xmmalloc); obstack_chunkfun (&objfile -> type_obstack, xmmalloc);
obstack_freefun (&objfile -> type_obstack, mfree); obstack_freefun (&objfile -> type_obstack, mfree);
/* Update memory corruption handler function addresses */
init_malloc (objfile -> md);
} }
else else
{ {
/* Set up to detect internal memory corruption. MUST be done before
the first malloc. See comments in init_malloc() and mmcheck(). */
init_malloc (md);
objfile = (struct objfile *) xmmalloc (md, sizeof (struct objfile)); objfile = (struct objfile *) xmmalloc (md, sizeof (struct objfile));
(void) memset (objfile, 0, sizeof (struct objfile)); (void) memset (objfile, 0, sizeof (struct objfile));
objfile -> md = md; objfile -> md = md;
@ -115,8 +118,6 @@ allocate_objfile (abfd, mapped)
obstack_full_begin (&objfile -> type_obstack, 0, 0, obstack_full_begin (&objfile -> type_obstack, 0, 0,
xmmalloc, mfree, objfile -> md, xmmalloc, mfree, objfile -> md,
OBSTACK_MMALLOC_LIKE); OBSTACK_MMALLOC_LIKE);
/* Set up to detect internal memory corruption */
init_malloc (objfile -> md);
} }
} }

248
gdb/utils.c

@ -35,8 +35,10 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
/* Prototypes for local functions */ /* Prototypes for local functions */
#if !defined (NO_MALLOC_CHECK) #if !defined (NO_MALLOC_CHECK)
static void static void
malloc_botch PARAMS ((void)); malloc_botch PARAMS ((void));
#endif /* NO_MALLOC_CHECK */ #endif /* NO_MALLOC_CHECK */
static void static void
@ -91,7 +93,7 @@ int sevenbit_strings = 0;
/* String to be printed before error messages, if any. */ /* String to be printed before error messages, if any. */
char *error_pre_print; char *error_pre_print;
char *warning_pre_print; char *warning_pre_print = "\nwarning: ";
/* Add a new cleanup to the cleanup_chain, /* Add a new cleanup to the cleanup_chain,
and return the previous chain pointer and return the previous chain pointer
@ -274,7 +276,7 @@ fatal (va_alist)
va_start (args); va_start (args);
string = va_arg (args, char *); string = va_arg (args, char *);
fprintf (stderr, "gdb: "); fprintf (stderr, "\ngdb: ");
vfprintf (stderr, string, args); vfprintf (stderr, string, args);
fprintf (stderr, "\n"); fprintf (stderr, "\n");
va_end (args); va_end (args);
@ -296,7 +298,7 @@ fatal_dump_core (va_alist)
string = va_arg (args, char *); string = va_arg (args, char *);
/* "internal error" is always correct, since GDB should never dump /* "internal error" is always correct, since GDB should never dump
core, no matter what the input. */ core, no matter what the input. */
fprintf (stderr, "gdb internal error: "); fprintf (stderr, "\ngdb internal error: ");
vfprintf (stderr, string, args); vfprintf (stderr, string, args);
fprintf (stderr, "\n"); fprintf (stderr, "\n");
va_end (args); va_end (args);
@ -307,62 +309,6 @@ fatal_dump_core (va_alist)
exit (1); exit (1);
} }
/* Memory management stuff (malloc friends). */
#if defined (NO_MALLOC_CHECK)
void
init_malloc ()
{}
#else /* Have mcheck(). */
static void
malloc_botch ()
{
fatal_dump_core ("Memory corruption");
}
void
init_malloc ()
{
extern PTR (*__morecore) PARAMS ((long));
mcheck (malloc_botch);
mtrace ();
}
#endif /* Have mcheck(). */
/* Like malloc but get error if no storage available. */
PTR
xmalloc (size)
long size;
{
register char *val;
/* Protect against gdb wanting to allocate zero bytes. */
if (size == 0)
return NULL;
val = (char *) malloc (size);
if (!val)
fatal ("virtual memory exhausted.", 0);
return val;
}
/* Like realloc but get error if no storage available. */
PTR
xrealloc (ptr, size)
char *ptr;
long size;
{
register char *val =
ptr ? (char *) realloc (ptr, size) : (char*) malloc (size);
if (!val)
fatal ("virtual memory exhausted.", 0);
return val;
}
/* Print the system error message for errno, and also mention STRING /* Print the system error message for errno, and also mention STRING
as the file name for which the error was encountered. as the file name for which the error was encountered.
Then return to command level. */ Then return to command level. */
@ -456,6 +402,168 @@ request_quit (signo)
if (immediate_quit) if (immediate_quit)
quit (); quit ();
} }
/* Memory management stuff (malloc friends). */
#if defined (NO_MMALLOC)
PTR
mmalloc (md, size)
PTR md;
long size;
{
return (malloc (size));
}
PTR
mrealloc (md, ptr, size)
PTR md;
PTR ptr;
long size;
{
return (realloc (ptr, size));
}
void
mfree (md, ptr)
PTR md;
PTR ptr;
{
free (ptr);
}
#endif /* NO_MMALLOC */
#if defined (NO_MMALLOC) || defined (NO_MMALLOC_CHECK)
void
init_malloc (md)
PTR md;
{
}
#else /* have mmalloc and want corruption checking */
static void
malloc_botch ()
{
fatal_dump_core ("Memory corruption");
}
/* Attempt to install hooks in mmalloc/mrealloc/mfree for the heap specified
by MD, to detect memory corruption. Note that MD may be NULL to specify
the default heap that grows via sbrk.
Note that for freshly created regions, we must call mmcheck prior to any
mallocs in the region. Otherwise, any region which was allocated prior to
installing the checking hooks, which is later reallocated or freed, will
fail the checks! The mmcheck function only allows initial hooks to be
installed before the first mmalloc. However, anytime after we have called
mmcheck the first time to install the checking hooks, we can call it again
to update the function pointer to the memory corruption handler.
Returns zero on failure, non-zero on success. */
void
init_malloc (md)
PTR md;
{
if (!mmcheck (md, malloc_botch))
{
warning ("internal error: failed to install memory consistency checks");
}
(void) mmtrace ();
}
#endif /* Have mmalloc and want corruption checking */
/* Called when a memory allocation fails, with the number of bytes of
memory requested in SIZE. */
NORETURN void
nomem (size)
long size;
{
if (size > 0)
{
fatal ("virtual memory exhausted: can't allocate %ld bytes.", size);
}
else
{
fatal ("virtual memory exhausted.");
}
}
/* Like mmalloc but get error if no storage available, and protect against
the caller wanting to allocate zero bytes. Whether to return NULL for
a zero byte request, or translate the request into a request for one
byte of zero'd storage, is a religious issue. */
PTR
xmmalloc (md, size)
PTR md;
long size;
{
register PTR val;
if (size == 0)
{
val = NULL;
}
else if ((val = mmalloc (md, size)) == NULL)
{
nomem (size);
}
return (val);
}
/* Like mrealloc but get error if no storage available. */
PTR
xmrealloc (md, ptr, size)
PTR md;
PTR ptr;
long size;
{
register PTR val;
if (ptr != NULL)
{
val = mrealloc (md, ptr, size);
}
else
{
val = mmalloc (md, size);
}
if (val == NULL)
{
nomem (size);
}
return (val);
}
/* Like malloc but get error if no storage available, and protect against
the caller wanting to allocate zero bytes. */
PTR
xmalloc (size)
long size;
{
return (xmmalloc ((void *) NULL, size));
}
/* Like mrealloc but get error if no storage available. */
PTR
xrealloc (ptr, size)
PTR ptr;
long size;
{
return (xmrealloc ((void *) NULL, ptr, size));
}
/* My replacement for the read system call. /* My replacement for the read system call.
Used like `read' but keeps going if `read' returns too soon. */ Used like `read' but keeps going if `read' returns too soon. */
@ -497,6 +605,18 @@ savestring (ptr, size)
return p; return p;
} }
char *
msavestring (md, ptr, size)
void *md;
const char *ptr;
int size;
{
register char *p = (char *) xmmalloc (md, size + 1);
bcopy (ptr, p, size);
p[size] = 0;
return p;
}
/* The "const" is so it compiles under DGUX (which prototypes strsave /* The "const" is so it compiles under DGUX (which prototypes strsave
in <string.h>. FIXME: This should be named "xstrsave", shouldn't it? in <string.h>. FIXME: This should be named "xstrsave", shouldn't it?
Doesn't real strsave return NULL if out of memory? */ Doesn't real strsave return NULL if out of memory? */
@ -507,6 +627,14 @@ strsave (ptr)
return savestring (ptr, strlen (ptr)); return savestring (ptr, strlen (ptr));
} }
char *
mstrsave (md, ptr)
void *md;
const char *ptr;
{
return (msavestring (md, ptr, strlen (ptr)));
}
void void
print_spaces (n, file) print_spaces (n, file)
register int n; register int n;
@ -1101,7 +1229,7 @@ n_spaces (n)
{ {
if (spaces) if (spaces)
free (spaces); free (spaces);
spaces = (char *) malloc (n+1); spaces = (char *) xmalloc (n+1);
for (t = spaces+n; t != spaces;) for (t = spaces+n; t != spaces;)
*--t = ' '; *--t = ' ';
spaces[n] = '\0'; spaces[n] = '\0';

Loading…
Cancel
Save