aboutsummaryrefslogtreecommitdiff
path: root/gdb/dbxread.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/dbxread.c')
-rw-r--r--gdb/dbxread.c210
1 files changed, 209 insertions, 1 deletions
diff --git a/gdb/dbxread.c b/gdb/dbxread.c
index add45a9..84e9de8 100644
--- a/gdb/dbxread.c
+++ b/gdb/dbxread.c
@@ -41,6 +41,11 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#define L_INCR 1
#endif
+#ifdef hp9000s800
+/* 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
@@ -54,7 +59,12 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "target.h"
#include "gdbcore.h" /* for bfd stuff */
#include "libbfd.h" /* FIXME Secret internal BFD stuff (bfd_read) */
+#ifdef hp9000s800
+#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"
@@ -66,6 +76,19 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
symbol files. A pointer to this structure is kept in the sym_private
field of the objfile struct. */
+#ifdef hp9000s800
+struct dbx_symfile_info {
+ asection *text_sect; /* Text section accessor */
+ int symcount; /* How many symbols are there in the file */
+ char *stringtab; /* The actual string table */
+ int stringtab_size; /* Its size */
+ off_t symtab_offset; /* Offset in file to symbol table */
+ int hp_symcount;
+ char *hp_stringtab;
+ int hp_stringtab_size;
+ off_t hp_symtab_offset;
+};
+#else
struct dbx_symfile_info {
asection *text_sect; /* Text section accessor */
int symcount; /* How many symbols are there in the file */
@@ -74,6 +97,7 @@ struct dbx_symfile_info {
off_t symtab_offset; /* Offset in file to symbol table */
int symbol_size; /* Bytes in a single symbol */
};
+#endif
#define DBX_SYMFILE_INFO(o) ((struct dbx_symfile_info *)((o)->sym_private))
#define DBX_TEXT_SECT(o) (DBX_SYMFILE_INFO(o)->text_sect)
@@ -82,6 +106,12 @@ struct dbx_symfile_info {
#define DBX_STRINGTAB_SIZE(o) (DBX_SYMFILE_INFO(o)->stringtab_size)
#define DBX_SYMTAB_OFFSET(o) (DBX_SYMFILE_INFO(o)->symtab_offset)
#define DBX_SYMBOL_SIZE(o) (DBX_SYMFILE_INFO(o)->symbol_size)
+#ifdef hp9000s800
+#define HP_SYMCOUNT(o) (DBX_SYMFILE_INFO(o)->hp_symcount)
+#define HP_STRINGTAB(o) (DBX_SYMFILE_INFO(o)->hp_stringtab)
+#define HP_STRINGTAB_SIZE(o) (DBX_SYMFILE_INFO(o)->hp_stringtab_size)
+#define HP_SYMTAB_OFFSET(o) (DBX_SYMFILE_INFO(o)->hp_symtab_offset)
+#endif
/* 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
@@ -470,7 +500,11 @@ dbx_symfile_read (objfile, addr, mainline)
if (mainline || objfile->global_psymbols.size == 0 || objfile->static_psymbols.size == 0)
init_psymbol_list (objfile);
+#ifdef hp9000s800
+ 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;
@@ -539,8 +573,15 @@ dbx_symfile_init (objfile)
xmmalloc (objfile -> md, sizeof (struct dbx_symfile_info));
/* FIXME POKING INSIDE BFD DATA STRUCTURES */
+#ifdef hp9000s800
+#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_TEXT_SECT (objfile) = bfd_get_section_by_name (sym_bfd, ".text");
@@ -548,7 +589,12 @@ dbx_symfile_init (objfile)
error ("Can't find .text section in symbol file");
DBX_SYMBOL_SIZE (objfile) = obj_symbol_entry_size (sym_bfd);
- DBX_SYMCOUNT (objfile) = bfd_get_symcount (sym_bfd);
+#ifdef hp9000s800
+ HP_SYMCOUNT (objfile) = obj_hp_sym_count (sym_bfd);
+ DBX_SYMCOUNT (objfile) = obj_dbx_sym_count (sym_bfd);
+#else
+ 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
@@ -563,6 +609,10 @@ dbx_symfile_init (objfile)
however at least check to see if the size is zero or some negative
value. */
+#ifdef hp9000s800
+ 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);
@@ -572,6 +622,8 @@ dbx_symfile_init (objfile)
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));
@@ -579,6 +631,15 @@ dbx_symfile_init (objfile)
DBX_STRINGTAB (objfile) =
(char *) obstack_alloc (&objfile -> psymbol_obstack,
DBX_STRINGTAB_SIZE (objfile));
+#ifdef hp9000s800
+ 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. */
@@ -589,6 +650,18 @@ dbx_symfile_init (objfile)
sym_bfd);
if (val != DBX_STRINGTAB_SIZE (objfile))
perror_with_name (name);
+#ifdef hp9000s800
+ 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 hp9000s800
+ HP_SYMTAB_OFFSET (objfile) = HP_SYMBOL_TABLE_OFFSET;
+#endif
}
/* Perform any local cleanups required when we are done with a particular
@@ -642,6 +715,25 @@ fill_symbuf (sym_bfd)
symbuf_end = nbytes / symbol_size;
symbuf_idx = 0;
}
+#ifdef hp9000s800
+/* 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) \
{ \
@@ -689,8 +781,15 @@ init_psymbol_list (objfile)
/* 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 hp9000s800
+ 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 *)
@@ -781,6 +880,14 @@ read_dbx_symtab (addr, objfile, text_addr, text_size)
CORE_ADDR last_o_file_start = 0;
struct cleanup *old_chain;
bfd *abfd;
+#ifdef hp9000s800
+ /* 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;
@@ -802,7 +909,11 @@ read_dbx_symtab (addr, objfile, text_addr, text_size)
file_string_table_offset = 0;
next_file_string_table_offset = 0;
+#ifdef hp9000s800
+ stringtab_global = HP_STRINGTAB (objfile);
+#else
stringtab_global = DBX_STRINGTAB (objfile);
+#endif
pst = (struct partial_symtab *) 0;
@@ -836,6 +947,75 @@ read_dbx_symtab (addr, objfile, text_addr, text_size)
symbuf_end = symbuf_idx = 0;
next_symbol_text_func = dbx_next_symbol_text;
+#ifdef hp9000s800
+ /* 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), 0);
+
+ 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), 0);
+#endif
+
for (symnum = 0; symnum < DBX_SYMCOUNT (objfile); symnum++)
{
/* Get the symbol for this run and pull out some info */
@@ -889,6 +1069,7 @@ read_dbx_symtab (addr, objfile, text_addr, text_size)
}
/* If there's stuff to be cleaned up, clean it up. */
+#ifndef hp9000s800
if (DBX_SYMCOUNT (objfile) > 0 /* We have some syms */
/*FIXME, does this have a bug at start address 0? */
&& last_o_file_start
@@ -898,12 +1079,19 @@ read_dbx_symtab (addr, objfile, text_addr, text_size)
objfile -> ei.entry_file_lowpc = last_o_file_start;
objfile -> ei.entry_file_highpc = bufp->n_value;
}
+#endif
if (pst)
{
+#ifdef hp9000s800
+ 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);
@@ -1184,7 +1372,11 @@ dbx_psymtab_to_symtab_1 (pst)
buildsym_init ();
old_chain = make_cleanup (really_free_pendings, 0);
file_string_table_offset = FILE_STRING_OFFSET (pst);
+#ifdef hp9000s800
+ symbol_size = obj_dbx_symbol_entry_size (sym_bfd);
+#else
symbol_size = SYMBOL_SIZE (pst);
+#endif
/* Read in this file's symbols */
bfd_seek (pst->objfile->obfd, SYMBOL_OFFSET (pst), L_SET);
@@ -1275,7 +1467,11 @@ read_ofile_symtab (objfile, sym_offset, sym_size, text_offset, text_size,
current_objfile = objfile;
subfile_stack = 0;
+#ifdef hp9000s800
+ stringtab_global = HP_STRINGTAB (objfile);
+#else
stringtab_global = DBX_STRINGTAB (objfile);
+#endif
last_source_file = 0;
abfd = objfile->obfd;
@@ -1890,10 +2086,22 @@ static struct sym_fns bout_sym_fns =
NULL /* next: pointer to next struct sym_fns */
};
+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 */
+ 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);
}