/* Read os9/os9k symbol tables and convert to internal format, for GDB.
- Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993
+ Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994
Free Software Foundation, Inc.
This file is part of GDB.
#include "command.h"
#include "target.h"
#include "gdbcore.h" /* for bfd stuff */
-#include "libbfd.h" /* FIXME Secret internal BFD stuff (bfd_read) */
#include "libaout.h" /* FIXME Secret internal BFD stuff for a.out */
#include "symfile.h"
#include "objfiles.h"
extern int previous_stab_code;
-/* The BFD for this file -- implicit parameter to next_symbol_text. */
-static bfd *symfile_bfd;
-
/* Name of last function encountered. Used in Solaris to approximate
object file boundaries. */
static char *last_function_name;
extern struct complaint repeated_header_name_complaint;
+#if 0
static struct complaint lbrac_unmatched_complaint =
{"unmatched Increment Block Entry before symtab pos %d", 0, 0};
static struct complaint lbrac_mismatch_complaint =
{"IBE/IDE symbol mismatch at symtab pos %d", 0, 0};
-
+#endif
\f
/* Local function prototypes */
static void
read_os9k_psymtab PARAMS ((struct section_offsets *, struct objfile *,
CORE_ADDR, int));
-static void
-init_psymbol_list PARAMS ((struct objfile *));
-
-static char *
-os9k_next_symbol_text PARAMS ((void));
-
static int
fill_sym PARAMS ((FILE *, bfd *));
struct partial_symtab **, int));
static void
-record_minimal_symbol PARAMS ((char *, CORE_ADDR, int, struct objfile *));
+record_minimal_symbol PARAMS ((char *, CORE_ADDR, int, struct objfile *,
+ struct section_offsets *));
\f
#define HANDLE_RBRAC(val) \
if ((val) > pst->texthigh) pst->texthigh = (val);
#define N_ABS 6
static void
-record_minimal_symbol (name, address, type, objfile)
+record_minimal_symbol (name, address, type, objfile, section_offsets)
char *name;
CORE_ADDR address;
int type;
struct objfile *objfile;
+ struct section_offsets *section_offsets;
{
enum minimal_symbol_type ms_type;
switch (type)
{
- case N_TEXT: ms_type = mst_text; break;
- case N_DATA: ms_type = mst_data; break;
- case N_BSS: ms_type = mst_bss; break;
- case N_RDATA: ms_type = mst_bss; break;
- case N_IDATA: ms_type = mst_data; break;
- case N_ABS: ms_type = mst_abs; break;
- default: ms_type = mst_unknown; break;
+ case N_TEXT:
+ ms_type = mst_text;
+ address += ANOFFSET(section_offsets, SECT_OFF_TEXT);
+ break;
+ case N_DATA:
+ ms_type = mst_data;
+ break;
+ case N_BSS:
+ ms_type = mst_bss;
+ break;
+ case N_RDATA:
+ ms_type = mst_bss;
+ break;
+ case N_IDATA:
+ ms_type = mst_data;
+ break;
+ case N_ABS:
+ ms_type = mst_abs;
+ break;
+ default:
+ ms_type = mst_unknown; break;
}
prim_record_minimal_symbol
};
#define STBSYMSIZE 10
-static int
-read_minimal_symbols(objfile)
+static void
+read_minimal_symbols(objfile, section_offsets)
struct objfile *objfile;
+ struct section_offsets *section_offsets;
{
FILE *fp;
bfd *abfd;
if (ch == 0) break;
ch = getc(fp);
};
+ if (i%2) ch=getc(fp);
hdr.name = &buf[0];
fread(&hdr.fmtno, sizeof(hdr.fmtno), 1, fp);
if (ch == 0) break;
ch = getc(fp);
};
- record_minimal_symbol(buf1, sym.value, sym.type&7, objfile);
+ record_minimal_symbol(buf1, sym.value, sym.type&7, objfile, section_offsets);
off += STBSYMSIZE;
};
install_minimal_symbols (objfile);
- return 1;
+ return;
}
\f
/* Scan and build partial symbols for a symbol file.
int mainline; /* FIXME comments above */
{
bfd *sym_bfd;
- int val;
- int stb_exist;
struct cleanup *back_to;
sym_bfd = objfile->obfd;
/* 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)
- init_psymbol_list (objfile);
+ init_psymbol_list (objfile, DBX_SYMCOUNT (objfile));
pending_blocks = 0;
back_to = make_cleanup (really_free_pendings, 0);
make_cleanup (discard_minimal_symbols, 0);
- read_minimal_symbols (objfile);
+ read_minimal_symbols (objfile, section_offsets);
/* Now that the symbol table data of the executable file are all in core,
process them and define symbols accordingly. */
bfd_section_vma (sym_bfd, DBX_TEXT_SECT (objfile)),
bfd_section_size (sym_bfd, DBX_TEXT_SECT (objfile)));
- if (!have_partial_symbols ()) {
- wrap_here ("");
- printf_filtered ("(no debugging symbols found)...");
- wrap_here ("");
- }
-
do_cleanups (back_to);
}
os9k_symfile_init (objfile)
struct objfile *objfile;
{
- int val;
bfd *sym_bfd = objfile->obfd;
char *name = bfd_get_filename (sym_bfd);
- char dbgname[64], stbname[64];
+ char dbgname[512], stbname[512];
FILE *symfile = 0;
FILE *minfile = 0;
}
\f
-struct dbghdr {
+struct st_dbghdr {
int sync;
short rev;
int crc;
short os;
short cpu;
};
+#define SYNC (int)0xefbefeca
#define SWAP_DBGHDR(hdrp, abfd) \
{ \
};
static struct internal_symstruct symbol;
static struct internal_symstruct *symbuf = &symbol;
-static char strbuf[256];
+static char strbuf[4096];
+static struct st_dbghdr dbghdr;
+static short cmplrid;
+
+#define VER_PRE_ULTRAC ((short)4)
+#define VER_ULTRAC ((short)5)
static int
fill_sym (dbg_file, abfd)
FILE *dbg_file;
bfd *abfd;
{
-short id;
-short si;
+short si, nmask;
long li;
int ii;
+char *p;
int nbytes = fread(&si, sizeof(si), 1, dbg_file);
if (nbytes == 0)
case N_SYM_CMPLR:
fread(&si, sizeof(si), 1, dbg_file);
symbuf->n_desc = bfd_get_16(abfd, (unsigned char *)&si);
+ cmplrid = symbuf->n_desc & 0xff;
break;
case N_SYM_SLINE:
fread(&li, sizeof(li), 1, dbg_file);
strbuf[si++] = (char) ii;
} while (ii != 0 || si % 2 != 0);
symbuf->n_strx = strbuf;
+ p = (char *) strchr (strbuf, ':');
+ if (!p) break;
+ if ((p[1] == 'F' || p[1] == 'f') && cmplrid == VER_PRE_ULTRAC)
+ {
+ fread(&si, sizeof(si), 1, dbg_file);
+ nmask = bfd_get_16(abfd, (unsigned char *)&si);
+ for (ii=0; ii<nmask; ii++)
+ fread(&si, sizeof(si), 1, dbg_file);
+ }
break;
case N_SYM_LBRAC:
fread(&li, sizeof(li), 1, dbg_file);
return 1;
}
\f
-/* Initializes storage for all of the partial symbols that will be
- created by read_dbx_symtab and subsidiaries. */
-
-static void
-init_psymbol_list (objfile)
- struct objfile *objfile;
-{
- /* Free any previously allocated psymbol lists. */
- if (objfile -> global_psymbols.list)
- mfree (objfile -> md, (PTR)objfile -> global_psymbols.list);
- if (objfile -> static_psymbols.list)
- mfree (objfile -> md, (PTR)objfile -> static_psymbols.list);
-
- /* Current best guess is that there are approximately a twentieth
- of the total symbols (in a debugging file) are global or static
- oriented symbols */
- objfile -> global_psymbols.size = DBX_SYMCOUNT (objfile) / 10;
- objfile -> static_psymbols.size = DBX_SYMCOUNT (objfile) / 10;
- 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 *)
- xmmalloc (objfile -> md, objfile -> static_psymbols.size * sizeof (struct partial_symbol));
-}
-
/* Given pointers to an a.out symbol table in core containing dbx
style data, setup partial_symtab's describing each source file for
which debugging information is available.
{
register struct internal_symstruct *bufp = 0; /* =0 avoids gcc -Wall glitch*/
register char *namestring;
- int nsl;
int past_first_source_file = 0;
CORE_ADDR last_o_file_start = 0;
+#if 0
struct cleanup *back_to;
+#endif
bfd *abfd;
FILE *fp;
- struct dbghdr hdr;
/* End of the text segment of the executable file. */
static CORE_ADDR end_of_text_addr;
abfd = objfile->obfd;
fp = objfile->auxf2;
+ if (!fp) return;
- fread(&hdr.sync, sizeof(hdr.sync), 1, fp);
- fread(&hdr.rev, sizeof(hdr.rev), 1, fp);
- fread(&hdr.crc, sizeof(hdr.crc), 1, fp);
- fread(&hdr.os, sizeof(hdr.os), 1, fp);
- fread(&hdr.cpu, sizeof(hdr.cpu), 1, fp);
- SWAP_DBGHDR(&hdr, abfd);
+ fread(&dbghdr.sync, sizeof(dbghdr.sync), 1, fp);
+ fread(&dbghdr.rev, sizeof(dbghdr.rev), 1, fp);
+ fread(&dbghdr.crc, sizeof(dbghdr.crc), 1, fp);
+ fread(&dbghdr.os, sizeof(dbghdr.os), 1, fp);
+ fread(&dbghdr.cpu, sizeof(dbghdr.cpu), 1, fp);
+ SWAP_DBGHDR(&dbghdr, abfd);
symnum = 0;
while(1)
{
unsigned long valu;
enum language tmp_language;
+ char *str, *p;
+ int n;
- valu = CUR_SYMBOL_VALUE +
- ANOFFSET (section_offsets, SECT_OFF_TEXT);
+ valu = CUR_SYMBOL_VALUE;
+ if (valu)
+ valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
past_first_source_file = 1;
+ p = strchr(namestring, ':');
+ if (p) n = p-namestring;
+ else n = strlen(namestring);
+ str = alloca(n+1);
+ strncpy(str, namestring, n);
+ str[n] = '\0';
+
if (psymfile_depth == 0) {
if (!pst)
pst = os9k_start_psymtab (objfile, section_offsets,
- namestring, valu,
+ str, valu,
cursymoffset,
symnum-1,
objfile -> global_psymbols.next,
objfile -> static_psymbols.next);
} else { /* this is a include file */
- tmp_language = deduce_language_from_filename (namestring);
+ tmp_language = deduce_language_from_filename (str);
if (tmp_language != language_unknown
&& (tmp_language != language_c
|| psymtab_language != language_cplus))
psymtab_language = tmp_language;
/*
- if (pst && STREQ (namestring, pst->filename))
+ if (pst && STREQ (str, pst->filename))
continue;
{
register int i;
for (i = 0; i < includes_used; i++)
- if (STREQ (namestring, psymtab_include_list[i]))
+ if (STREQ (str, psymtab_include_list[i]))
{
i = -1;
break;
}
*/
- psymtab_include_list[includes_used++] = namestring;
+ psymtab_include_list[includes_used++] = str;
if (includes_used >= includes_allocated)
{
char **orig = psymtab_include_list;
case 'p':
case 'l':
+ case 's':
continue;
case ':':
strncpy (p, last_function_name, n);
p[n] = 0;
- minsym = lookup_minimal_symbol (p, objfile);
+ minsym = lookup_minimal_symbol (p, NULL, objfile);
if (minsym) {
pst->texthigh = SYMBOL_VALUE_ADDRESS(minsym)+(long)MSYMBOL_INFO(minsym);
bufp = symbuf;
type = bufp->n_type;
- os9k_process_one_symbol (type, bufp->n_desc, bufp->n_value,
- bufp->n_strx, section_offsets, objfile);
+ os9k_process_one_symbol ((int)type, (int)bufp->n_desc,
+ (CORE_ADDR)bufp->n_value, bufp->n_strx, section_offsets, objfile);
/* We skip checking for a new .o or -l file; that should never
happen in this routine. */
case N_SYM_LBRAC:
/* On most machines, the block addresses are relative to the
N_SO, the linker did not relocate them (sigh). */
- valu += last_source_start_addr;
+ valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
new = push_context (desc, valu);
break;
case N_SYM_RBRAC:
- valu += last_source_start_addr;
+ valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
new = pop_context();
#if !defined (OS9K_VARIABLES_INSIDE_BLOCK)
one line-number -- core-address correspondence.
Enter it in the line list for this symbol table. */
/* Relocate for dynamic loading and for ELF acc fn-relative syms. */
- valu += last_source_start_addr;
+ valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
record_line (current_subfile, (int)name, valu);
break;