/* Read dbx symbol tables and convert to internal format, for GDB.
- Copyright 1986, 1987, 1988, 1989, 1990, 1991 Free Software Foundation, Inc.
+ Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993
+ Free Software Foundation, Inc.
This file is part of GDB.
#define L_INCR 1
#endif
-#ifdef GDB_TARGET_IS_HPPA
-/* We don't want to use HP-UX's nlists. */
-#define _NLIST_INCLUDED
-#endif
-
#include <obstack.h>
#include <sys/param.h>
#ifndef NO_SYS_FILE
#include "target.h"
#include "gdbcore.h" /* for bfd stuff */
#include "libbfd.h" /* FIXME Secret internal BFD stuff (bfd_read) */
-#ifdef GDB_TARGET_IS_HPPA
-#include "libhppa.h"
-#include "syms.h"
-#else
#include "libaout.h" /* FIXME Secret internal BFD stuff for a.out */
-#endif
#include "symfile.h"
#include "objfiles.h"
#include "buildsym.h"
#define BELIEVE_PCC_PROMOTION 0
#endif
+/* Remember what we deduced to be the source language of this psymtab. */
+
+static enum language psymtab_language = language_unknown;
+
/* Nonzero means give verbose info on gdb action. From main.c. */
extern int info_verbose;
struct complaint unknown_symtype_complaint =
{"unknown symbol type %s", 0, 0};
+struct complaint unknown_symchar_complaint =
+ {"unknown symbol type character `%c'", 0, 0};
+
struct complaint lbrac_rbrac_complaint =
{"block start larger than block end", 0, 0};
register int i;
for (i = 0; i < n_header_files; i++)
- if (!strcmp (p[i].name, name) && instance == p[i].instance)
+ if (STREQ (p[i].name, name) && instance == p[i].instance)
{
add_this_object_header_file (i);
return;
if (mainline || objfile->global_psymbols.size == 0 || objfile->static_psymbols.size == 0)
init_psymbol_list (objfile);
-#ifdef GDB_TARGET_IS_HPPA
- symbol_size = obj_dbx_symbol_entry_size (sym_bfd);
-#else
symbol_size = DBX_SYMBOL_SIZE (objfile);
-#endif
symbol_table_offset = DBX_SYMTAB_OFFSET (objfile);
pending_blocks = 0;
be called unless this is an a.out (or very similar) file.
FIXME, there should be a cleaner peephole into the BFD environment here. */
+#define DBX_STRINGTAB_SIZE_SIZE sizeof(long) /* FIXME */
+
static void
dbx_symfile_init (objfile)
struct objfile *objfile;
int val;
bfd *sym_bfd = objfile->obfd;
char *name = bfd_get_filename (sym_bfd);
- unsigned char size_temp[4];
+ unsigned char size_temp[DBX_STRINGTAB_SIZE_SIZE];
/* Allocate struct to keep track of the symfile */
objfile->sym_private = (PTR)
xmmalloc (objfile -> md, sizeof (struct dbx_symfile_info));
/* FIXME POKING INSIDE BFD DATA STRUCTURES */
-#ifdef GDB_TARGET_IS_HPPA
-#define STRING_TABLE_OFFSET (sym_bfd->origin + obj_dbx_str_filepos (sym_bfd))
-#define SYMBOL_TABLE_OFFSET (sym_bfd->origin + obj_dbx_sym_filepos (sym_bfd))
-#define HP_STRING_TABLE_OFFSET (sym_bfd->origin + obj_hp_str_filepos (sym_bfd))
-#define HP_SYMBOL_TABLE_OFFSET (sym_bfd->origin + obj_hp_sym_filepos (sym_bfd))
-#else
#define STRING_TABLE_OFFSET (sym_bfd->origin + obj_str_filepos (sym_bfd))
#define SYMBOL_TABLE_OFFSET (sym_bfd->origin + obj_sym_filepos (sym_bfd))
-#endif
+
/* FIXME POKING INSIDE BFD DATA STRUCTURES */
DBX_SYMFILE_INFO (objfile)->stab_section_info = NULL;
if (!DBX_TEXT_SECT (objfile))
error ("Can't find .text section in symbol file");
-#ifdef GDB_TARGET_IS_HPPA
- HP_SYMCOUNT (objfile) = obj_hp_sym_count (sym_bfd);
- DBX_SYMCOUNT (objfile) = obj_dbx_sym_count (sym_bfd);
-#else
DBX_SYMBOL_SIZE (objfile) = obj_symbol_entry_size (sym_bfd);
DBX_SYMCOUNT (objfile) = bfd_get_symcount (sym_bfd);
-#endif
DBX_SYMTAB_OFFSET (objfile) = SYMBOL_TABLE_OFFSET;
/* Read the string table and stash it away in the psymbol_obstack. It is
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. */
-
-#ifdef GDB_TARGET_IS_HPPA
- DBX_STRINGTAB_SIZE (objfile) = obj_dbx_stringtab_size (sym_bfd);
- HP_STRINGTAB_SIZE (objfile) = obj_hp_stringtab_size (sym_bfd);
-#else
- val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, L_SET);
- if (val < 0)
- perror_with_name (name);
-
- val = bfd_read ((PTR)size_temp, sizeof (long), 1, sym_bfd);
- if (val < 0)
- perror_with_name (name);
-
- DBX_STRINGTAB_SIZE (objfile) = bfd_h_get_32 (sym_bfd, size_temp);
-#endif
-
- if (DBX_STRINGTAB_SIZE (objfile) <= 0)
- error ("ridiculous string table size (%d bytes).",
- DBX_STRINGTAB_SIZE (objfile));
-
- DBX_STRINGTAB (objfile) =
- (char *) obstack_alloc (&objfile -> psymbol_obstack,
- DBX_STRINGTAB_SIZE (objfile));
-#ifdef GDB_TARGET_IS_HPPA
- if (HP_STRINGTAB_SIZE (objfile) <= 0)
- error ("ridiculous string table size (%d bytes).",
- HP_STRINGTAB_SIZE (objfile));
-
- HP_STRINGTAB (objfile) =
- (char *) obstack_alloc (&objfile -> psymbol_obstack,
- HP_STRINGTAB_SIZE (objfile));
-#endif
-
- /* Now read in the string table in one big gulp. */
+ however at least check to see if the size is less than the size of
+ the size field itself, or larger than the size of the entire file.
+ Note that all valid string tables have a size greater than zero, since
+ the bytes used to hold the size are included in the count. */
- val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, L_SET);
- if (val < 0)
- perror_with_name (name);
- val = bfd_read (DBX_STRINGTAB (objfile), DBX_STRINGTAB_SIZE (objfile), 1,
- sym_bfd);
- if (val != DBX_STRINGTAB_SIZE (objfile))
- perror_with_name (name);
-#ifdef GDB_TARGET_IS_HPPA
- val = bfd_seek (sym_bfd, HP_STRING_TABLE_OFFSET, L_SET);
- if (val < 0)
- perror_with_name (name);
- val = bfd_read (HP_STRINGTAB (objfile), HP_STRINGTAB_SIZE (objfile), 1,
- sym_bfd);
- if (val != HP_STRINGTAB_SIZE (objfile))
- perror_with_name (name);
-#endif
-#ifdef GDB_TARGET_IS_HPPA
- HP_SYMTAB_OFFSET (objfile) = HP_SYMBOL_TABLE_OFFSET;
-#endif
+ if (STRING_TABLE_OFFSET == 0)
+ {
+ /* It appears that with the existing bfd code, STRING_TABLE_OFFSET
+ will never be zero, even when there is no string table. This
+ would appear to be a bug in bfd. */
+ DBX_STRINGTAB_SIZE (objfile) = 0;
+ DBX_STRINGTAB (objfile) = NULL;
+ }
+ else
+ {
+ val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, L_SET);
+ if (val < 0)
+ perror_with_name (name);
+
+ memset ((PTR) size_temp, 0, sizeof (size_temp));
+ val = bfd_read ((PTR) size_temp, sizeof (size_temp), 1, sym_bfd);
+ if (val < 0)
+ {
+ perror_with_name (name);
+ }
+ else if (val == 0)
+ {
+ /* With the existing bfd code, STRING_TABLE_OFFSET will be set to
+ EOF if there is no string table, and attempting to read the size
+ from EOF will read zero bytes. */
+ DBX_STRINGTAB_SIZE (objfile) = 0;
+ DBX_STRINGTAB (objfile) = NULL;
+ }
+ else
+ {
+ /* Read some data that would appear to be the string table size.
+ If there really is a string table, then it is probably the right
+ size. Byteswap if necessary and validate the size. Note that
+ the minimum is DBX_STRINGTAB_SIZE_SIZE. If we just read some
+ random data that happened to be at STRING_TABLE_OFFSET, because
+ bfd can't tell us there is no string table, the sanity checks may
+ or may not catch this. */
+ DBX_STRINGTAB_SIZE (objfile) = bfd_h_get_32 (sym_bfd, size_temp);
+
+ if (DBX_STRINGTAB_SIZE (objfile) < sizeof (size_temp)
+ || DBX_STRINGTAB_SIZE (objfile) > bfd_get_size (sym_bfd))
+ error ("ridiculous string table size (%d bytes).",
+ DBX_STRINGTAB_SIZE (objfile));
+
+ DBX_STRINGTAB (objfile) =
+ (char *) obstack_alloc (&objfile -> psymbol_obstack,
+ DBX_STRINGTAB_SIZE (objfile));
+
+ /* Now read in the string table in one big gulp. */
+
+ val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, L_SET);
+ if (val < 0)
+ perror_with_name (name);
+ val = bfd_read (DBX_STRINGTAB (objfile), DBX_STRINGTAB_SIZE (objfile), 1,
+ sym_bfd);
+ if (val != DBX_STRINGTAB_SIZE (objfile))
+ perror_with_name (name);
+ }
+ }
}
/* Perform any local cleanups required when we are done with a particular
symbuf_end = nbytes / symbol_size;
symbuf_idx = 0;
}
-#ifdef GDB_TARGET_IS_HPPA
-/* same as above for the HP symbol table */
-
-static struct symbol_dictionary_record hp_symbuf[4096];
-static int hp_symbuf_idx;
-static int hp_symbuf_end;
-
-static int
-fill_hp_symbuf (sym_bfd)
- bfd *sym_bfd;
-{
- int nbytes = bfd_read ((PTR)hp_symbuf, sizeof (hp_symbuf), 1, sym_bfd);
- if (nbytes <= 0)
- error ("error or end of file reading symbol table");
- hp_symbuf_end = nbytes / sizeof (struct symbol_dictionary_record);
- hp_symbuf_idx = 0;
- return 1;
-}
-#endif
#define SWAP_SYMBOL(symp, abfd) \
{ \
/* Current best guess is that there are approximately a twentieth
of the total symbols (in a debugging file) are global or static
oriented symbols */
-#ifdef GDB_TARGET_IS_HPPA
- objfile -> global_psymbols.size = (DBX_SYMCOUNT (objfile) +
- HP_SYMCOUNT (objfile)) / 10;
- objfile -> static_psymbols.size = (DBX_SYMCOUNT (objfile) +
- HP_SYMCOUNT (objfile)) / 10;
-#else
objfile -> global_psymbols.size = DBX_SYMCOUNT (objfile) / 10;
objfile -> static_psymbols.size = DBX_SYMCOUNT (objfile) / 10;
-#endif
objfile -> global_psymbols.next = objfile -> global_psymbols.list = (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 *)
for (bincl = bincl_list; bincl < next_bincl; bincl++)
if (bincl->instance == instance
- && !strcmp (name, bincl->name))
+ && STREQ (name, bincl->name))
return bincl->pst;
return (struct partial_symtab *) 0;
CORE_ADDR last_o_file_start = 0;
struct cleanup *old_chain;
bfd *abfd;
-#ifdef GDB_TARGET_IS_HPPA
- /* HP stuff */
- struct symbol_dictionary_record *hp_bufp;
- int hp_symnum;
- /* A hack: the first text symbol in the debugging library */
- int dbsubc_addr = 0;
-#endif
-
/* End of the text segment of the executable file. */
CORE_ADDR end_of_text_addr;
file_string_table_offset = 0;
next_file_string_table_offset = 0;
-#ifdef GDB_TARGET_IS_HPPA
- stringtab_global = HP_STRINGTAB (objfile);
-#else
stringtab_global = DBX_STRINGTAB (objfile);
-#endif
pst = (struct partial_symtab *) 0;
symbuf_end = symbuf_idx = 0;
next_symbol_text_func = dbx_next_symbol_text;
-#ifdef GDB_TARGET_IS_HPPA
- /* On pa machines, the global symbols are all in the regular HP-UX
- symbol table. Read them in first. */
-
- hp_symbuf_end = hp_symbuf_idx = 0;
- bfd_seek (abfd, HP_SYMTAB_OFFSET (objfile), L_SET);
-
- for (hp_symnum = 0; hp_symnum < HP_SYMCOUNT (objfile); hp_symnum++)
- {
- int dbx_type;
-
- QUIT;
- if (hp_symbuf_idx == hp_symbuf_end)
- fill_hp_symbuf (abfd);
- hp_bufp = &hp_symbuf[hp_symbuf_idx++];
- switch (hp_bufp->symbol_type)
- {
- case ST_SYM_EXT:
- case ST_ARG_EXT:
- continue;
- case ST_CODE:
- case ST_PRI_PROG:
- case ST_SEC_PROG:
- case ST_ENTRY:
- case ST_MILLICODE:
- dbx_type = N_TEXT;
- hp_bufp->symbol_value &= ~3; /* clear out permission bits */
- break;
- case ST_DATA:
- dbx_type = N_DATA;
- break;
-#ifdef KERNELDEBUG
- case ST_ABSOLUTE:
- {
- extern int kernel_debugging;
- if (!kernel_debugging)
- continue;
- dbx_type = N_ABS;
- break;
- }
-#endif
- default:
- continue;
- }
- /* Use the address of dbsubc to finish the last psymtab. */
- if (hp_bufp->symbol_type == ST_CODE &&
- HP_STRINGTAB (objfile)[hp_bufp->name.n_strx] == '_' &&
- !strcmp (HP_STRINGTAB (objfile) + hp_bufp->name.n_strx, "_dbsubc"))
- dbsubc_addr = hp_bufp->symbol_value;
- if (hp_bufp->symbol_scope == SS_UNIVERSAL)
- {
- if (hp_bufp->name.n_strx > HP_STRINGTAB_SIZE (objfile))
- error ("Invalid symbol data; bad HP string table offset: %d",
- hp_bufp->name.n_strx);
- /* A hack, but gets the job done. */
- if (!strcmp (hp_bufp->name.n_strx + HP_STRINGTAB (objfile),
- "$START$"))
- objfile -> ei.entry_file_lowpc = hp_bufp->symbol_value;
- if (!strcmp (hp_bufp->name.n_strx + HP_STRINGTAB (objfile),
- "_sr4export"))
- objfile -> ei.entry_file_highpc = hp_bufp->symbol_value;
- record_minimal_symbol (hp_bufp->name.n_strx + HP_STRINGTAB (objfile),
- hp_bufp->symbol_value, dbx_type | N_EXT,
- objfile);
- }
- }
- bfd_seek (abfd, DBX_SYMTAB_OFFSET (objfile), L_SET);
-#endif
-
for (symnum = 0; symnum < DBX_SYMCOUNT (objfile); symnum++)
{
/* Get the symbol for this run and pull out some info */
}
/* If there's stuff to be cleaned up, clean it up. */
-#ifndef GDB_TARGET_IS_HPPA
if (DBX_SYMCOUNT (objfile) > 0 /* We have some syms */
/*FIXME, does this have a bug at start address 0? */
&& last_o_file_start
objfile -> ei.entry_file_lowpc = last_o_file_start;
objfile -> ei.entry_file_highpc = bufp->n_value;
}
-#endif
if (pst)
{
-#ifdef GDB_TARGET_IS_HPPA
- end_psymtab (pst, psymtab_include_list, includes_used,
- symnum * symbol_size, dbsubc_addr,
- dependency_list, dependencies_used);
-#else
end_psymtab (pst, psymtab_include_list, includes_used,
symnum * symbol_size, end_of_text_addr,
dependency_list, dependencies_used);
-#endif
}
free_bincl_list (objfile);
if successful. */
elfstab_offset_sections (objfile, result);
+ /* Deduce the source language from the filename for this psymtab. */
+ psymtab_language = deduce_language_from_filename (filename);
+
return result;
}
minsym = lookup_minimal_symbol (p, objfile);
if (minsym) {
- pst->texthigh = minsym->address + (int)minsym->info;
+ pst->texthigh = SYMBOL_VALUE_ADDRESS (minsym) +
+ (int) MSYMBOL_INFO (minsym);
} else {
/* This file ends with a static function, and it's
difficult to imagine how hard it would be to track down
buildsym_init ();
old_chain = make_cleanup (really_free_pendings, 0);
file_string_table_offset = FILE_STRING_OFFSET (pst);
-#ifdef GDB_TARGET_IS_HPPA
- symbol_size = obj_dbx_symbol_entry_size (pst->objfile->obfd);
-#else
symbol_size = SYMBOL_SIZE (pst);
-#endif
/* Read in this file's symbols */
bfd_seek (pst->objfile->obfd, SYMBOL_OFFSET (pst), L_SET);
current_objfile = objfile;
subfile_stack = NULL;
-#ifdef GDB_TARGET_IS_HPPA
- stringtab_global = HP_STRINGTAB (objfile);
-#else
stringtab_global = DBX_STRINGTAB (objfile);
-#endif
last_source_file = NULL;
abfd = objfile->obfd;
processing_gcc_compilation = 0;
if (bufp->n_type == N_TEXT)
{
- if (strcmp (namestring, GCC_COMPILED_FLAG_SYMBOL) == 0)
+ if (STREQ (namestring, GCC_COMPILED_FLAG_SYMBOL))
processing_gcc_compilation = 1;
- else if (strcmp (namestring, GCC2_COMPILED_FLAG_SYMBOL) == 0)
+ else if (STREQ (namestring, GCC2_COMPILED_FLAG_SYMBOL))
processing_gcc_compilation = 2;
}
However, there is no reason not to accept
the GCC_COMPILED_FLAG_SYMBOL anywhere. */
- if (strcmp (namestring, GCC_COMPILED_FLAG_SYMBOL) == 0)
+ if (STREQ (namestring, GCC_COMPILED_FLAG_SYMBOL))
processing_gcc_compilation = 1;
- else if (strcmp (namestring, GCC2_COMPILED_FLAG_SYMBOL) == 0)
+ else if (STREQ (namestring, GCC2_COMPILED_FLAG_SYMBOL))
processing_gcc_compilation = 2;
#if 1 /* Works, but is experimental. -fnf */
if (last_source_start_addr == 0)
last_source_start_addr = text_offset;
- rtn = end_symtab (text_offset + text_size, 0, 0, objfile);
+ rtn = end_symtab (text_offset + text_size, 0, 0, objfile, SECT_OFF_TEXT);
end_stabs ();
return (rtn);
}
sanity checks). If so, that one was actually the directory
name, and the current one is the real file name.
Patch things up. */
- if (previous_stab_code == N_SO)
+ if (previous_stab_code == (unsigned char) N_SO)
{
patch_subfile_names (current_subfile, name);
break; /* Ignore repeated SOs */
}
- end_symtab (valu, 0, 0, objfile);
+ end_symtab (valu, 0, 0, objfile, SECT_OFF_TEXT);
end_stabs ();
}
start_stabs ();
case N_OPT: /* Solaris 2: Compiler options */
if (name)
{
- if (strcmp (name, GCC2_COMPILED_FLAG_SYMBOL) == 0)
+ if (STREQ (name, GCC2_COMPILED_FLAG_SYMBOL))
{
processing_gcc_compilation = 2;
#if 1 /* Works, but is experimental. -fnf */
DBX_STRINGTAB_SIZE (objfile) = stabstrsize;
DBX_SYMTAB_OFFSET (objfile) = staboffset;
- if (stabstrsize < 0) /* FIXME: stabstrsize is unsigned; never true! */
+ if (stabstrsize < 0 /* FIXME: stabstrsize is unsigned; never true! */
+ || stabstrsize > bfd_get_size (sym_bfd))
error ("ridiculous string table size: %d bytes", stabstrsize);
DBX_STRINGTAB (objfile) = (char *)
obstack_alloc (&objfile->psymbol_obstack, stabstrsize+1);
dbx_symfile_read (objfile, section_offsets, 0);
}
\f
+/* Scan and build partial symbols for a PA symbol file.
+ This PA file has already been processed to get its minimal symbols.
+
+ OBJFILE is the object file we are reading symbols from.
+ ADDR is the address relative to which the symbols are (e.g.
+ the base address of the text segment).
+ MAINLINE is true if we are reading the main symbol
+ table (as opposed to a shared lib or dynamically loaded file).
+
+ */
+
+void
+pastab_build_psymtabs (objfile, section_offsets, mainline)
+ struct objfile *objfile;
+ struct section_offsets *section_offsets;
+ int mainline;
+{
+ free_header_files ();
+ init_header_files ();
+
+ /* In a PA file, we've already installed the minimal symbols that came
+ from the PA (non-stab) symbol table, so always act like an
+ incremental load here. */
+
+ dbx_symfile_read (objfile, section_offsets, mainline);
+}
+\f
/* Parse the user's idea of an offset for dynamic linking, into our idea
of how to represent it for fast symbol reading. */
-struct section_offsets *
+static struct section_offsets *
dbx_symfile_offsets (objfile, addr)
struct objfile *objfile;
CORE_ADDR addr;
NULL /* next: pointer to next struct sym_fns */
};
-/* This is probably a mistake. FIXME. Why can't the HP's use an ordinary
- file format name with an -hppa suffix? */
-static struct sym_fns hppa_sym_fns =
-{
- "hppa", /* sym_name: name or name prefix of BFD target type */
- 4, /* sym_namelen: number of significant sym_name chars */
- dbx_new_init, /* sym_new_init: init anything gbl to entire symtab */
- dbx_symfile_init, /* sym_init: read initial info, setup for sym_read() */
- dbx_symfile_read, /* sym_read: read a symbol file into symtab */
- dbx_symfile_finish, /* sym_finish: finished with file, cleanup */
- dbx_symfile_offsets, /* sym_offsets: parse user's offsets to internal form */
- NULL /* next: pointer to next struct sym_fns */
-};
-
void
_initialize_dbxread ()
{
add_symtab_fns(&sunos_sym_fns);
add_symtab_fns(&aout_sym_fns);
add_symtab_fns(&bout_sym_fns);
- add_symtab_fns(&hppa_sym_fns);
}