/* Read os9/os9k symbol tables and convert to internal format, for GDB.
- Copyright 1986, 87, 88, 89, 90, 91, 92, 93, 94, 96, 1998
+ Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
+ 1996, 1997, 1998, 1999, 2000, 2001
Free Software Foundation, Inc.
This file is part of GDB.
#include "defs.h"
#include "gdb_string.h"
+#include "gdb_assert.h"
#include <stdio.h>
#if defined(USG) || defined(__CYGNUSCLIB__)
#include "obstack.h"
#include "gdb_stat.h"
-#include <ctype.h>
#include "symtab.h"
#include "breakpoint.h"
#include "command.h"
#include "os9k.h"
#include "stabsread.h"
-extern void _initialize_os9kread PARAMS ((void));
+extern void _initialize_os9kread (void);
/* 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
/* keep symbol table file nested depth */
static int symfile_depth = 0;
-/* Nonzero means give verbose info on gdb action. From main.c. */
-extern int info_verbose;
-
extern int previous_stab_code;
/* Name of last function encountered. Used in Solaris to approximate
\f
/* Local function prototypes */
-static void
-read_minimal_symbols PARAMS ((struct objfile *, struct section_offsets *));
+static void read_minimal_symbols (struct objfile *);
-static void
-os9k_read_ofile_symtab PARAMS ((struct partial_symtab *));
+static void os9k_read_ofile_symtab (struct partial_symtab *);
-static void
-os9k_psymtab_to_symtab PARAMS ((struct partial_symtab *));
+static void os9k_psymtab_to_symtab (struct partial_symtab *);
-static void
-os9k_psymtab_to_symtab_1 PARAMS ((struct partial_symtab *));
+static void os9k_psymtab_to_symtab_1 (struct partial_symtab *);
-static void
-read_os9k_psymtab PARAMS ((struct section_offsets *, struct objfile *,
- CORE_ADDR, int));
+static void read_os9k_psymtab (struct objfile *, CORE_ADDR, int);
-static int
-fill_sym PARAMS ((FILE *, bfd *));
+static int fill_sym (FILE *, bfd *);
-static void
-os9k_symfile_init PARAMS ((struct objfile *));
+static void os9k_symfile_init (struct objfile *);
-static void
-os9k_new_init PARAMS ((struct objfile *));
+static void os9k_new_init (struct objfile *);
-static void
-os9k_symfile_read PARAMS ((struct objfile *, int));
+static void os9k_symfile_read (struct objfile *, int);
-static void
-os9k_symfile_finish PARAMS ((struct objfile *));
+static void os9k_symfile_finish (struct objfile *);
static void
-os9k_process_one_symbol PARAMS ((int, int, CORE_ADDR, char *,
- struct section_offsets *, struct objfile *));
+os9k_process_one_symbol (int, int, CORE_ADDR, char *,
+ struct section_offsets *, struct objfile *);
-static struct partial_symtab *
- os9k_start_psymtab PARAMS ((struct objfile *, struct section_offsets *, char *,
- CORE_ADDR, int, int, struct partial_symbol **,
- struct partial_symbol **));
+static struct partial_symtab *os9k_start_psymtab (struct objfile *, char *,
+ CORE_ADDR, int, int,
+ struct partial_symbol **,
+ struct partial_symbol **);
-static struct partial_symtab *
- os9k_end_psymtab PARAMS ((struct partial_symtab *, char **, int, int, CORE_ADDR,
- struct partial_symtab **, int));
+static struct partial_symtab *os9k_end_psymtab (struct partial_symtab *,
+ char **, int, int, CORE_ADDR,
+ struct partial_symtab **,
+ int);
-static void
-record_minimal_symbol PARAMS ((char *, CORE_ADDR, int, struct objfile *,
- struct section_offsets *));
+static void record_minimal_symbol (char *, CORE_ADDR, int, struct objfile *);
\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, section_offsets)
- char *name;
- CORE_ADDR address;
- int type;
- struct objfile *objfile;
- struct section_offsets *section_offsets;
+record_minimal_symbol (char *name, CORE_ADDR address, int type,
+ struct objfile *objfile)
{
enum minimal_symbol_type ms_type;
{
case N_TEXT:
ms_type = mst_text;
- address += ANOFFSET (section_offsets, SECT_OFF_TEXT);
+ address += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
break;
case N_DATA:
ms_type = mst_data;
#define STBSYMSIZE 10
static void
-read_minimal_symbols (objfile, section_offsets)
- struct objfile *objfile;
- struct section_offsets *section_offsets;
+read_minimal_symbols (struct objfile *objfile)
{
FILE *fp;
bfd *abfd;
break;
ch = getc (fp);
};
- record_minimal_symbol (buf1, sym.value, sym.type & 7, objfile, section_offsets);
+ record_minimal_symbol (buf1, sym.value, sym.type & 7, objfile);
off += STBSYMSIZE;
};
install_minimal_symbols (objfile);
put all the relevant info into a "struct os9k_symfile_info",
hung off the objfile structure.
- SECTION_OFFSETS contains offsets relative to which the symbols in the
- various sections are (depending where the sections were actually loaded).
MAINLINE is true if we are reading the main symbol
table (as opposed to a shared lib or dynamically loaded file). */
static void
-os9k_symfile_read (objfile, mainline)
- struct objfile *objfile;
- int mainline; /* FIXME comments above */
+os9k_symfile_read (struct objfile *objfile, int mainline)
{
bfd *sym_bfd;
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)
+ if (mainline
+ || (objfile->global_psymbols.size == 0
+ && objfile->static_psymbols.size == 0))
init_psymbol_list (objfile, DBX_SYMCOUNT (objfile));
free_pending_blocks ();
back_to = make_cleanup (really_free_pendings, 0);
- make_cleanup ((make_cleanup_func) discard_minimal_symbols, 0);
- read_minimal_symbols (objfile, objfile->section_offsets);
+ make_cleanup_discard_minimal_symbols ();
+ read_minimal_symbols (objfile);
/* Now that the symbol table data of the executable file are all in core,
process them and define symbols accordingly. */
- read_os9k_psymtab (objfile->section_offsets, objfile,
+ read_os9k_psymtab (objfile,
DBX_TEXT_ADDR (objfile),
DBX_TEXT_SIZE (objfile));
file, e.g. a shared library). */
static void
-os9k_new_init (ignore)
- struct objfile *ignore;
+os9k_new_init (struct objfile *ignore)
{
stabsread_new_init ();
buildsym_new_init ();
FIXME, there should be a cleaner peephole into the BFD environment here. */
static void
-os9k_symfile_init (objfile)
- struct objfile *objfile;
+os9k_symfile_init (struct objfile *objfile)
{
bfd *sym_bfd = objfile->obfd;
char *name = bfd_get_filename (sym_bfd);
objfile struct from the global list of known objfiles. */
static void
-os9k_symfile_finish (objfile)
- struct objfile *objfile;
+os9k_symfile_finish (struct objfile *objfile)
{
if (objfile->sym_stab_info != NULL)
{
- mfree (objfile->md, objfile->sym_stab_info);
+ xmfree (objfile->md, objfile->sym_stab_info);
}
/*
free_header_files ();
#define VER_ULTRAC ((short)5)
static int
-fill_sym (dbg_file, abfd)
- FILE *dbg_file;
- bfd *abfd;
+fill_sym (FILE *dbg_file, bfd *abfd)
{
short si, nmask;
long li;
/* 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.
- SYMFILE_NAME is the name of the file we are reading from
- and SECTION_OFFSETS is the set of offsets for the various sections
- of the file (a set of zeros if the mainline program). */
+ SYMFILE_NAME is the name of the file we are reading from. */
static void
-read_os9k_psymtab (section_offsets, objfile, text_addr, text_size)
- struct section_offsets *section_offsets;
- struct objfile *objfile;
- CORE_ADDR text_addr;
- int text_size;
+read_os9k_psymtab (struct objfile *objfile, CORE_ADDR text_addr, int text_size)
{
register struct internal_symstruct *bufp = 0; /* =0 avoids gcc -Wall glitch */
register char *namestring;
#ifdef END_OF_TEXT_DEFAULT
end_of_text_addr = END_OF_TEXT_DEFAULT;
#else
- end_of_text_addr = text_addr + section_offsets->offsets[SECT_OFF_TEXT]
+ end_of_text_addr = text_addr + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile))
+ text_size; /* Relocate */
#endif
continue;
case N_SYM_SE:
- CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_TEXT);
+ CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
if (psymfile_depth == 1 && pst)
{
os9k_end_psymtab (pst, psymtab_include_list, includes_used,
valu = CUR_SYMBOL_VALUE;
if (valu)
- valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
+ valu += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
past_first_source_file = 1;
p = strchr (namestring, ':');
if (psymfile_depth == 0)
{
if (!pst)
- pst = os9k_start_psymtab (objfile, section_offsets,
+ pst = os9k_start_psymtab (objfile,
str, valu,
cursymoffset,
symnum - 1,
continue;
case 'f':
- CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_TEXT);
+ CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
if (pst && pst->textlow == 0)
pst->textlow = CUR_SYMBOL_VALUE;
continue;
case 'F':
- CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_TEXT);
+ CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
if (pst && pst->textlow == 0)
pst->textlow = CUR_SYMBOL_VALUE;
}
case N_SYM_RBRAC:
- CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_TEXT);
+ CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
#ifdef HANDLE_RBRAC
HANDLE_RBRAC (CUR_SYMBOL_VALUE);
continue;
static struct partial_symtab *
-os9k_start_psymtab (objfile, section_offsets,
- filename, textlow, ldsymoff, ldsymcnt, global_syms, static_syms)
- struct objfile *objfile;
- struct section_offsets *section_offsets;
- char *filename;
- CORE_ADDR textlow;
- int ldsymoff;
- int ldsymcnt;
- struct partial_symbol **global_syms;
- struct partial_symbol **static_syms;
+os9k_start_psymtab (struct objfile *objfile, char *filename, CORE_ADDR textlow,
+ int ldsymoff, int ldsymcnt,
+ struct partial_symbol **global_syms,
+ struct partial_symbol **static_syms)
{
struct partial_symtab *result =
- start_psymtab_common (objfile, section_offsets,
+ start_psymtab_common (objfile, objfile->section_offsets,
filename, textlow, global_syms, static_syms);
result->read_symtab_private = (char *)
FIXME: List variables and peculiarities of same. */
static struct partial_symtab *
-os9k_end_psymtab (pst, include_list, num_includes, capping_symbol_cnt,
- capping_text, dependency_list, number_dependencies)
- struct partial_symtab *pst;
- char **include_list;
- int num_includes;
- int capping_symbol_cnt;
- CORE_ADDR capping_text;
- struct partial_symtab **dependency_list;
- int number_dependencies;
- /* struct partial_symbol *capping_global, *capping_static; */
+os9k_end_psymtab (struct partial_symtab *pst, char **include_list,
+ int num_includes, int capping_symbol_cnt,
+ CORE_ADDR capping_text,
+ struct partial_symtab **dependency_list,
+ int number_dependencies)
{
int i;
struct partial_symtab *p1;
}
\f
static void
-os9k_psymtab_to_symtab_1 (pst)
- struct partial_symtab *pst;
+os9k_psymtab_to_symtab_1 (struct partial_symtab *pst)
{
struct cleanup *old_chain;
int i;
Be verbose about it if the user wants that. */
static void
-os9k_psymtab_to_symtab (pst)
- struct partial_symtab *pst;
+os9k_psymtab_to_symtab (struct partial_symtab *pst)
{
bfd *sym_bfd;
/* Read in a defined section of a specific object file's symbols. */
static void
-os9k_read_ofile_symtab (pst)
- struct partial_symtab *pst;
+os9k_read_ofile_symtab (struct partial_symtab *pst)
{
register struct internal_symstruct *bufp;
unsigned char type;
int sym_offset; /* Offset to start of symbols to read */
CORE_ADDR text_offset; /* Start of text segment for symbols */
int text_size; /* Size of text segment for symbols */
- struct section_offsets *section_offsets;
FILE *dbg_file;
objfile = pst->objfile;
max_symnum = LDSYMCNT (pst);
text_offset = pst->textlow;
text_size = pst->texthigh - pst->textlow;
- section_offsets = pst->section_offsets;
current_objfile = objfile;
subfile_stack = NULL;
type = bufp->n_type;
os9k_process_one_symbol ((int) type, (int) bufp->n_desc,
- (CORE_ADDR) bufp->n_value, bufp->n_strx, section_offsets, objfile);
+ (CORE_ADDR) bufp->n_value, bufp->n_strx, pst->section_offsets, objfile);
/* We skip checking for a new .o or -l file; that should never
happen in this routine. */
which comes from pst->textlow is correct. */
if (last_source_start_addr == 0)
last_source_start_addr = text_offset;
- pst->symtab = end_symtab (text_offset + text_size, objfile, SECT_OFF_TEXT);
+ pst->symtab = end_symtab (text_offset + text_size, objfile, SECT_OFF_TEXT (objfile));
end_stabs ();
}
\f
It is used in end_symtab. */
static void
-os9k_process_one_symbol (type, desc, valu, name, section_offsets, objfile)
- int type, desc;
- CORE_ADDR valu;
- char *name;
- struct section_offsets *section_offsets;
- struct objfile *objfile;
+os9k_process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
+ struct section_offsets *section_offsets,
+ struct objfile *objfile)
{
register struct context_stack *new;
/* The stab type used for the definition of the last function.
case N_SYM_LBRAC:
/* On most machines, the block addresses are relative to the
N_SO, the linker did not relocate them (sigh). */
- valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
+ valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
new = push_context (desc, valu);
break;
case N_SYM_RBRAC:
- valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
+ valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
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 += ANOFFSET (section_offsets, SECT_OFF_TEXT);
+ valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
/* FIXME: loses if sizeof (char *) > sizeof (int) */
+ gdb_assert (sizeof (name) <= sizeof (int));
record_line (current_subfile, (int) name, valu);
break;
switch (deftype)
{
case 'S':
- valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
+ valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
n = strrchr (name, '/');
if (n != NULL)
{
{
if (last_source_file)
{
- end_symtab (valu, objfile, SECT_OFF_TEXT);
+ end_symtab (valu, objfile, SECT_OFF_TEXT (objfile));
end_stabs ();
}
start_stabs ();
case 'f':
case 'F':
- valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
+ valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
function_stab_type = type;
within_function = 1;
case 'V':
case 'v':
- valu += ANOFFSET (section_offsets, SECT_OFF_DATA);
+ valu += ANOFFSET (section_offsets, SECT_OFF_DATA (objfile));
define_symbol (valu, name, desc, type, objfile);
break;
};
void
-_initialize_os9kread ()
+_initialize_os9kread (void)
{
add_symtab_fns (&os9k_sym_fns);
}