* mdebugread.c (parse_partial_symbols): Reset includes_used
and dependencies_used after finishing the partial symbol table. * rs6000-nat.c (xcoff_relocate_core): Don't relocate data addresses for the main objfile if DONT_RELOCATE_SYMFILE_OBJFILE is defined. * xcoffread.c: gcc -Wall lint. Remove traceback table reading code. The existing code tried to add parameter information for functions compiled without -g, which cannot be done properly for optimized code and produced misleading parameter displays. (ef_complaint, eb_complaint): Make a local static copy to avoid dependency on coffread.c. (read_xcoff_symtab, process_xcoff_symbol, scan_xcoff_symtab): Enter C_EXT/C_HIDEXT symbols into the minimal symbol table only. (read_xcoff_symtab): Ignore C_STAT section auxiliary entry symbols. Complain about unmatched .ef and .eb symbols instead of segfaulting. (process_xcoff_symbol): Determine value of C_GSYM symbols via the global_sym_chain mechanism in stabsread.c. (xcoff_new_init): Call stabsread_new_init and buildsym_new_init. (init_string_tab): Initialize length field bytes in the strtbl. (scan_xcoff_symtab): Skip symbols that start with `$' or `.$'. Set first_fun_line_offset for symbols with two auxents only.
This commit is contained in:
parent
138b9b81e3
commit
df1e1074de
|
@ -1,3 +1,29 @@
|
||||||
|
Sat Sep 23 01:22:23 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de)
|
||||||
|
|
||||||
|
* mdebugread.c (parse_partial_symbols): Reset includes_used
|
||||||
|
and dependencies_used after finishing the partial symbol table.
|
||||||
|
|
||||||
|
* rs6000-nat.c (xcoff_relocate_core): Don't relocate data
|
||||||
|
addresses for the main objfile if DONT_RELOCATE_SYMFILE_OBJFILE
|
||||||
|
is defined.
|
||||||
|
* xcoffread.c: gcc -Wall lint. Remove traceback table reading
|
||||||
|
code. The existing code tried to add parameter information for
|
||||||
|
functions compiled without -g, which cannot be done properly
|
||||||
|
for optimized code and produced misleading parameter displays.
|
||||||
|
(ef_complaint, eb_complaint): Make a local static copy to avoid
|
||||||
|
dependency on coffread.c.
|
||||||
|
(read_xcoff_symtab, process_xcoff_symbol, scan_xcoff_symtab):
|
||||||
|
Enter C_EXT/C_HIDEXT symbols into the minimal symbol table only.
|
||||||
|
(read_xcoff_symtab): Ignore C_STAT section auxiliary entry
|
||||||
|
symbols. Complain about unmatched .ef and .eb symbols instead of
|
||||||
|
segfaulting.
|
||||||
|
(process_xcoff_symbol): Determine value of C_GSYM symbols via
|
||||||
|
the global_sym_chain mechanism in stabsread.c.
|
||||||
|
(xcoff_new_init): Call stabsread_new_init and buildsym_new_init.
|
||||||
|
(init_string_tab): Initialize length field bytes in the strtbl.
|
||||||
|
(scan_xcoff_symtab): Skip symbols that start with `$' or `.$'.
|
||||||
|
Set first_fun_line_offset for symbols with two auxents only.
|
||||||
|
|
||||||
Wed Sep 20 21:06:35 1995 Jeff Law (law@snake.cs.utah.edu)
|
Wed Sep 20 21:06:35 1995 Jeff Law (law@snake.cs.utah.edu)
|
||||||
|
|
||||||
* op50-rom.c (op50n_cmds): Send ".\r" after the interrupt
|
* op50-rom.c (op50n_cmds): Send ".\r" after the interrupt
|
||||||
|
|
|
@ -2922,6 +2922,9 @@ parse_partial_symbols (objfile, section_offsets)
|
||||||
psymtab_include_list, includes_used,
|
psymtab_include_list, includes_used,
|
||||||
-1, save_pst->texthigh,
|
-1, save_pst->texthigh,
|
||||||
dependency_list, dependencies_used);
|
dependency_list, dependencies_used);
|
||||||
|
includes_used = 0;
|
||||||
|
dependencies_used = 0;
|
||||||
|
|
||||||
if (objfile->ei.entry_point >= save_pst->textlow &&
|
if (objfile->ei.entry_point >= save_pst->textlow &&
|
||||||
objfile->ei.entry_point < save_pst->texthigh)
|
objfile->ei.entry_point < save_pst->texthigh)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
/* IBM RS/6000 native-dependent code for GDB, the GNU debugger.
|
/* IBM RS/6000 native-dependent code for GDB, the GNU debugger.
|
||||||
Copyright 1986, 1987, 1989, 1991, 1992, 1994 Free Software Foundation, Inc.
|
Copyright 1986, 1987, 1989, 1991, 1992, 1994, 1995
|
||||||
|
Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GDB.
|
This file is part of GDB.
|
||||||
|
|
||||||
|
@ -717,6 +718,14 @@ xcoff_relocate_core (target)
|
||||||
vp->dstart = (CORE_ADDR) ldip->ldinfo_dataorg;
|
vp->dstart = (CORE_ADDR) ldip->ldinfo_dataorg;
|
||||||
vp->dend = vp->dstart + ldip->ldinfo_datasize;
|
vp->dend = vp->dstart + ldip->ldinfo_datasize;
|
||||||
|
|
||||||
|
#ifdef DONT_RELOCATE_SYMFILE_OBJFILE
|
||||||
|
if (vp == vmap)
|
||||||
|
{
|
||||||
|
vp->dstart = (CORE_ADDR) 0;
|
||||||
|
vp->dend = ldip->ldinfo_datasize;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (vp->tadj != 0)
|
if (vp->tadj != 0)
|
||||||
{
|
{
|
||||||
vp->tstart += vp->tadj;
|
vp->tstart += vp->tadj;
|
||||||
|
|
537
gdb/xcoffread.c
537
gdb/xcoffread.c
|
@ -20,11 +20,11 @@ You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
||||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
/* Native only: Need struct tbtable in <sys/debug.h> from host, and
|
/* RS/6000 and PowerPC only:
|
||||||
need xcoff_add_toc_to_loadinfo in rs6000-tdep.c from target.
|
Needs xcoff_add_toc_to_loadinfo and xcoff_init_loadinfo in
|
||||||
need xcoff_init_loadinfo ditto.
|
rs6000-tdep.c from target.
|
||||||
However, if you grab <sys/debug.h> and make it available on your
|
However, if you define FAKING_RS6000, then this code will link with
|
||||||
host, and define FAKING_RS6000, then this code will compile. */
|
any target. */
|
||||||
|
|
||||||
#include "defs.h"
|
#include "defs.h"
|
||||||
#include "bfd.h"
|
#include "bfd.h"
|
||||||
|
@ -34,13 +34,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include "gdb_string.h"
|
#include "gdb_string.h"
|
||||||
|
|
||||||
#include "obstack.h"
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#ifndef NO_SYS_FILE
|
#ifndef NO_SYS_FILE
|
||||||
#include <sys/file.h>
|
#include <sys/file.h>
|
||||||
#endif
|
#endif
|
||||||
#include "gdb_stat.h"
|
#include "gdb_stat.h"
|
||||||
#include <sys/debug.h>
|
|
||||||
|
|
||||||
#include "coff/internal.h"
|
#include "coff/internal.h"
|
||||||
#include "libcoff.h" /* FIXME, internal data from BFD */
|
#include "libcoff.h" /* FIXME, internal data from BFD */
|
||||||
|
@ -52,6 +50,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||||
#include "objfiles.h"
|
#include "objfiles.h"
|
||||||
#include "buildsym.h"
|
#include "buildsym.h"
|
||||||
#include "stabsread.h"
|
#include "stabsread.h"
|
||||||
|
#include "expression.h"
|
||||||
|
#include "language.h" /* Needed inside partial-stab.h */
|
||||||
#include "complaints.h"
|
#include "complaints.h"
|
||||||
|
|
||||||
#include "gdb-stabs.h"
|
#include "gdb-stabs.h"
|
||||||
|
@ -133,11 +133,6 @@ struct coff_symbol {
|
||||||
unsigned int c_type;
|
unsigned int c_type;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* The COFF line table, in raw form. */
|
|
||||||
static char *linetab = NULL; /* Its actual contents */
|
|
||||||
static long linetab_offset; /* Its offset in the file */
|
|
||||||
static unsigned long linetab_size; /* Its size */
|
|
||||||
|
|
||||||
/* last function's saved coff symbol `cs' */
|
/* last function's saved coff symbol `cs' */
|
||||||
|
|
||||||
static struct coff_symbol fcn_cs_saved;
|
static struct coff_symbol fcn_cs_saved;
|
||||||
|
@ -187,17 +182,17 @@ struct coff_symfile_info {
|
||||||
int symtbl_num_syms;
|
int symtbl_num_syms;
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct complaint rsym_complaint =
|
|
||||||
{"Non-stab C_RSYM `%s' needs special handling", 0, 0};
|
|
||||||
|
|
||||||
static struct complaint storclass_complaint =
|
static struct complaint storclass_complaint =
|
||||||
{"Unexpected storage class: %d", 0, 0};
|
{"Unexpected storage class: %d", 0, 0};
|
||||||
|
|
||||||
static struct complaint bf_notfound_complaint =
|
static struct complaint bf_notfound_complaint =
|
||||||
{"line numbers off, `.bf' symbol not found", 0, 0};
|
{"line numbers off, `.bf' symbol not found", 0, 0};
|
||||||
|
|
||||||
extern struct complaint ef_complaint;
|
static struct complaint ef_complaint =
|
||||||
extern struct complaint eb_complaint;
|
{"Mismatched .ef symbol ignored starting at symnum %d", 0, 0};
|
||||||
|
|
||||||
|
static struct complaint eb_complaint =
|
||||||
|
{"Mismatched .eb symbol ignored starting at symnum %d", 0, 0};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
enter_line_range PARAMS ((struct subfile *, unsigned, unsigned,
|
enter_line_range PARAMS ((struct subfile *, unsigned, unsigned,
|
||||||
|
@ -546,7 +541,6 @@ static void
|
||||||
process_linenos (start, end)
|
process_linenos (start, end)
|
||||||
CORE_ADDR start, end;
|
CORE_ADDR start, end;
|
||||||
{
|
{
|
||||||
char *pp;
|
|
||||||
int offset, ii;
|
int offset, ii;
|
||||||
file_ptr max_offset =
|
file_ptr max_offset =
|
||||||
((struct coff_symfile_info *)this_symtab_psymtab->objfile->sym_private)
|
((struct coff_symfile_info *)this_symtab_psymtab->objfile->sym_private)
|
||||||
|
@ -560,10 +554,9 @@ process_linenos (start, end)
|
||||||
All the following line numbers in the function are relative to
|
All the following line numbers in the function are relative to
|
||||||
this, and we record absolute line numbers in record_line(). */
|
this, and we record absolute line numbers in record_line(). */
|
||||||
|
|
||||||
int main_source_baseline = 0;
|
unsigned int main_source_baseline = 0;
|
||||||
|
|
||||||
unsigned *firstLine;
|
unsigned *firstLine;
|
||||||
CORE_ADDR addr;
|
|
||||||
|
|
||||||
offset =
|
offset =
|
||||||
((struct symloc *)this_symtab_psymtab->read_symtab_private)->lineno_off;
|
((struct symloc *)this_symtab_psymtab->read_symtab_private)->lineno_off;
|
||||||
|
@ -803,166 +796,6 @@ enter_line_range (subfile, beginoffset, endoffset, startaddr, endaddr,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int fsize; /* file size */
|
|
||||||
int fixedparms; /* number of fixed parms */
|
|
||||||
int floatparms; /* number of float parms */
|
|
||||||
unsigned int parminfo; /* parameter info.
|
|
||||||
See /usr/include/sys/debug.h
|
|
||||||
tbtable_ext.parminfo */
|
|
||||||
int framesize; /* function frame size */
|
|
||||||
} TracebackInfo;
|
|
||||||
|
|
||||||
static TracebackInfo *retrieve_tracebackinfo
|
|
||||||
PARAMS ((bfd *, struct coff_symbol *));
|
|
||||||
|
|
||||||
/* Given a function symbol, return its traceback information. */
|
|
||||||
|
|
||||||
static TracebackInfo *
|
|
||||||
retrieve_tracebackinfo (abfd, cs)
|
|
||||||
bfd *abfd;
|
|
||||||
struct coff_symbol *cs;
|
|
||||||
{
|
|
||||||
#define TBTABLE_BUFSIZ 2000
|
|
||||||
|
|
||||||
static TracebackInfo tbInfo;
|
|
||||||
struct tbtable *ptb;
|
|
||||||
|
|
||||||
static char buffer [TBTABLE_BUFSIZ];
|
|
||||||
|
|
||||||
int *pinsn;
|
|
||||||
int bytesread=0; /* total # of bytes read so far */
|
|
||||||
int bufferbytes; /* number of bytes in the buffer */
|
|
||||||
int functionstart;
|
|
||||||
|
|
||||||
asection *textsec;
|
|
||||||
|
|
||||||
/* FIXME: Should be looking through all sections, based on the
|
|
||||||
address we are considering. Just using ".text" loses if more
|
|
||||||
than one section has code in it. */
|
|
||||||
textsec = bfd_get_section_by_name (abfd, ".text");
|
|
||||||
if (!textsec)
|
|
||||||
{
|
|
||||||
#if 0
|
|
||||||
/* If there is only data, no text, that is OK. */
|
|
||||||
printf_unfiltered ("Unable to locate text section!\n");
|
|
||||||
#endif
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
functionstart = cs->c_value - textsec->vma;
|
|
||||||
|
|
||||||
memset (&tbInfo, '\0', sizeof (tbInfo));
|
|
||||||
|
|
||||||
/* keep reading blocks of data from the text section, until finding a zero
|
|
||||||
word and a traceback table. */
|
|
||||||
|
|
||||||
/* Note: The logical thing way to write this code would be to assign
|
|
||||||
to bufferbytes within the while condition. But that triggers a
|
|
||||||
compiler (xlc in AIX 3.2) bug, so simplify it... */
|
|
||||||
bufferbytes =
|
|
||||||
(TBTABLE_BUFSIZ < (textsec->_raw_size - functionstart - bytesread) ?
|
|
||||||
TBTABLE_BUFSIZ : (textsec->_raw_size - functionstart - bytesread));
|
|
||||||
while (bufferbytes
|
|
||||||
&& (bfd_get_section_contents
|
|
||||||
(abfd, textsec, buffer,
|
|
||||||
(file_ptr)(functionstart + bytesread), bufferbytes)))
|
|
||||||
{
|
|
||||||
bytesread += bufferbytes;
|
|
||||||
pinsn = (int*) buffer;
|
|
||||||
|
|
||||||
/* If this is the first time we filled the buffer, retrieve function
|
|
||||||
framesize info. */
|
|
||||||
|
|
||||||
if (bytesread == bufferbytes) {
|
|
||||||
|
|
||||||
/* skip over unrelated instructions */
|
|
||||||
|
|
||||||
if (*pinsn == 0x7c0802a6) /* mflr r0 */
|
|
||||||
++pinsn;
|
|
||||||
if ((*pinsn & 0xfc00003e) == 0x7c000026) /* mfcr Rx */
|
|
||||||
++pinsn;
|
|
||||||
if ((*pinsn & 0xfc000000) == 0x48000000) /* bl foo, save fprs */
|
|
||||||
++pinsn;
|
|
||||||
if ((*pinsn & 0xfc1f0000) == 0xbc010000) /* stm Rx, NUM(r1) */
|
|
||||||
++pinsn;
|
|
||||||
|
|
||||||
do {
|
|
||||||
int tmp = (*pinsn >> 16) & 0xffff;
|
|
||||||
|
|
||||||
if (tmp == 0x9421) { /* stu r1, NUM(r1) */
|
|
||||||
tbInfo.framesize = 0x10000 - (*pinsn & 0xffff);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if ((*pinsn == 0x93e1fffc) || /* st r31,-4(r1) */
|
|
||||||
(tmp == 0x9001)) /* st r0, NUM(r1) */
|
|
||||||
;
|
|
||||||
/* else, could not find a frame size. */
|
|
||||||
else
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
} while (++pinsn && *pinsn);
|
|
||||||
|
|
||||||
if (!tbInfo.framesize)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* look for a zero word. */
|
|
||||||
|
|
||||||
while (*pinsn && (pinsn < (int*)(buffer + bufferbytes - sizeof(int))))
|
|
||||||
++pinsn;
|
|
||||||
|
|
||||||
if (pinsn >= (int*)(buffer + bufferbytes))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (*pinsn == 0) {
|
|
||||||
|
|
||||||
/* function size is the amount of bytes we have skipped so far. */
|
|
||||||
tbInfo.fsize = bytesread - (buffer + bufferbytes - (char*)pinsn);
|
|
||||||
|
|
||||||
++pinsn;
|
|
||||||
|
|
||||||
/* if we don't have the whole traceback table in the buffer, re-read
|
|
||||||
the whole thing. */
|
|
||||||
|
|
||||||
/* This is how much to read to get the traceback table.
|
|
||||||
8 bytes of the traceback table are always present, plus we
|
|
||||||
look at parminfo. */
|
|
||||||
#define MIN_TBTABSIZ 12
|
|
||||||
|
|
||||||
if ((char*)pinsn > (buffer + bufferbytes - MIN_TBTABSIZ)) {
|
|
||||||
|
|
||||||
/* In case if we are *very* close to the end of the text section
|
|
||||||
and cannot read properly from that point on, abort by returning
|
|
||||||
NULL.
|
|
||||||
|
|
||||||
This could happen if the traceback table is only 8 bytes,
|
|
||||||
but we try to read 12 bytes of it.
|
|
||||||
Handle this case more graciously -- FIXME */
|
|
||||||
|
|
||||||
if (!bfd_get_section_contents (
|
|
||||||
abfd, textsec, buffer,
|
|
||||||
(file_ptr)(functionstart +
|
|
||||||
bytesread - (buffer + bufferbytes - (char*)pinsn)),MIN_TBTABSIZ))
|
|
||||||
{ printf_unfiltered ("Abnormal return!..\n"); return NULL; }
|
|
||||||
|
|
||||||
ptb = (struct tbtable *)buffer;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
ptb = (struct tbtable *)pinsn;
|
|
||||||
|
|
||||||
tbInfo.fixedparms = ptb->tb.fixedparms;
|
|
||||||
tbInfo.floatparms = ptb->tb.floatparms;
|
|
||||||
tbInfo.parminfo = ptb->tb_ext.parminfo;
|
|
||||||
return &tbInfo;
|
|
||||||
}
|
|
||||||
bufferbytes =
|
|
||||||
(TBTABLE_BUFSIZ < (textsec->_raw_size - functionstart - bytesread) ?
|
|
||||||
TBTABLE_BUFSIZ : (textsec->_raw_size - functionstart - bytesread));
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Save the vital information for use when closing off the current file.
|
/* Save the vital information for use when closing off the current file.
|
||||||
NAME is the file name the symbols came from, START_ADDR is the first
|
NAME is the file name the symbols came from, START_ADDR is the first
|
||||||
|
@ -994,25 +827,6 @@ retrieve_tracebackinfo (abfd, cs)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* A parameter template, used by ADD_PARM_TO_PENDING. It is initialized
|
|
||||||
in our initializer function at the bottom of the file, to avoid
|
|
||||||
dependencies on the exact "struct symbol" format. */
|
|
||||||
|
|
||||||
static struct symbol parmsym;
|
|
||||||
|
|
||||||
/* Add a parameter to a given pending symbol list. */
|
|
||||||
|
|
||||||
#define ADD_PARM_TO_PENDING(PARM, VALUE, PTYPE, PENDING_SYMBOLS) \
|
|
||||||
{ \
|
|
||||||
PARM = (struct symbol *) \
|
|
||||||
obstack_alloc (&objfile->symbol_obstack, sizeof (struct symbol)); \
|
|
||||||
*(PARM) = parmsym; \
|
|
||||||
SYMBOL_TYPE (PARM) = PTYPE; \
|
|
||||||
SYMBOL_VALUE (PARM) = VALUE; \
|
|
||||||
add_symbol_to_list (PARM, &PENDING_SYMBOLS); \
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* xcoff has static blocks marked in `.bs', `.es' pairs. They cannot be
|
/* xcoff has static blocks marked in `.bs', `.es' pairs. They cannot be
|
||||||
nested. At any given time, a symbol can only be in one static block.
|
nested. At any given time, a symbol can only be in one static block.
|
||||||
This is the base address of current static block, zero if non exists. */
|
This is the base address of current static block, zero if non exists. */
|
||||||
|
@ -1080,7 +894,6 @@ read_xcoff_symtab (pst)
|
||||||
struct objfile *objfile = pst->objfile;
|
struct objfile *objfile = pst->objfile;
|
||||||
bfd *abfd = objfile->obfd;
|
bfd *abfd = objfile->obfd;
|
||||||
char *raw_auxptr; /* Pointer to first raw aux entry for sym */
|
char *raw_auxptr; /* Pointer to first raw aux entry for sym */
|
||||||
TracebackInfo *ptb; /* Pointer to traceback table */
|
|
||||||
char *strtbl = ((struct coff_symfile_info *)objfile->sym_private)->strtbl;
|
char *strtbl = ((struct coff_symfile_info *)objfile->sym_private)->strtbl;
|
||||||
char *debugsec =
|
char *debugsec =
|
||||||
((struct coff_symfile_info *)objfile->sym_private)->debugsec;
|
((struct coff_symfile_info *)objfile->sym_private)->debugsec;
|
||||||
|
@ -1095,15 +908,12 @@ read_xcoff_symtab (pst)
|
||||||
unsigned int max_symnum;
|
unsigned int max_symnum;
|
||||||
int just_started = 1;
|
int just_started = 1;
|
||||||
int depth = 0;
|
int depth = 0;
|
||||||
int val;
|
int fcn_start_addr = 0;
|
||||||
int fcn_start_addr;
|
|
||||||
size_t size;
|
|
||||||
|
|
||||||
struct coff_symbol fcn_stab_saved;
|
struct coff_symbol fcn_stab_saved;
|
||||||
|
|
||||||
/* fcn_cs_saved is global because process_xcoff_symbol needs it. */
|
/* fcn_cs_saved is global because process_xcoff_symbol needs it. */
|
||||||
union internal_auxent fcn_aux_saved;
|
union internal_auxent fcn_aux_saved;
|
||||||
struct type *fcn_type_saved = NULL;
|
|
||||||
struct context_stack *new;
|
struct context_stack *new;
|
||||||
|
|
||||||
char *filestring = " _start_ "; /* Name of the current file. */
|
char *filestring = " _start_ "; /* Name of the current file. */
|
||||||
|
@ -1111,7 +921,6 @@ read_xcoff_symtab (pst)
|
||||||
char *last_csect_name; /* last seen csect's name and value */
|
char *last_csect_name; /* last seen csect's name and value */
|
||||||
CORE_ADDR last_csect_val;
|
CORE_ADDR last_csect_val;
|
||||||
int last_csect_sec;
|
int last_csect_sec;
|
||||||
int misc_func_recorded; /* true if any misc. function */
|
|
||||||
|
|
||||||
this_symtab_psymtab = pst;
|
this_symtab_psymtab = pst;
|
||||||
|
|
||||||
|
@ -1122,7 +931,6 @@ read_xcoff_symtab (pst)
|
||||||
last_source_file = NULL;
|
last_source_file = NULL;
|
||||||
last_csect_name = 0;
|
last_csect_name = 0;
|
||||||
last_csect_val = 0;
|
last_csect_val = 0;
|
||||||
misc_func_recorded = 0;
|
|
||||||
|
|
||||||
start_stabs ();
|
start_stabs ();
|
||||||
start_symtab (filestring, (char *)NULL, file_start_addr);
|
start_symtab (filestring, (char *)NULL, file_start_addr);
|
||||||
|
@ -1307,15 +1115,13 @@ read_xcoff_symtab (pst)
|
||||||
last_csect_sec = secnum_to_section (cs->c_secnum, objfile);
|
last_csect_sec = secnum_to_section (cs->c_secnum, objfile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
misc_func_recorded = 0;
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
case XMC_RW :
|
/* All other symbols are put into the minimal symbol
|
||||||
break;
|
table only. */
|
||||||
|
|
||||||
/* If the section is not a data description,
|
case XMC_RW:
|
||||||
ignore it. Note that uninitialized data will
|
continue;
|
||||||
show up as XTY_CM/XMC_RW pair. */
|
|
||||||
|
|
||||||
case XMC_TC0:
|
case XMC_TC0:
|
||||||
continue;
|
continue;
|
||||||
|
@ -1344,101 +1150,6 @@ read_xcoff_symtab (pst)
|
||||||
when `.bf' is seen. */
|
when `.bf' is seen. */
|
||||||
fcn_cs_saved = *cs;
|
fcn_cs_saved = *cs;
|
||||||
fcn_aux_saved = main_aux;
|
fcn_aux_saved = main_aux;
|
||||||
|
|
||||||
ptb = NULL;
|
|
||||||
|
|
||||||
/* If function has two auxent, then debugging information is
|
|
||||||
already available for it. Process traceback table for
|
|
||||||
functions with only one auxent. */
|
|
||||||
|
|
||||||
if (cs->c_naux == 1)
|
|
||||||
ptb = retrieve_tracebackinfo (abfd, cs);
|
|
||||||
|
|
||||||
else if (cs->c_naux != 2)
|
|
||||||
{
|
|
||||||
static struct complaint msg =
|
|
||||||
{"Expected one or two auxents for function", 0, 0};
|
|
||||||
complain (&msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If there is traceback info, create and add parameters
|
|
||||||
for it. */
|
|
||||||
|
|
||||||
if (ptb && (ptb->fixedparms || ptb->floatparms))
|
|
||||||
{
|
|
||||||
|
|
||||||
int parmcnt = ptb->fixedparms + ptb->floatparms;
|
|
||||||
char *parmcode = (char*) &ptb->parminfo;
|
|
||||||
|
|
||||||
/* The link area is 0x18 bytes. */
|
|
||||||
int parmvalue = ptb->framesize + 0x18;
|
|
||||||
unsigned int ii, mask;
|
|
||||||
|
|
||||||
for (ii=0, mask = 0x80000000; ii <parmcnt; ++ii)
|
|
||||||
{
|
|
||||||
struct symbol *parm;
|
|
||||||
|
|
||||||
if (ptb->parminfo & mask)
|
|
||||||
{
|
|
||||||
/* float or double */
|
|
||||||
mask = mask >> 1;
|
|
||||||
if (ptb->parminfo & mask)
|
|
||||||
{
|
|
||||||
/* double parm */
|
|
||||||
ADD_PARM_TO_PENDING
|
|
||||||
(parm, parmvalue, builtin_type_double,
|
|
||||||
local_symbols);
|
|
||||||
parmvalue += sizeof (double);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* float parm */
|
|
||||||
ADD_PARM_TO_PENDING
|
|
||||||
(parm, parmvalue, builtin_type_float,
|
|
||||||
local_symbols);
|
|
||||||
parmvalue += sizeof (float);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
static struct type *intparm_type;
|
|
||||||
if (intparm_type == NULL)
|
|
||||||
{
|
|
||||||
|
|
||||||
/* Create a type, which is a pointer
|
|
||||||
type (a kludge to make it print
|
|
||||||
in hex), but which has a name
|
|
||||||
indicating we don't know the real
|
|
||||||
type. */
|
|
||||||
|
|
||||||
intparm_type =
|
|
||||||
init_type
|
|
||||||
(TYPE_CODE_PTR,
|
|
||||||
TARGET_PTR_BIT / HOST_CHAR_BIT,
|
|
||||||
0,
|
|
||||||
"<non-float parameter>",
|
|
||||||
NULL);
|
|
||||||
TYPE_TARGET_TYPE (intparm_type) =
|
|
||||||
builtin_type_void;
|
|
||||||
}
|
|
||||||
ADD_PARM_TO_PENDING
|
|
||||||
(parm, parmvalue,
|
|
||||||
intparm_type,
|
|
||||||
local_symbols);
|
|
||||||
parmvalue += sizeof (int);
|
|
||||||
}
|
|
||||||
mask = mask >> 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Fake this as a function. Needed in
|
|
||||||
process_xcoff_symbol(). */
|
|
||||||
cs->c_type = 32;
|
|
||||||
|
|
||||||
finish_block
|
|
||||||
(process_xcoff_symbol (cs, objfile), &local_symbols,
|
|
||||||
pending_blocks, cs->c_value,
|
|
||||||
cs->c_value + ptb->fsize, objfile);
|
|
||||||
}
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
case XMC_GL:
|
case XMC_GL:
|
||||||
|
@ -1454,11 +1165,17 @@ read_xcoff_symtab (pst)
|
||||||
/* xlc puts each variable in a separate csect, so we get
|
/* xlc puts each variable in a separate csect, so we get
|
||||||
an XTY_SD for each variable. But gcc puts several
|
an XTY_SD for each variable. But gcc puts several
|
||||||
variables in a csect, so that each variable only gets
|
variables in a csect, so that each variable only gets
|
||||||
an XTY_LD. We still need to record them. This will
|
an XTY_LD. This will typically be XMC_RW; I suspect
|
||||||
typically be XMC_RW; I suspect XMC_RO and XMC_BS might
|
XMC_RO and XMC_BS might be possible too.
|
||||||
be possible too. */
|
These variables are put in the minimal symbol table
|
||||||
break;
|
only. */
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case XTY_CM:
|
||||||
|
/* Common symbols are put into the minimal symbol table only. */
|
||||||
|
continue;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -1543,6 +1260,12 @@ read_xcoff_symtab (pst)
|
||||||
/* { main_aux.x_sym.x_misc.x_lnsz.x_lnno
|
/* { main_aux.x_sym.x_misc.x_lnsz.x_lnno
|
||||||
contains number of lines to '}' */
|
contains number of lines to '}' */
|
||||||
|
|
||||||
|
if (context_stack_depth <= 0)
|
||||||
|
{ /* We attempted to pop an empty context stack */
|
||||||
|
complain (&ef_complaint, cs->c_symnum);
|
||||||
|
within_function = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
new = pop_context ();
|
new = pop_context ();
|
||||||
/* Stack must be empty now. */
|
/* Stack must be empty now. */
|
||||||
if (context_stack_depth > 0 || new == NULL)
|
if (context_stack_depth > 0 || new == NULL)
|
||||||
|
@ -1601,6 +1324,7 @@ read_xcoff_symtab (pst)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case C_HIDEXT:
|
case C_HIDEXT:
|
||||||
|
case C_STAT:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case C_BINCL:
|
case C_BINCL:
|
||||||
|
@ -1630,10 +1354,15 @@ read_xcoff_symtab (pst)
|
||||||
}
|
}
|
||||||
else if (STREQ (cs->c_name, ".eb"))
|
else if (STREQ (cs->c_name, ".eb"))
|
||||||
{
|
{
|
||||||
|
if (context_stack_depth <= 0)
|
||||||
|
{ /* We attempted to pop an empty context stack */
|
||||||
|
complain (&eb_complaint, cs->c_symnum);
|
||||||
|
break;
|
||||||
|
}
|
||||||
new = pop_context ();
|
new = pop_context ();
|
||||||
if (depth-- != new->depth)
|
if (depth-- != new->depth)
|
||||||
{
|
{
|
||||||
complain (&eb_complaint, symnum);
|
complain (&eb_complaint, cs->c_symnum);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (local_symbols && context_stack_depth > 0)
|
if (local_symbols && context_stack_depth > 0)
|
||||||
|
@ -1696,10 +1425,7 @@ process_xcoff_symbol (cs, objfile)
|
||||||
struct symbol onesymbol;
|
struct symbol onesymbol;
|
||||||
register struct symbol *sym = &onesymbol;
|
register struct symbol *sym = &onesymbol;
|
||||||
struct symbol *sym2 = NULL;
|
struct symbol *sym2 = NULL;
|
||||||
struct type *ttype;
|
char *name, *pp;
|
||||||
char *name, *pp, *qq;
|
|
||||||
int struct_and_type_combined;
|
|
||||||
int nameless;
|
|
||||||
|
|
||||||
int sec;
|
int sec;
|
||||||
CORE_ADDR off;
|
CORE_ADDR off;
|
||||||
|
@ -1753,17 +1479,19 @@ process_xcoff_symbol (cs, objfile)
|
||||||
switch (cs->c_sclass)
|
switch (cs->c_sclass)
|
||||||
{
|
{
|
||||||
#if 0
|
#if 0
|
||||||
|
/* The values of functions and global symbols are now resolved
|
||||||
|
via the global_sym_chain in stabsread.c. */
|
||||||
case C_FUN:
|
case C_FUN:
|
||||||
if (fcn_cs_saved.c_sclass == C_EXT)
|
if (fcn_cs_saved.c_sclass == C_EXT)
|
||||||
add_stab_to_list (name, &global_stabs);
|
add_stab_to_list (name, &global_stabs);
|
||||||
else
|
else
|
||||||
add_stab_to_list (name, &file_stabs);
|
add_stab_to_list (name, &file_stabs);
|
||||||
break;
|
break;
|
||||||
#endif
|
|
||||||
|
|
||||||
case C_GSYM:
|
case C_GSYM:
|
||||||
add_stab_to_list (name, &global_stabs);
|
add_stab_to_list (name, &global_stabs);
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
case C_BCOMM:
|
case C_BCOMM:
|
||||||
common_block_start (cs->c_name, objfile);
|
common_block_start (cs->c_name, objfile);
|
||||||
|
@ -1783,6 +1511,7 @@ process_xcoff_symbol (cs, objfile)
|
||||||
case C_ECOML:
|
case C_ECOML:
|
||||||
case C_LSYM:
|
case C_LSYM:
|
||||||
case C_RSYM:
|
case C_RSYM:
|
||||||
|
case C_GSYM:
|
||||||
|
|
||||||
{
|
{
|
||||||
sym = define_symbol (cs->c_value + off, cs->c_name, 0, 0, objfile);
|
sym = define_symbol (cs->c_value + off, cs->c_name, 0, 0, objfile);
|
||||||
|
@ -1819,53 +1548,6 @@ process_xcoff_symbol (cs, objfile)
|
||||||
}
|
}
|
||||||
return sym;
|
return sym;
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* These appear to be vestigial remnants of coffread.c; I don't
|
|
||||||
think any of them are used for xcoff. */
|
|
||||||
|
|
||||||
case C_AUTO:
|
|
||||||
SYMBOL_CLASS (sym) = LOC_LOCAL;
|
|
||||||
SYMBOL_NAME (sym) = SYMNAME_ALLOC (name, symname_alloced);
|
|
||||||
SYMBOL_SECTION (sym) = secnum_to_section (cs->c_secnum, objfile);
|
|
||||||
SYMBOL_DUP (sym, sym2);
|
|
||||||
add_symbol_to_list (sym2, &local_symbols);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case C_STAT:
|
|
||||||
SYMBOL_CLASS (sym) = LOC_STATIC;
|
|
||||||
SYMBOL_NAME (sym) = SYMNAME_ALLOC (name, symname_alloced);
|
|
||||||
SYMBOL_SECTION (sym) = secnum_to_section (cs->c_secnum, objfile);
|
|
||||||
SYMBOL_DUP (sym, sym2);
|
|
||||||
add_symbol_to_list
|
|
||||||
(sym2, within_function ? &local_symbols : &file_symbols);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case C_RSYM:
|
|
||||||
pp = (char*) strchr (name, ':');
|
|
||||||
if (pp)
|
|
||||||
{
|
|
||||||
sym = define_symbol (cs->c_value, cs->c_name, 0, 0, objfile);
|
|
||||||
if (sym != NULL)
|
|
||||||
SYMBOL_SECTION (sym) = secnum_to_section (cs->c_secnum, objfile);
|
|
||||||
return sym;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
complain (&rsym_complaint, name);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
#endif /* 0 */
|
|
||||||
|
|
||||||
/* I think this one is used (dubious, I think, shouldn't
|
|
||||||
it go into the msyms only?). */
|
|
||||||
case C_EXT:
|
|
||||||
SYMBOL_CLASS (sym) = LOC_STATIC;
|
|
||||||
SYMBOL_NAME (sym) = SYMNAME_ALLOC (name, symname_alloced);
|
|
||||||
SYMBOL_SECTION (sym) = secnum_to_section (cs->c_secnum, objfile);
|
|
||||||
SYMBOL_DUP (sym, sym2);
|
|
||||||
add_symbol_to_list (sym2, &global_symbols);
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return sym2;
|
return sym2;
|
||||||
|
@ -2143,6 +1825,8 @@ static void
|
||||||
xcoff_new_init (objfile)
|
xcoff_new_init (objfile)
|
||||||
struct objfile *objfile;
|
struct objfile *objfile;
|
||||||
{
|
{
|
||||||
|
stabsread_new_init ();
|
||||||
|
buildsym_new_init ();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Do initialization in preparation for reading symbols from OBJFILE.
|
/* Do initialization in preparation for reading symbols from OBJFILE.
|
||||||
|
@ -2217,6 +1901,9 @@ init_stringtab (abfd, offset, objfile)
|
||||||
strtbl = (char *) obstack_alloc (&objfile->symbol_obstack, length);
|
strtbl = (char *) obstack_alloc (&objfile->symbol_obstack, length);
|
||||||
((struct coff_symfile_info *)objfile->sym_private)->strtbl = strtbl;
|
((struct coff_symfile_info *)objfile->sym_private)->strtbl = strtbl;
|
||||||
|
|
||||||
|
/* Copy length buffer, the first byte is usually zero and is
|
||||||
|
used for stabs with a name length of zero. */
|
||||||
|
memcpy (strtbl, lengthbuf, sizeof lengthbuf);
|
||||||
if (length == sizeof lengthbuf)
|
if (length == sizeof lengthbuf)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -2372,11 +2059,7 @@ xcoff_end_psymtab (pst, include_list, num_includes, capping_symbol_number,
|
||||||
/* Throw away this psymtab, it's empty. We can't deallocate it, since
|
/* Throw away this psymtab, it's empty. We can't deallocate it, since
|
||||||
it is on the obstack, but we can forget to chain it on the list. */
|
it is on the obstack, but we can forget to chain it on the list. */
|
||||||
/* Empty psymtabs happen as a result of header files which don't have
|
/* Empty psymtabs happen as a result of header files which don't have
|
||||||
any symbols in them. There can be a lot of them. But this check
|
any symbols in them. There can be a lot of them. */
|
||||||
is wrong, in that a psymtab with N_SLINE entries but nothing else
|
|
||||||
is not empty, but we don't realize that. Fixing that without slowing
|
|
||||||
things down might be tricky. (FIXME: For XCOFF, it shouldn't be
|
|
||||||
tricky at all). */
|
|
||||||
struct partial_symtab *prev_pst;
|
struct partial_symtab *prev_pst;
|
||||||
|
|
||||||
/* First, snip it out of the psymtab chain */
|
/* First, snip it out of the psymtab chain */
|
||||||
|
@ -2465,13 +2148,10 @@ scan_xcoff_symtab (section_offsets, objfile)
|
||||||
struct objfile *objfile;
|
struct objfile *objfile;
|
||||||
{
|
{
|
||||||
int toc_offset = 0; /* toc offset value in data section. */
|
int toc_offset = 0; /* toc offset value in data section. */
|
||||||
char *filestring;
|
char *filestring = NULL;
|
||||||
|
|
||||||
char *namestring;
|
char *namestring;
|
||||||
int nsl;
|
|
||||||
int past_first_source_file = 0;
|
int past_first_source_file = 0;
|
||||||
CORE_ADDR last_o_file_start = 0;
|
|
||||||
struct cleanup *back_to;
|
|
||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
unsigned int nsyms;
|
unsigned int nsyms;
|
||||||
|
|
||||||
|
@ -2493,9 +2173,9 @@ scan_xcoff_symtab (section_offsets, objfile)
|
||||||
unsigned int ssymnum;
|
unsigned int ssymnum;
|
||||||
|
|
||||||
char *last_csect_name = NULL; /* last seen csect's name and value */
|
char *last_csect_name = NULL; /* last seen csect's name and value */
|
||||||
CORE_ADDR last_csect_val;
|
CORE_ADDR last_csect_val = 0;
|
||||||
int last_csect_sec;
|
int last_csect_sec = 0;
|
||||||
int misc_func_recorded; /* true if any misc. function */
|
int misc_func_recorded = 0; /* true if any misc. function */
|
||||||
|
|
||||||
pst = (struct partial_symtab *) 0;
|
pst = (struct partial_symtab *) 0;
|
||||||
|
|
||||||
|
@ -2519,7 +2199,7 @@ scan_xcoff_symtab (section_offsets, objfile)
|
||||||
ssymnum = 0;
|
ssymnum = 0;
|
||||||
while (ssymnum < nsyms)
|
while (ssymnum < nsyms)
|
||||||
{
|
{
|
||||||
int sclass = ((struct external_syment *)sraw_symbol)->e_sclass[0];
|
int sclass = ((struct external_syment *)sraw_symbol)->e_sclass[0] & 0xff;
|
||||||
/* This is the type we pass to partial-stab.h. A less kludgy solution
|
/* This is the type we pass to partial-stab.h. A less kludgy solution
|
||||||
would be to break out partial-stab.h into its various parts--shuffle
|
would be to break out partial-stab.h into its various parts--shuffle
|
||||||
off the DBXREAD_ONLY stuff to dbxread.c, and make separate
|
off the DBXREAD_ONLY stuff to dbxread.c, and make separate
|
||||||
|
@ -2553,6 +2233,11 @@ scan_xcoff_symtab (section_offsets, objfile)
|
||||||
else
|
else
|
||||||
csect_aux = main_aux;
|
csect_aux = main_aux;
|
||||||
|
|
||||||
|
/* If symbol name starts with ".$" or "$", ignore it. */
|
||||||
|
if (namestring[0] == '$'
|
||||||
|
|| (namestring[0] == '.' && namestring[1] == '$'))
|
||||||
|
break;
|
||||||
|
|
||||||
switch (csect_aux.x_csect.x_smtyp & 0x7)
|
switch (csect_aux.x_csect.x_smtyp & 0x7)
|
||||||
{
|
{
|
||||||
case XTY_SD:
|
case XTY_SD:
|
||||||
|
@ -2614,17 +2299,29 @@ scan_xcoff_symtab (section_offsets, objfile)
|
||||||
}
|
}
|
||||||
misc_func_recorded = 0;
|
misc_func_recorded = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case XMC_RW:
|
case XMC_RW:
|
||||||
|
/* Data variables are recorded in the minimal symbol
|
||||||
|
table, except for section symbols. */
|
||||||
|
if (*namestring != '.')
|
||||||
|
prim_record_minimal_symbol_and_info
|
||||||
|
(namestring, symbol.n_value,
|
||||||
|
sclass == C_HIDEXT ? mst_file_data : mst_data,
|
||||||
|
NULL, secnum_to_section (symbol.n_scnum, objfile),
|
||||||
|
objfile);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case XMC_TC0:
|
case XMC_TC0:
|
||||||
if (toc_offset)
|
if (toc_offset)
|
||||||
warning ("More than one XMC_TC0 symbol found.");
|
warning ("More than one XMC_TC0 symbol found.");
|
||||||
toc_offset = symbol.n_value;
|
toc_offset = symbol.n_value;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case XMC_TC:
|
case XMC_TC:
|
||||||
/* These symbols tell us where the TOC entry for a
|
/* These symbols tell us where the TOC entry for a
|
||||||
variable is, not the variable itself. */
|
variable is, not the variable itself. */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -2634,36 +2331,18 @@ scan_xcoff_symtab (section_offsets, objfile)
|
||||||
switch (csect_aux.x_csect.x_smclas)
|
switch (csect_aux.x_csect.x_smclas)
|
||||||
{
|
{
|
||||||
case XMC_PR:
|
case XMC_PR:
|
||||||
{
|
|
||||||
/* A function entry point. */
|
/* A function entry point. */
|
||||||
char *namestr = namestring;
|
|
||||||
|
|
||||||
if (first_fun_line_offset == 0)
|
if (first_fun_line_offset == 0 && symbol.n_numaux > 1)
|
||||||
first_fun_line_offset =
|
first_fun_line_offset =
|
||||||
main_aux.x_sym.x_fcnary.x_fcn.x_lnnoptr;
|
main_aux.x_sym.x_fcnary.x_fcn.x_lnnoptr;
|
||||||
if (namestr[0] == '.')
|
RECORD_MINIMAL_SYMBOL
|
||||||
++namestr;
|
(namestring, symbol.n_value,
|
||||||
prim_record_minimal_symbol_and_info
|
sclass == C_HIDEXT ? mst_file_text : mst_text,
|
||||||
(namestr, symbol.n_value, mst_text,
|
secnum_to_section (symbol.n_scnum, objfile),
|
||||||
NULL, secnum_to_section (symbol.n_scnum, objfile),
|
|
||||||
objfile);
|
objfile);
|
||||||
misc_func_recorded = 1;
|
|
||||||
|
|
||||||
/* We also create full symbols for these, so
|
|
||||||
better make a partial symbol. This seems bogus
|
|
||||||
to me, but I'm not going to try to fix it now.
|
|
||||||
(Note that allocate_space_in_inferior can't
|
|
||||||
yet deal with a minimal symbol for malloc on xcoff
|
|
||||||
because it doesn't understand the fact that
|
|
||||||
function pointers don't just contain the address of
|
|
||||||
the function). */
|
|
||||||
ADD_PSYMBOL_ADDR_TO_LIST (namestr, strlen (namestr),
|
|
||||||
VAR_NAMESPACE, LOC_BLOCK,
|
|
||||||
objfile->global_psymbols,
|
|
||||||
symbol.n_value,
|
|
||||||
psymtab_language, objfile);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case XMC_GL:
|
case XMC_GL:
|
||||||
/* shared library function trampoline code entry
|
/* shared library function trampoline code entry
|
||||||
point. */
|
point. */
|
||||||
|
@ -2694,17 +2373,33 @@ scan_xcoff_symtab (section_offsets, objfile)
|
||||||
still need to record them. This will
|
still need to record them. This will
|
||||||
typically be XMC_RW; I suspect XMC_RO and
|
typically be XMC_RW; I suspect XMC_RO and
|
||||||
XMC_BS might be possible too. */
|
XMC_BS might be possible too. */
|
||||||
|
if (*namestring != '.')
|
||||||
/* FIXME: Shouldn't these be going into the minimal
|
prim_record_minimal_symbol_and_info
|
||||||
symbols instead of partial/full symbols? */
|
(namestring, symbol.n_value,
|
||||||
|
sclass == C_HIDEXT ? mst_file_data : mst_data,
|
||||||
ADD_PSYMBOL_ADDR_TO_LIST (namestring, strlen (namestring),
|
NULL, secnum_to_section (symbol.n_scnum, objfile),
|
||||||
VAR_NAMESPACE, LOC_STATIC,
|
objfile);
|
||||||
objfile->global_psymbols,
|
|
||||||
symbol.n_value,
|
|
||||||
psymtab_language, objfile);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case XTY_CM:
|
||||||
|
switch (csect_aux.x_csect.x_smclas)
|
||||||
|
{
|
||||||
|
case XMC_RW:
|
||||||
|
case XMC_BS:
|
||||||
|
/* Common variables are recorded in the minimal symbol
|
||||||
|
table, except for section symbols. */
|
||||||
|
if (*namestring != '.')
|
||||||
|
prim_record_minimal_symbol_and_info
|
||||||
|
(namestring, symbol.n_value,
|
||||||
|
sclass == C_HIDEXT ? mst_file_bss : mst_bss,
|
||||||
|
NULL, secnum_to_section (symbol.n_scnum, objfile),
|
||||||
|
objfile);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -2851,24 +2546,11 @@ scan_xcoff_symtab (section_offsets, objfile)
|
||||||
#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)\
|
||||||
do {} while (0)
|
do {} while (0)
|
||||||
/* We have already set the namestring. */
|
/* We have already set the namestring. */
|
||||||
#define SET_NAMESTRING() 0
|
#define SET_NAMESTRING() /* */
|
||||||
|
|
||||||
#include "partial-stab.h"
|
#include "partial-stab.h"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#if 0
|
|
||||||
/* What is this? */
|
|
||||||
/* If there's stuff to be cleaned up, clean it up. */
|
|
||||||
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_point < bufp->n_value
|
|
||||||
&& objfile -> ei.entry_point >= last_o_file_start)
|
|
||||||
{
|
|
||||||
objfile -> ei.entry_file_lowpc = last_o_file_start;
|
|
||||||
objfile -> ei.entry_file_highpc = bufp->n_value;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (pst)
|
if (pst)
|
||||||
{
|
{
|
||||||
|
@ -3069,13 +2751,6 @@ _initialize_xcoffread ()
|
||||||
{
|
{
|
||||||
add_symtab_fns(&xcoff_sym_fns);
|
add_symtab_fns(&xcoff_sym_fns);
|
||||||
|
|
||||||
/* Initialize symbol template later used for arguments. Its other
|
|
||||||
fields are zero, or are filled in later. */
|
|
||||||
SYMBOL_NAME (&parmsym) = "";
|
|
||||||
SYMBOL_INIT_LANGUAGE_SPECIFIC (&parmsym, language_c);
|
|
||||||
SYMBOL_NAMESPACE (&parmsym) = VAR_NAMESPACE;
|
|
||||||
SYMBOL_CLASS (&parmsym) = LOC_ARG;
|
|
||||||
|
|
||||||
func_symbol_type = init_type (TYPE_CODE_FUNC, 1, 0,
|
func_symbol_type = init_type (TYPE_CODE_FUNC, 1, 0,
|
||||||
"<function, no debug info>", NULL);
|
"<function, no debug info>", NULL);
|
||||||
TYPE_TARGET_TYPE (func_symbol_type) = builtin_type_int;
|
TYPE_TARGET_TYPE (func_symbol_type) = builtin_type_int;
|
||||||
|
|
Loading…
Reference in New Issue