* config/m68k/dpx2.mh (NATDEPFILES): Remove duplicate inclusion
of inftarg.o. * config/m68k/tm-dpx2.h (CANNOT_STORE_REGISTER): Define to inhibit writing of floating registers, the dpx2 kernel disallows it. * irix5-nat.c (LM_ADDR): The loaded address of the shared library is contained in o_praw. * irix5-nat.c (solib_map_sections): Adjust sections by the difference between the loaded address and the prelinked address. * irix5-nat.c (solib_address): Use LM_ADDR for the loaded start address. * mdebugread.c (parse_symbol): Do not relocate stEnd/scText symbols, their value is absolute. * mdebugread.c (parse_partial_symbols): Handle Irix 5.2 shared libraries fh->adr fields of zero. Relocate minimal symbol values upon readin. Relocate non-stabs symbols upon readin. * mdebugread.c (psymtab_to_symtab_1): Use pst->textlow for the start address of the outermost block. * mdebugread.c (parse_lines, parse_procedure): Pass in pst instead of section_offsets and use relocated pst->textlow for line number and procedure address relocations. From gmo@MicroUnity.com (Guillermo A. Loyola): * mdebugread.c (parse_symbol, parse_partial_symbols, cross_ref): Handle SGI Irix5 stIndirect symbol type.
This commit is contained in:
parent
b132667509
commit
33c66e44ed
3 changed files with 190 additions and 36 deletions
|
@ -1,3 +1,30 @@
|
||||||
|
Sun Jun 12 03:51:52 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de)
|
||||||
|
|
||||||
|
* config/m68k/dpx2.mh (NATDEPFILES): Remove duplicate inclusion
|
||||||
|
of inftarg.o.
|
||||||
|
* config/m68k/tm-dpx2.h (CANNOT_STORE_REGISTER): Define to inhibit
|
||||||
|
writing of floating registers, the dpx2 kernel disallows it.
|
||||||
|
* irix5-nat.c (LM_ADDR): The loaded address of the shared library
|
||||||
|
is contained in o_praw.
|
||||||
|
* irix5-nat.c (solib_map_sections): Adjust sections by the
|
||||||
|
difference between the loaded address and the prelinked address.
|
||||||
|
* irix5-nat.c (solib_address): Use LM_ADDR for the loaded start
|
||||||
|
address.
|
||||||
|
* mdebugread.c (parse_symbol): Do not relocate stEnd/scText
|
||||||
|
symbols, their value is absolute.
|
||||||
|
* mdebugread.c (parse_partial_symbols): Handle Irix 5.2 shared
|
||||||
|
libraries fh->adr fields of zero. Relocate minimal symbol values
|
||||||
|
upon readin. Relocate non-stabs symbols upon readin.
|
||||||
|
* mdebugread.c (psymtab_to_symtab_1): Use pst->textlow for the
|
||||||
|
start address of the outermost block.
|
||||||
|
* mdebugread.c (parse_lines, parse_procedure): Pass in pst
|
||||||
|
instead of section_offsets and use relocated pst->textlow for
|
||||||
|
line number and procedure address relocations.
|
||||||
|
|
||||||
|
From gmo@MicroUnity.com (Guillermo A. Loyola):
|
||||||
|
* mdebugread.c (parse_symbol, parse_partial_symbols, cross_ref):
|
||||||
|
Handle SGI Irix5 stIndirect symbol type.
|
||||||
|
|
||||||
Fri Jun 10 14:52:56 1994 Kung Hsu (kung@mexican.cygnus.com)
|
Fri Jun 10 14:52:56 1994 Kung Hsu (kung@mexican.cygnus.com)
|
||||||
|
|
||||||
* breakpoint.c: fix a syntax error native cc does not like.
|
* breakpoint.c: fix a syntax error native cc does not like.
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
/* Native support for the SGI Iris running IRIX version 5, for GDB.
|
/* Native support for the SGI Iris running IRIX version 5, for GDB.
|
||||||
Copyright 1988, 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
|
Copyright 1988, 1989, 1990, 1991, 1992, 1993, 1994
|
||||||
|
Free Software Foundation, Inc.
|
||||||
Contributed by Alessandro Forin(af@cs.cmu.edu) at CMU
|
Contributed by Alessandro Forin(af@cs.cmu.edu) at CMU
|
||||||
and by Per Bothner(bothner@cs.wisc.edu) at U.Wisconsin.
|
and by Per Bothner(bothner@cs.wisc.edu) at U.Wisconsin.
|
||||||
Implemented for Irix 4.x by Garrett A. Wollman.
|
Implemented for Irix 4.x by Garrett A. Wollman.
|
||||||
|
@ -212,7 +213,7 @@ static char *bkpt_names[] = {
|
||||||
#define DEBUG_BASE "__rld_obj_head"
|
#define DEBUG_BASE "__rld_obj_head"
|
||||||
|
|
||||||
/* How to get the loaded address of a shared library. */
|
/* How to get the loaded address of a shared library. */
|
||||||
#define LM_ADDR(so) ((so)->lm.o_base_address)
|
#define LM_ADDR(so) ((so)->lm.o_praw)
|
||||||
|
|
||||||
char shadow_contents[BREAKPOINT_MAX]; /* Stash old bkpt addr contents */
|
char shadow_contents[BREAKPOINT_MAX]; /* Stash old bkpt addr contents */
|
||||||
|
|
||||||
|
@ -303,6 +304,7 @@ solib_map_sections (so)
|
||||||
struct section_table *p;
|
struct section_table *p;
|
||||||
struct cleanup *old_chain;
|
struct cleanup *old_chain;
|
||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
|
CORE_ADDR offset;
|
||||||
|
|
||||||
filename = tilde_expand (so -> lm.o_path);
|
filename = tilde_expand (so -> lm.o_path);
|
||||||
old_chain = make_cleanup (free, filename);
|
old_chain = make_cleanup (free, filename);
|
||||||
|
@ -342,13 +344,20 @@ solib_map_sections (so)
|
||||||
bfd_get_filename (exec_bfd), bfd_errmsg (bfd_get_error ()));
|
bfd_get_filename (exec_bfd), bfd_errmsg (bfd_get_error ()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Irix 5 shared objects are pre-linked to particular addresses
|
||||||
|
although the dynamic linker may have to relocate them if the
|
||||||
|
address ranges of the libraries used by the main program clash.
|
||||||
|
The offset is the difference between the address where the object
|
||||||
|
is mapped and the binding address of the shared library. */
|
||||||
|
offset = (CORE_ADDR) LM_ADDR (so) - so -> lm.o_base_address;
|
||||||
|
|
||||||
for (p = so -> sections; p < so -> sections_end; p++)
|
for (p = so -> sections; p < so -> sections_end; p++)
|
||||||
{
|
{
|
||||||
/* Relocate the section binding addresses as recorded in the shared
|
/* Relocate the section binding addresses as recorded in the shared
|
||||||
object's file by the base address to which the object was actually
|
object's file by the offset to get the address to which the
|
||||||
mapped. */
|
object was actually mapped. */
|
||||||
p -> addr += (CORE_ADDR) LM_ADDR (so);
|
p -> addr += offset;
|
||||||
p -> endaddr += (CORE_ADDR) LM_ADDR (so);
|
p -> endaddr += offset;
|
||||||
so -> lmend = (CORE_ADDR) max (p -> endaddr, so -> lmend);
|
so -> lmend = (CORE_ADDR) max (p -> endaddr, so -> lmend);
|
||||||
if (STREQ (p -> the_bfd_section -> name, ".text"))
|
if (STREQ (p -> the_bfd_section -> name, ".text"))
|
||||||
{
|
{
|
||||||
|
@ -773,7 +782,7 @@ solib_address (address)
|
||||||
{
|
{
|
||||||
if (so -> lm.o_path[0])
|
if (so -> lm.o_path[0])
|
||||||
{
|
{
|
||||||
if ((address >= (CORE_ADDR) so->lm.o_base_address) &&
|
if ((address >= (CORE_ADDR) LM_ADDR (so)) &&
|
||||||
(address < (CORE_ADDR) so -> lmend))
|
(address < (CORE_ADDR) so -> lmend))
|
||||||
{
|
{
|
||||||
return (1);
|
return (1);
|
||||||
|
|
176
gdb/mdebugread.c
176
gdb/mdebugread.c
|
@ -681,12 +681,20 @@ parse_symbol (sh, ax, ext_sh, bigend, section_offsets)
|
||||||
switch (sh->sc)
|
switch (sh->sc)
|
||||||
{
|
{
|
||||||
case scText:
|
case scText:
|
||||||
sh->value += ANOFFSET (section_offsets, SECT_OFF_TEXT);
|
/* The value of a stEnd symbol is the displacement from the
|
||||||
|
corresponding start symbol value, do not relocate it. */
|
||||||
|
if (sh->st != stEnd)
|
||||||
|
sh->value += ANOFFSET (section_offsets, SECT_OFF_TEXT);
|
||||||
break;
|
break;
|
||||||
case scData:
|
case scData:
|
||||||
|
case scSData:
|
||||||
|
case scRData:
|
||||||
|
case scPData:
|
||||||
|
case scXData:
|
||||||
sh->value += ANOFFSET (section_offsets, SECT_OFF_DATA);
|
sh->value += ANOFFSET (section_offsets, SECT_OFF_DATA);
|
||||||
break;
|
break;
|
||||||
case scBss:
|
case scBss:
|
||||||
|
case scSBss:
|
||||||
sh->value += ANOFFSET (section_offsets, SECT_OFF_BSS);
|
sh->value += ANOFFSET (section_offsets, SECT_OFF_BSS);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -957,6 +965,13 @@ parse_symbol (sh, ax, ext_sh, bigend, section_offsets)
|
||||||
Just ignore it. */
|
Just ignore it. */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case stIndirect:
|
||||||
|
/* Irix5 cc puts out a stIndirect for struct x if it is not
|
||||||
|
yet defined when it encounters
|
||||||
|
struct y { struct x *xp; };
|
||||||
|
Just ignore it. */
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
complain (&block_member_complaint, tsym.st);
|
complain (&block_member_complaint, tsym.st);
|
||||||
}
|
}
|
||||||
|
@ -1206,6 +1221,11 @@ parse_symbol (sh, ax, ext_sh, bigend, section_offsets)
|
||||||
f->bitsize = bitsize;
|
f->bitsize = bitsize;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case stIndirect: /* forward declaration on Irix5 */
|
||||||
|
/* Forward declarations from Irix5 cc are handled by cross_ref,
|
||||||
|
skip them. */
|
||||||
|
break;
|
||||||
|
|
||||||
case stTypedef: /* type definition */
|
case stTypedef: /* type definition */
|
||||||
/* Typedefs for forward declarations and opaque structs from alpha cc
|
/* Typedefs for forward declarations and opaque structs from alpha cc
|
||||||
are handled by cross_ref, skip them. */
|
are handled by cross_ref, skip them. */
|
||||||
|
@ -1236,7 +1256,7 @@ parse_symbol (sh, ax, ext_sh, bigend, section_offsets)
|
||||||
generates a cross referencing stTypedef for x and xx.
|
generates a cross referencing stTypedef for x and xx.
|
||||||
The user visible effect of this is that the type of a pointer
|
The user visible effect of this is that the type of a pointer
|
||||||
to struct foo sometimes is given as `foo *' instead of `struct foo *'.
|
to struct foo sometimes is given as `foo *' instead of `struct foo *'.
|
||||||
The problem is fixed with alpha cc. */
|
The problem is fixed with alpha cc and Irix5 cc. */
|
||||||
|
|
||||||
/* However if the typedef cross references to an opaque aggregate, it
|
/* However if the typedef cross references to an opaque aggregate, it
|
||||||
is safe to omit it from the symbol table. */
|
is safe to omit it from the symbol table. */
|
||||||
|
@ -1722,14 +1742,14 @@ upgrade_type (fd, tpp, tq, ax, bigend, sym_name)
|
||||||
in question, or NULL to use top_stack->cur_block. */
|
in question, or NULL to use top_stack->cur_block. */
|
||||||
|
|
||||||
static void parse_procedure PARAMS ((PDR *, struct symtab *, unsigned long,
|
static void parse_procedure PARAMS ((PDR *, struct symtab *, unsigned long,
|
||||||
struct section_offsets *));
|
struct partial_symtab *));
|
||||||
|
|
||||||
static void
|
static void
|
||||||
parse_procedure (pr, search_symtab, first_off, section_offsets)
|
parse_procedure (pr, search_symtab, first_off, pst)
|
||||||
PDR *pr;
|
PDR *pr;
|
||||||
struct symtab *search_symtab;
|
struct symtab *search_symtab;
|
||||||
unsigned long first_off;
|
unsigned long first_off;
|
||||||
struct section_offsets *section_offsets;
|
struct partial_symtab *pst;
|
||||||
{
|
{
|
||||||
struct symbol *s, *i;
|
struct symbol *s, *i;
|
||||||
struct block *b;
|
struct block *b;
|
||||||
|
@ -1834,8 +1854,7 @@ parse_procedure (pr, search_symtab, first_off, section_offsets)
|
||||||
e = (struct mips_extra_func_info *) SYMBOL_VALUE (i);
|
e = (struct mips_extra_func_info *) SYMBOL_VALUE (i);
|
||||||
e->pdr = *pr;
|
e->pdr = *pr;
|
||||||
e->pdr.isym = (long) s;
|
e->pdr.isym = (long) s;
|
||||||
e->pdr.adr += cur_fdr->adr - first_off
|
e->pdr.adr += pst->textlow - first_off;
|
||||||
+ ANOFFSET (section_offsets, SECT_OFF_TEXT);
|
|
||||||
|
|
||||||
/* Correct incorrect setjmp procedure descriptor from the library
|
/* Correct incorrect setjmp procedure descriptor from the library
|
||||||
to make backtrace through setjmp work. */
|
to make backtrace through setjmp work. */
|
||||||
|
@ -1958,13 +1977,16 @@ parse_external (es, bigend, section_offsets)
|
||||||
numbers can go back and forth, apparently we can live
|
numbers can go back and forth, apparently we can live
|
||||||
with that and do not need to reorder our linetables */
|
with that and do not need to reorder our linetables */
|
||||||
|
|
||||||
|
static void parse_lines PARAMS ((FDR *, PDR *, struct linetable *, int,
|
||||||
|
struct partial_symtab *));
|
||||||
|
|
||||||
static void
|
static void
|
||||||
parse_lines (fh, pr, lt, maxlines, section_offsets)
|
parse_lines (fh, pr, lt, maxlines, pst)
|
||||||
FDR *fh;
|
FDR *fh;
|
||||||
PDR *pr;
|
PDR *pr;
|
||||||
struct linetable *lt;
|
struct linetable *lt;
|
||||||
int maxlines;
|
int maxlines;
|
||||||
struct section_offsets *section_offsets;
|
struct partial_symtab *pst;
|
||||||
{
|
{
|
||||||
unsigned char *base;
|
unsigned char *base;
|
||||||
int j, k;
|
int j, k;
|
||||||
|
@ -1996,8 +2018,7 @@ parse_lines (fh, pr, lt, maxlines, section_offsets)
|
||||||
halt = base + fh->cbLine;
|
halt = base + fh->cbLine;
|
||||||
base += pr->cbLineOffset;
|
base += pr->cbLineOffset;
|
||||||
|
|
||||||
adr = fh->adr + pr->adr - first_off
|
adr = pst->textlow + pr->adr - first_off;
|
||||||
+ ANOFFSET (section_offsets, SECT_OFF_TEXT);
|
|
||||||
|
|
||||||
l = adr >> 2; /* in words */
|
l = adr >> 2; /* in words */
|
||||||
for (lineno = pr->lnLow; base < halt; )
|
for (lineno = pr->lnLow; base < halt; )
|
||||||
|
@ -2071,6 +2092,19 @@ parse_partial_symbols (objfile, section_offsets)
|
||||||
struct cleanup *old_chain;
|
struct cleanup *old_chain;
|
||||||
char *name;
|
char *name;
|
||||||
enum language prev_language;
|
enum language prev_language;
|
||||||
|
asection *text_sect;
|
||||||
|
int relocatable = 0;
|
||||||
|
|
||||||
|
/* Irix 5.2 shared libraries have a fh->adr field of zero, but
|
||||||
|
the shared libraries are prelinked at a high memory address.
|
||||||
|
We have to adjust the start address of the object file for this case,
|
||||||
|
by setting it to the start address of the first procedure in the file.
|
||||||
|
But we should do no adjustments if we are debugging a .o file, where
|
||||||
|
the text section (and fh->adr) really starts at zero. */
|
||||||
|
text_sect = bfd_get_section_by_name (cur_bfd, ".text");
|
||||||
|
if (text_sect != NULL
|
||||||
|
&& (bfd_get_section_flags (cur_bfd, text_sect) & SEC_RELOC))
|
||||||
|
relocatable = 1;
|
||||||
|
|
||||||
extern_tab = (EXTR *) obstack_alloc (&objfile->psymbol_obstack,
|
extern_tab = (EXTR *) obstack_alloc (&objfile->psymbol_obstack,
|
||||||
sizeof (EXTR) * hdr->iextMax);
|
sizeof (EXTR) * hdr->iextMax);
|
||||||
|
@ -2159,6 +2193,7 @@ parse_partial_symbols (objfile, section_offsets)
|
||||||
for (; ext_in < ext_in_end; ext_in++)
|
for (; ext_in < ext_in_end; ext_in++)
|
||||||
{
|
{
|
||||||
enum minimal_symbol_type ms_type = mst_text;
|
enum minimal_symbol_type ms_type = mst_text;
|
||||||
|
CORE_ADDR svalue = ext_in->asym.value;
|
||||||
|
|
||||||
/* The Irix 5 native tools seem to sometimes generate bogus
|
/* The Irix 5 native tools seem to sometimes generate bogus
|
||||||
external symbols. */
|
external symbols. */
|
||||||
|
@ -2184,9 +2219,11 @@ parse_partial_symbols (objfile, section_offsets)
|
||||||
switch (ext_in->asym.st)
|
switch (ext_in->asym.st)
|
||||||
{
|
{
|
||||||
case stProc:
|
case stProc:
|
||||||
|
svalue += ANOFFSET (section_offsets, SECT_OFF_TEXT);
|
||||||
break;
|
break;
|
||||||
case stStaticProc:
|
case stStaticProc:
|
||||||
ms_type = mst_file_text;
|
ms_type = mst_file_text;
|
||||||
|
svalue += ANOFFSET (section_offsets, SECT_OFF_TEXT);
|
||||||
break;
|
break;
|
||||||
case stGlobal:
|
case stGlobal:
|
||||||
if (ext_in->asym.sc == scCommon)
|
if (ext_in->asym.sc == scCommon)
|
||||||
|
@ -2200,9 +2237,15 @@ parse_partial_symbols (objfile, section_offsets)
|
||||||
|| ext_in->asym.sc == scRData
|
|| ext_in->asym.sc == scRData
|
||||||
|| ext_in->asym.sc == scPData
|
|| ext_in->asym.sc == scPData
|
||||||
|| ext_in->asym.sc == scXData)
|
|| ext_in->asym.sc == scXData)
|
||||||
ms_type = mst_data;
|
{
|
||||||
|
ms_type = mst_data;
|
||||||
|
svalue += ANOFFSET (section_offsets, SECT_OFF_DATA);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
ms_type = mst_bss;
|
{
|
||||||
|
ms_type = mst_bss;
|
||||||
|
svalue += ANOFFSET (section_offsets, SECT_OFF_BSS);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case stLabel:
|
case stLabel:
|
||||||
if (ext_in->asym.sc == scAbs)
|
if (ext_in->asym.sc == scAbs)
|
||||||
|
@ -2210,15 +2253,24 @@ parse_partial_symbols (objfile, section_offsets)
|
||||||
else if (ext_in->asym.sc == scText
|
else if (ext_in->asym.sc == scText
|
||||||
|| ext_in->asym.sc == scInit
|
|| ext_in->asym.sc == scInit
|
||||||
|| ext_in->asym.sc == scFini)
|
|| ext_in->asym.sc == scFini)
|
||||||
ms_type = mst_file_text;
|
{
|
||||||
|
ms_type = mst_file_text;
|
||||||
|
svalue += ANOFFSET (section_offsets, SECT_OFF_TEXT);
|
||||||
|
}
|
||||||
else if (ext_in->asym.sc == scData
|
else if (ext_in->asym.sc == scData
|
||||||
|| ext_in->asym.sc == scSData
|
|| ext_in->asym.sc == scSData
|
||||||
|| ext_in->asym.sc == scRData
|
|| ext_in->asym.sc == scRData
|
||||||
|| ext_in->asym.sc == scPData
|
|| ext_in->asym.sc == scPData
|
||||||
|| ext_in->asym.sc == scXData)
|
|| ext_in->asym.sc == scXData)
|
||||||
ms_type = mst_file_data;
|
{
|
||||||
|
ms_type = mst_file_data;
|
||||||
|
svalue += ANOFFSET (section_offsets, SECT_OFF_DATA);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
ms_type = mst_file_bss;
|
{
|
||||||
|
ms_type = mst_file_bss;
|
||||||
|
svalue += ANOFFSET (section_offsets, SECT_OFF_BSS);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case stLocal:
|
case stLocal:
|
||||||
/* The alpha has the section start addresses in stLocal symbols
|
/* The alpha has the section start addresses in stLocal symbols
|
||||||
|
@ -2231,7 +2283,7 @@ parse_partial_symbols (objfile, section_offsets)
|
||||||
ms_type = mst_unknown;
|
ms_type = mst_unknown;
|
||||||
complain (&unknown_ext_complaint, name);
|
complain (&unknown_ext_complaint, name);
|
||||||
}
|
}
|
||||||
prim_record_minimal_symbol (name, ext_in->asym.value, ms_type, objfile);
|
prim_record_minimal_symbol (name, svalue, ms_type, objfile);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Pass 3 over files, over local syms: fill in static symbols */
|
/* Pass 3 over files, over local syms: fill in static symbols */
|
||||||
|
@ -2239,6 +2291,7 @@ parse_partial_symbols (objfile, section_offsets)
|
||||||
{
|
{
|
||||||
struct partial_symtab *save_pst;
|
struct partial_symtab *save_pst;
|
||||||
EXTR *ext_ptr;
|
EXTR *ext_ptr;
|
||||||
|
CORE_ADDR textlow;
|
||||||
|
|
||||||
cur_fdr = fh = debug_info->fdr + f_idx;
|
cur_fdr = fh = debug_info->fdr + f_idx;
|
||||||
|
|
||||||
|
@ -2247,9 +2300,20 @@ parse_partial_symbols (objfile, section_offsets)
|
||||||
fdr_to_pst[f_idx].pst = NULL;
|
fdr_to_pst[f_idx].pst = NULL;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Determine the start address for this object file from the
|
||||||
|
file header and relocate it, except for Irix 5.2 zero fh->adr. */
|
||||||
|
if (fh->cpd)
|
||||||
|
{
|
||||||
|
textlow = fh->adr;
|
||||||
|
if (relocatable || textlow != 0)
|
||||||
|
textlow += ANOFFSET (section_offsets, SECT_OFF_TEXT);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
textlow = 0;
|
||||||
pst = start_psymtab_common (objfile, section_offsets,
|
pst = start_psymtab_common (objfile, section_offsets,
|
||||||
fdr_name (fh),
|
fdr_name (fh),
|
||||||
fh->cpd ? fh->adr : 0,
|
textlow,
|
||||||
objfile->global_psymbols.next,
|
objfile->global_psymbols.next,
|
||||||
objfile->static_psymbols.next);
|
objfile->static_psymbols.next);
|
||||||
pst->read_symtab_private = ((char *)
|
pst->read_symtab_private = ((char *)
|
||||||
|
@ -2356,6 +2420,11 @@ parse_partial_symbols (objfile, section_offsets)
|
||||||
if (sh.st == stEnd)
|
if (sh.st == stEnd)
|
||||||
{
|
{
|
||||||
long high = procaddr + sh.value;
|
long high = procaddr + sh.value;
|
||||||
|
|
||||||
|
/* Kludge for Irix 5.2 zero fh->adr. */
|
||||||
|
if (!relocatable
|
||||||
|
&& (pst->textlow == 0 || procaddr < pst->textlow))
|
||||||
|
pst->textlow = procaddr;
|
||||||
if (high > pst->texthigh)
|
if (high > pst->texthigh)
|
||||||
pst->texthigh = high;
|
pst->texthigh = high;
|
||||||
}
|
}
|
||||||
|
@ -2441,6 +2510,27 @@ parse_partial_symbols (objfile, section_offsets)
|
||||||
|
|
||||||
name = debug_info->ss + fh->issBase + sh.iss;
|
name = debug_info->ss + fh->issBase + sh.iss;
|
||||||
|
|
||||||
|
switch (sh.sc)
|
||||||
|
{
|
||||||
|
case scText:
|
||||||
|
/* The value of a stEnd symbol is the displacement from the
|
||||||
|
corresponding start symbol value, do not relocate it. */
|
||||||
|
if (sh.st != stEnd)
|
||||||
|
sh.value += ANOFFSET (section_offsets, SECT_OFF_TEXT);
|
||||||
|
break;
|
||||||
|
case scData:
|
||||||
|
case scSData:
|
||||||
|
case scRData:
|
||||||
|
case scPData:
|
||||||
|
case scXData:
|
||||||
|
sh.value += ANOFFSET (section_offsets, SECT_OFF_DATA);
|
||||||
|
break;
|
||||||
|
case scBss:
|
||||||
|
case scSBss:
|
||||||
|
sh.value += ANOFFSET (section_offsets, SECT_OFF_BSS);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
switch (sh.st)
|
switch (sh.st)
|
||||||
{
|
{
|
||||||
long high;
|
long high;
|
||||||
|
@ -2507,6 +2597,12 @@ parse_partial_symbols (objfile, section_offsets)
|
||||||
&sh);
|
&sh);
|
||||||
if (sh.st != stEnd)
|
if (sh.st != stEnd)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
/* Kludge for Irix 5.2 zero fh->adr. */
|
||||||
|
if (!relocatable
|
||||||
|
&& (pst->textlow == 0 || procaddr < pst->textlow))
|
||||||
|
pst->textlow = procaddr;
|
||||||
|
|
||||||
high = procaddr + sh.value;
|
high = procaddr + sh.value;
|
||||||
if (high > pst->texthigh)
|
if (high > pst->texthigh)
|
||||||
pst->texthigh = high;
|
pst->texthigh = high;
|
||||||
|
@ -2530,6 +2626,10 @@ parse_partial_symbols (objfile, section_offsets)
|
||||||
class = LOC_STATIC;
|
class = LOC_STATIC;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case stIndirect:/* Irix5 forward declaration */
|
||||||
|
/* Skip forward declarations from Irix5 cc */
|
||||||
|
goto skip;
|
||||||
|
|
||||||
case stTypedef:/* Typedef */
|
case stTypedef:/* Typedef */
|
||||||
/* Skip typedefs for forward declarations and opaque
|
/* Skip typedefs for forward declarations and opaque
|
||||||
structs from alpha and mips cc. */
|
structs from alpha and mips cc. */
|
||||||
|
@ -2609,6 +2709,7 @@ parse_partial_symbols (objfile, section_offsets)
|
||||||
enum address_class class;
|
enum address_class class;
|
||||||
SYMR *psh;
|
SYMR *psh;
|
||||||
char *name;
|
char *name;
|
||||||
|
CORE_ADDR svalue;
|
||||||
|
|
||||||
if (ext_ptr->ifd != f_idx)
|
if (ext_ptr->ifd != f_idx)
|
||||||
abort ();
|
abort ();
|
||||||
|
@ -2618,6 +2719,25 @@ parse_partial_symbols (objfile, section_offsets)
|
||||||
if (psh->sc == scUndefined || psh->sc == scNil)
|
if (psh->sc == scUndefined || psh->sc == scNil)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
svalue = psh->value;
|
||||||
|
switch (psh->sc)
|
||||||
|
{
|
||||||
|
case scText:
|
||||||
|
svalue += ANOFFSET (section_offsets, SECT_OFF_TEXT);
|
||||||
|
break;
|
||||||
|
case scData:
|
||||||
|
case scSData:
|
||||||
|
case scRData:
|
||||||
|
case scPData:
|
||||||
|
case scXData:
|
||||||
|
svalue += ANOFFSET (section_offsets, SECT_OFF_DATA);
|
||||||
|
break;
|
||||||
|
case scBss:
|
||||||
|
case scSBss:
|
||||||
|
svalue += ANOFFSET (section_offsets, SECT_OFF_BSS);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
switch (psh->st)
|
switch (psh->st)
|
||||||
{
|
{
|
||||||
case stNil:
|
case stNil:
|
||||||
|
@ -2645,7 +2765,7 @@ parse_partial_symbols (objfile, section_offsets)
|
||||||
ADD_PSYMBOL_ADDR_TO_LIST (name, strlen (name),
|
ADD_PSYMBOL_ADDR_TO_LIST (name, strlen (name),
|
||||||
VAR_NAMESPACE, class,
|
VAR_NAMESPACE, class,
|
||||||
objfile->global_psymbols,
|
objfile->global_psymbols,
|
||||||
(CORE_ADDR) psh->value,
|
svalue,
|
||||||
psymtab_language, objfile);
|
psymtab_language, objfile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2994,7 +3114,7 @@ psymtab_to_symtab_1 (pst, filename)
|
||||||
first_off = pr.adr;
|
first_off = pr.adr;
|
||||||
first_pdr = 0;
|
first_pdr = 0;
|
||||||
}
|
}
|
||||||
parse_procedure (&pr, st, first_off, pst->section_offsets);
|
parse_procedure (&pr, st, first_off, pst);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -3036,7 +3156,7 @@ psymtab_to_symtab_1 (pst, filename)
|
||||||
top_stack->cur_st = st;
|
top_stack->cur_st = st;
|
||||||
top_stack->cur_block = BLOCKVECTOR_BLOCK (BLOCKVECTOR (st),
|
top_stack->cur_block = BLOCKVECTOR_BLOCK (BLOCKVECTOR (st),
|
||||||
STATIC_BLOCK);
|
STATIC_BLOCK);
|
||||||
BLOCK_START (top_stack->cur_block) = fh ? fh->adr : 0;
|
BLOCK_START (top_stack->cur_block) = pst->textlow;
|
||||||
BLOCK_END (top_stack->cur_block) = 0;
|
BLOCK_END (top_stack->cur_block) = 0;
|
||||||
top_stack->blocktype = stFile;
|
top_stack->blocktype = stFile;
|
||||||
top_stack->maxsyms = 2 * f_max;
|
top_stack->maxsyms = 2 * f_max;
|
||||||
|
@ -3090,8 +3210,7 @@ psymtab_to_symtab_1 (pst, filename)
|
||||||
pdr_ptr += external_pdr_size, pdr_in++)
|
pdr_ptr += external_pdr_size, pdr_in++)
|
||||||
(*swap_pdr_in) (cur_bfd, pdr_ptr, pdr_in);
|
(*swap_pdr_in) (cur_bfd, pdr_ptr, pdr_in);
|
||||||
|
|
||||||
parse_lines (fh, pr_block, lines, maxlines,
|
parse_lines (fh, pr_block, lines, maxlines, pst);
|
||||||
pst->section_offsets);
|
|
||||||
if (lines->nitems < fh->cline)
|
if (lines->nitems < fh->cline)
|
||||||
lines = shrink_linetable (lines);
|
lines = shrink_linetable (lines);
|
||||||
|
|
||||||
|
@ -3099,8 +3218,7 @@ psymtab_to_symtab_1 (pst, filename)
|
||||||
pdr_in = pr_block;
|
pdr_in = pr_block;
|
||||||
pdr_in_end = pdr_in + fh->cpd;
|
pdr_in_end = pdr_in + fh->cpd;
|
||||||
for (; pdr_in < pdr_in_end; pdr_in++)
|
for (; pdr_in < pdr_in_end; pdr_in++)
|
||||||
parse_procedure (pdr_in, 0, pr_block->adr,
|
parse_procedure (pdr_in, 0, pr_block->adr, pst);
|
||||||
pst->section_offsets);
|
|
||||||
|
|
||||||
do_cleanups (old_chain);
|
do_cleanups (old_chain);
|
||||||
}
|
}
|
||||||
|
@ -3271,7 +3389,7 @@ cross_ref (fd, ax, tpp, type_code, pname, bigend, sym_name)
|
||||||
|
|
||||||
/* Make sure that this type of cross reference can be handled. */
|
/* Make sure that this type of cross reference can be handled. */
|
||||||
if ((sh.sc != scInfo
|
if ((sh.sc != scInfo
|
||||||
|| (sh.st != stBlock && sh.st != stTypedef
|
|| (sh.st != stBlock && sh.st != stTypedef && sh.st != stIndirect
|
||||||
&& sh.st != stStruct && sh.st != stUnion
|
&& sh.st != stStruct && sh.st != stUnion
|
||||||
&& sh.st != stEnum))
|
&& sh.st != stEnum))
|
||||||
&& (sh.sc != scCommon || sh.st != stBlock))
|
&& (sh.sc != scCommon || sh.st != stBlock))
|
||||||
|
@ -3292,7 +3410,7 @@ cross_ref (fd, ax, tpp, type_code, pname, bigend, sym_name)
|
||||||
{
|
{
|
||||||
/* We have not yet seen this type. */
|
/* We have not yet seen this type. */
|
||||||
|
|
||||||
if (sh.iss == 0 && sh.st == stTypedef)
|
if ((sh.iss == 0 && sh.st == stTypedef) || sh.st == stIndirect)
|
||||||
{
|
{
|
||||||
TIR tir;
|
TIR tir;
|
||||||
|
|
||||||
|
@ -3305,8 +3423,8 @@ cross_ref (fd, ax, tpp, type_code, pname, bigend, sym_name)
|
||||||
due to the missing name.
|
due to the missing name.
|
||||||
b) forward declarations of structs/unions/enums which are defined
|
b) forward declarations of structs/unions/enums which are defined
|
||||||
later in this file or in another file in the same compilation
|
later in this file or in another file in the same compilation
|
||||||
unit. Simply cross reference those again to get the
|
unit. Irix5 cc uses a stIndirect symbol for this.
|
||||||
true type.
|
Simply cross reference those again to get the true type.
|
||||||
The forward references are not entered in the pending list and
|
The forward references are not entered in the pending list and
|
||||||
in the symbol table. */
|
in the symbol table. */
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue