* 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:
Peter Schauer 1995-09-23 11:09:52 +00:00
parent 138b9b81e3
commit df1e1074de
4 changed files with 149 additions and 436 deletions

View File

@ -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

View File

@ -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)
{ {

View File

@ -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;

View File

@ -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;