along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
-/* RS/6000 and PowerPC only:
- Needs xcoff_add_toc_to_loadinfo and xcoff_init_loadinfo in
- rs6000-tdep.c from target.
- However, if you define FAKING_RS6000, then this code will link with
- any target. */
-
#include "defs.h"
#include "bfd.h"
/* This is output from LD. */
#define N_SETV 0x1C /* Pointer to set vector in data area. */
+
+/* Hook for recording the toc offset value of a symbol table into
+ the ldinfo structure. */
+
+void (*xcoff_add_toc_to_loadinfo_hook) PARAMS ((unsigned long)) = NULL;
+
+/* Hook for recording how to call xcoff_init_loadinfo for a native
+ rs6000 config only. */
+
+void (*xcoff_init_loadinfo_hook) PARAMS ((void)) = NULL;
+
\f
/* We put a pointer to this structure in the read_symtab_private field
of the psymtab. */
static struct complaint eb_complaint =
{"Mismatched .eb symbol ignored starting at symnum %d", 0, 0};
+static void
+xcoff_initial_scan PARAMS ((struct objfile *, struct section_offsets *, int));
+
+static void
+scan_xcoff_symtab PARAMS ((struct section_offsets *, struct objfile *));
+
+static char *
+xcoff_next_symbol_text PARAMS ((struct objfile *));
+
+static void
+record_include_begin PARAMS ((struct coff_symbol *));
+
static void
enter_line_range PARAMS ((struct subfile *, unsigned, unsigned,
CORE_ADDR, CORE_ADDR, unsigned *));
static void
read_xcoff_symtab PARAMS ((struct partial_symtab *));
+#if 0
static void
add_stab_to_list PARAMS ((char *, struct pending_stabs **));
+#endif
+
+static int
+compare_lte PARAMS ((const void *, const void *));
+
+static struct linetable *
+arrange_linetable PARAMS ((struct linetable *));
+
+static void
+record_include_end PARAMS ((struct coff_symbol *));
+
+static void
+process_linenos PARAMS ((CORE_ADDR, CORE_ADDR));
\f
/* Translate from a COFF section number (target_index) to a SECT_OFF_*
\f
/* add a given stab string into given stab vector. */
+#if 0
+
static void
add_stab_to_list (stabname, stabvector)
char *stabname;
}
(*stabvector)->stab [(*stabvector)->count++] = stabname;
}
+
+#endif
+
\f
/* Linenos are processed on a file-by-file basis.
/* compare line table entry addresses. */
static int
-compare_lte (lte1, lte2)
- struct linetable_entry *lte1, *lte2;
+compare_lte (lte1p, lte2p)
+ const void *lte1p;
+ const void *lte2p;
{
+ struct linetable_entry *lte1 = (struct linetable_entry *) lte1p;
+ struct linetable_entry *lte2 = (struct linetable_entry *) lte2p;
return lte1->pc - lte2->pc;
}
-/* Give a line table with function entries are marked, arrange its functions
- in assending order and strip off function entry markers and return it in
+/* Given a line table with function entries are marked, arrange its functions
+ in ascending order and strip off function entry markers and return it in
a newly created table. If the old one is good enough, return the old one. */
/* FIXME: I think all this stuff can be replaced by just passing
sort_linevec = 1 to end_symtab. */
/* This is the function which stabsread.c calls to get symbol
continuations. */
+
static char *
xcoff_next_symbol_text (objfile)
struct objfile *objfile;
#define SYMNAME_ALLOC(NAME, ALLOCED) \
- (ALLOCED) ? (NAME) : obstack_copy0 (&objfile->symbol_obstack, (NAME), strlen (NAME));
+ (ALLOCED) ? (NAME) : obsavestring ((NAME), strlen (NAME), &objfile->symbol_obstack);
static struct type *func_symbol_type;
static struct partial_symtab *xcoff_start_psymtab
PARAMS ((struct objfile *, struct section_offsets *, char *, int,
- struct partial_symbol *, struct partial_symbol *));
+ struct partial_symbol **, struct partial_symbol **));
/* Allocate and partially fill a partial symtab. It will be
completely filled at the end of the symbol list.
struct section_offsets *section_offsets;
char *filename;
int first_symnum;
- struct partial_symbol *global_syms;
- struct partial_symbol *static_syms;
+ struct partial_symbol **global_syms;
+ struct partial_symbol **static_syms;
{
struct partial_symtab *result =
start_psymtab_common (objfile, section_offsets,
static struct partial_symtab *xcoff_end_psymtab
PARAMS ((struct partial_symtab *, char **, int, int,
- struct partial_symtab **, int));
+ struct partial_symtab **, int, int));
/* Close off the current usage of PST.
Returns PST, or NULL if the partial symtab was empty and thrown away.
static struct partial_symtab *
xcoff_end_psymtab (pst, include_list, num_includes, capping_symbol_number,
- dependency_list, number_dependencies)
+ dependency_list, number_dependencies, textlow_not_set)
struct partial_symtab *pst;
char **include_list;
int num_includes;
int capping_symbol_number;
struct partial_symtab **dependency_list;
int number_dependencies;
+ int textlow_not_set;
{
int i;
struct objfile *objfile = pst -> objfile;
CORE_ADDR last_csect_val = 0;
int last_csect_sec = 0;
int misc_func_recorded = 0; /* true if any misc. function */
+ int textlow_not_set = 1;
pst = (struct partial_symtab *) 0;
each program csect, because their text
sections need not be adjacent. */
xcoff_end_psymtab
- (pst, psymtab_include_list,
- includes_used,
- symnum_before,
- dependency_list, dependencies_used);
+ (pst, psymtab_include_list, includes_used,
+ symnum_before, dependency_list,
+ dependencies_used, textlow_not_set);
includes_used = 0;
dependencies_used = 0;
/* Give all psymtabs for this source file the same
if (pst)
{
xcoff_end_psymtab (pst, psymtab_include_list, includes_used,
- symnum_before,
- dependency_list, dependencies_used);
+ symnum_before, dependency_list,
+ dependencies_used, textlow_not_set);
includes_used = 0;
dependencies_used = 0;
}
called from DBXREAD_ONLY or N_SO code. Likewise for the symnum
variable. */
#define START_PSYMTAB(ofile,secoff,fname,low,symoff,global_syms,static_syms) 0
-#define END_PSYMTAB(pst,ilist,ninc,c_off,c_text,dep_list,n_deps)\
+#define END_PSYMTAB(pst,ilist,ninc,c_off,c_text,dep_list,n_deps,textlow_not_set)\
do {} while (0)
/* We have already set the namestring. */
#define SET_NAMESTRING() /* */
if (pst)
{
xcoff_end_psymtab (pst, psymtab_include_list, includes_used,
- ssymnum,
- dependency_list, dependencies_used);
+ ssymnum, dependency_list,
+ dependencies_used, textlow_not_set);
}
/* Record the toc offset value of this symbol table into ldinfo structure.
If no XMC_TC0 is found, toc_offset should be zero. Another place to obtain
this information would be file auxiliary header. */
-#ifndef FAKING_RS6000
- xcoff_add_toc_to_loadinfo (toc_offset);
-#endif
+ if (xcoff_add_toc_to_loadinfo_hook != NULL)
+ (*xcoff_add_toc_to_loadinfo_hook) ((unsigned long) toc_offset);
}
/* Scan and build partial symbols for a symbol file.
char *name;
unsigned int size;
-#ifndef FAKING_RS6000
/* Initialize load info structure. */
- if (mainline)
- xcoff_init_loadinfo ();
-#endif
+ if (mainline && xcoff_init_loadinfo_hook != NULL)
+ (*xcoff_init_loadinfo_hook) ();
info = (struct coff_symfile_info *) objfile -> sym_private;
symfile_bfd = abfd = objfile->obfd;
include N_SLINE. */
init_psymbol_list (objfile, num_symbols);
- pending_blocks = 0;
+ free_pending_blocks ();
back_to = make_cleanup (really_free_pendings, 0);
init_minimal_symbol_collection ();