Isolate STABS readers' use of the `textlow' and `texthigh' fields

of `struct partial_symtab' to only a few locations.  This change
is not supposed to affect the way the values are computed, only
where they live.

* dbxread.c (struct symloc): Add `textlow' and `texthigh' fields
to the reader-specific structure.
* mdebugread.c (struct symloc): Same.
* dbxread.c (TEXTLOW, TEXTHIGH): New accessor macros.
* mdebugread.c (TEXTLOW, TEXTHIGH): Same.
* dbxread.c (dbx_symfile_read): After we've built all our partial
symbol tables, set each partial symtab's `textlow' and `texthigh'
fields from our reader-specific structure.
* mdebugread.c (mdebug_build_psymtabs): Same.
* dbxread.c (start_psymtab): Initialize the reader-specific
structure's `textlow' and `texthigh' from the new psymtab's.
* mdebugread.c (parse_partial_symbols, new_psymtab): Same.
* dbxread.c (read_dbx_symtab, end_psymtab, read_ofile_symtab): Use
the reader-specific `textlow' and `texthigh', not the generic
psymtab fields.
* mdebugread.c (parse_lines, parse_partial_symbols,
psymtab_to_symtab_1): Same.
* partial-stab.h: Same.
This commit is contained in:
Jim Blandy 2001-10-24 17:10:18 +00:00
parent 908d94bfcd
commit 3973eaddf4
5 changed files with 124 additions and 51 deletions

View File

@ -1,3 +1,29 @@
2001-10-23 Jim Blandy <jimb@redhat.com>
Isolate STABS readers' use of the `textlow' and `texthigh' fields
of `struct partial_symtab' to only a few locations. This change
is not supposed to affect the way the values are computed, only
where they live.
* dbxread.c (struct symloc): Add `textlow' and `texthigh' fields
to the reader-specific structure.
* mdebugread.c (struct symloc): Same.
* dbxread.c (TEXTLOW, TEXTHIGH): New accessor macros.
* mdebugread.c (TEXTLOW, TEXTHIGH): Same.
* dbxread.c (dbx_symfile_read): After we've built all our partial
symbol tables, set each partial symtab's `textlow' and `texthigh'
fields from our reader-specific structure.
* mdebugread.c (mdebug_build_psymtabs): Same.
* dbxread.c (start_psymtab): Initialize the reader-specific
structure's `textlow' and `texthigh' from the new psymtab's.
* mdebugread.c (parse_partial_symbols, new_psymtab): Same.
* dbxread.c (read_dbx_symtab, end_psymtab, read_ofile_symtab): Use
the reader-specific `textlow' and `texthigh', not the generic
psymtab fields.
* mdebugread.c (parse_lines, parse_partial_symbols,
psymtab_to_symtab_1): Same.
* partial-stab.h: Same.
Tue Oct 23 18:59:42 2001 Andrew Cagney <cagney@redhat.com>
* hp-psymtab-read.c, hppah-nat.c, hppa-tdep.c: Fix -Wformat

View File

@ -76,6 +76,13 @@
struct symloc
{
/* The start (inclusive) and end (exclusive) addresses for this
partial symtab's text. STABS doesn't reliably give us nice
start and end addresses for each function. Instead, we are
told the addresses of various boundary points, and we have to
gather those together to build ranges. These are our running
best guess as to the range of text addresses for this psymtab. */
CORE_ADDR textlow, texthigh;
/* Offset within the file symbol table of first local symbol for this
file. */
@ -105,6 +112,8 @@ struct symloc
#define LDSYMOFF(p) (((struct symloc *)((p)->read_symtab_private))->ldsymoff)
#define LDSYMLEN(p) (((struct symloc *)((p)->read_symtab_private))->ldsymlen)
#define SYMLOC(p) ((struct symloc *)((p)->read_symtab_private))
#define TEXTLOW(p) (SYMLOC(p)->textlow)
#define TEXTHIGH(p) (SYMLOC(p)->texthigh)
#define SYMBOL_SIZE(p) (SYMLOC(p)->symbol_size)
#define SYMBOL_OFFSET(p) (SYMLOC(p)->symbol_offset)
#define STRING_OFFSET(p) (SYMLOC(p)->string_offset)
@ -599,6 +608,19 @@ dbx_symfile_read (struct objfile *objfile, int mainline)
read_dbx_dynamic_symtab (objfile);
/* Take the text ranges the STABS partial symbol scanner computed
for each of the psymtabs and convert it into the canonical form
for psymtabs. */
{
struct partial_symtab *p;
ALL_OBJFILE_PSYMTABS (objfile, p)
{
p->textlow = TEXTLOW (p);
p->texthigh = TEXTHIGH (p);
}
}
/* Install any minimal symbols that have been collected as the current
minimal symbols for this objfile. */
@ -1341,7 +1363,7 @@ read_dbx_symtab (struct objfile *objfile)
end_psymtab (pst, psymtab_include_list, includes_used,
symnum * symbol_size,
text_end > pst->texthigh ? text_end : pst->texthigh,
text_end > TEXTHIGH (pst) ? text_end : TEXTHIGH (pst),
dependency_list, dependencies_used, textlow_not_set);
}
@ -1367,6 +1389,8 @@ start_psymtab (struct objfile *objfile, char *filename, CORE_ADDR textlow,
result->read_symtab_private = (char *)
obstack_alloc (&objfile->psymbol_obstack, sizeof (struct symloc));
TEXTLOW (result) = result->textlow;
TEXTHIGH (result) = result->texthigh;
LDSYMOFF (result) = ldsymoff;
result->read_symtab = dbx_psymtab_to_symtab;
SYMBOL_SIZE (result) = symbol_size;
@ -1402,7 +1426,7 @@ end_psymtab (struct partial_symtab *pst, char **include_list, int num_includes,
if (capping_symbol_offset != -1)
LDSYMLEN (pst) = capping_symbol_offset - LDSYMOFF (pst);
pst->texthigh = capping_text;
TEXTHIGH (pst) = capping_text;
#ifdef SOFUN_ADDRESS_MAYBE_MISSING
/* Under Solaris, the N_SO symbols always have a value of 0,
@ -1420,7 +1444,7 @@ end_psymtab (struct partial_symtab *pst, char **include_list, int num_includes,
a reliable texthigh by taking the address plus size of the
last function in the file. */
if (pst->texthigh == 0 && last_function_name)
if (TEXTHIGH (pst) == 0 && last_function_name)
{
char *p;
int n;
@ -1446,14 +1470,14 @@ end_psymtab (struct partial_symtab *pst, char **include_list, int num_includes,
}
if (minsym)
pst->texthigh = SYMBOL_VALUE_ADDRESS (minsym) + MSYMBOL_SIZE (minsym);
TEXTHIGH (pst) = SYMBOL_VALUE_ADDRESS (minsym) + MSYMBOL_SIZE (minsym);
last_function_name = NULL;
}
/* this test will be true if the last .o file is only data */
if (textlow_not_set)
pst->textlow = pst->texthigh;
TEXTLOW (pst) = TEXTHIGH (pst);
else
{
struct partial_symtab *p1;
@ -1466,12 +1490,12 @@ end_psymtab (struct partial_symtab *pst, char **include_list, int num_includes,
ALL_OBJFILE_PSYMTABS (objfile, p1)
{
if (p1->texthigh == 0 && p1->textlow != 0 && p1 != pst)
if (TEXTHIGH (p1) == 0 && TEXTLOW (p1) != 0 && p1 != pst)
{
p1->texthigh = pst->textlow;
TEXTHIGH (p1) = TEXTLOW (pst);
/* if this file has only data, then make textlow match texthigh */
if (p1->textlow == 0)
p1->textlow = p1->texthigh;
if (TEXTLOW (p1) == 0)
TEXTLOW (p1) = TEXTHIGH (p1);
}
}
}
@ -1508,8 +1532,8 @@ end_psymtab (struct partial_symtab *pst, char **include_list, int num_includes,
sizeof (struct symloc));
LDSYMOFF (subpst) =
LDSYMLEN (subpst) =
subpst->textlow =
subpst->texthigh = 0;
TEXTLOW (subpst) =
TEXTHIGH (subpst) = 0;
/* We could save slight bits of space by only making one of these,
shared by the entire set of include files. FIXME-someday. */
@ -1677,8 +1701,8 @@ read_ofile_symtab (struct partial_symtab *pst)
objfile = pst->objfile;
sym_offset = LDSYMOFF (pst);
sym_size = LDSYMLEN (pst);
text_offset = pst->textlow;
text_size = pst->texthigh - pst->textlow;
text_offset = TEXTLOW (pst);
text_size = TEXTHIGH (pst) - TEXTLOW (pst);
/* This cannot be simply objfile->section_offsets because of
elfstab_offset_sections() which initializes the psymtab section
offsets information in a special way, and that is different from
@ -1823,13 +1847,13 @@ read_ofile_symtab (struct partial_symtab *pst)
/* In a Solaris elf file, this variable, which comes from the
value of the N_SO symbol, will still be 0. Luckily, text_offset,
which comes from pst->textlow is correct. */
which comes from TEXTLOW (pst) is correct. */
if (last_source_start_addr == 0)
last_source_start_addr = text_offset;
/* In reordered executables last_source_start_addr may not be the
lower bound for this symtab, instead use text_offset which comes
from pst->textlow which is correct. */
from TEXTLOW (pst) which is correct. */
if (last_source_start_addr > text_offset)
last_source_start_addr = text_offset;

View File

@ -105,6 +105,11 @@ extern void _initialize_mdebugread (void);
struct symloc
{
/* Our running best guess as to the range of text addresses for
this psymtab. After we've read everything in, we use this to
build pst->text_addrs. */
CORE_ADDR textlow, texthigh;
/* Index of the FDR that this psymtab represents. */
int fdr_idx;
/* The BFD that the psymtab was created from. */
@ -120,6 +125,8 @@ struct symloc
};
#define PST_PRIVATE(p) ((struct symloc *)(p)->read_symtab_private)
#define TEXTLOW(p) (PST_PRIVATE(p)->textlow)
#define TEXTHIGH(p) (PST_PRIVATE(p)->texthigh)
#define FDR_IDX(p) (PST_PRIVATE(p)->fdr_idx)
#define CUR_BFD(p) (PST_PRIVATE(p)->cur_bfd)
#define DEBUG_SWAP(p) (PST_PRIVATE(p)->debug_swap)
@ -516,6 +523,19 @@ mdebug_build_psymtabs (struct objfile *objfile,
parse_partial_symbols (objfile);
/* Take the text ranges the partial symbol scanner computed for each
of the psymtabs and convert it into the canonical form for
psymtabs. */
{
struct partial_symtab *p;
ALL_OBJFILE_PSYMTABS (objfile, p)
{
p->textlow = TEXTLOW (p);
p->texthigh = TEXTHIGH (p);
}
}
#if 0
/* Check to make sure file was compiled with -g. If not, warn the
user of this limitation. */
@ -2174,7 +2194,7 @@ parse_lines (FDR *fh, PDR *pr, struct linetable *lt, int maxlines,
halt = base + fh->cbLine;
base += pr->cbLineOffset;
adr = pst->textlow + pr->adr - lowest_pdr_addr;
adr = TEXTLOW (pst) + pr->adr - lowest_pdr_addr;
l = adr >> 2; /* in words */
for (lineno = pr->lnLow; base < halt;)
@ -2509,6 +2529,8 @@ parse_partial_symbols (struct objfile *objfile)
memset ((PTR) pst->read_symtab_private, 0, sizeof (struct symloc));
save_pst = pst;
TEXTLOW (pst) = pst->textlow;
TEXTHIGH (pst) = pst->texthigh;
FDR_IDX (pst) = f_idx;
CUR_BFD (pst) = cur_bfd;
DEBUG_SWAP (pst) = debug_swap;
@ -2544,7 +2566,7 @@ parse_partial_symbols (struct objfile *objfile)
psymtab_language = prev_language;
PST_PRIVATE (pst)->pst_language = psymtab_language;
pst->texthigh = pst->textlow;
TEXTHIGH (pst) = TEXTLOW (pst);
/* For stabs-in-ecoff files, the second symbol must be @stab.
This symbol is emitted by mips-tfile to signal that the
@ -2611,10 +2633,10 @@ parse_partial_symbols (struct objfile *objfile)
/* Kludge for Irix 5.2 zero fh->adr. */
if (!relocatable
&& (pst->textlow == 0 || procaddr < pst->textlow))
pst->textlow = procaddr;
if (high > pst->texthigh)
pst->texthigh = high;
&& (TEXTLOW (pst) == 0 || procaddr < TEXTLOW (pst)))
TEXTLOW (pst) = procaddr;
if (high > TEXTHIGH (pst))
TEXTHIGH (pst) = high;
}
}
else if (sh.st == stStatic)
@ -2703,7 +2725,7 @@ parse_partial_symbols (struct objfile *objfile)
(pst = save_pst)
#define END_PSYMTAB(pst,ilist,ninc,c_off,c_text,dep_list,n_deps,textlow_not_set) (void)0
#define HANDLE_RBRAC(val) \
if ((val) > save_pst->texthigh) save_pst->texthigh = (val);
if ((val) > TEXTHIGH (save_pst)) TEXTHIGH (save_pst) = (val);
#include "partial-stab.h"
if (stabstring
@ -2836,12 +2858,12 @@ parse_partial_symbols (struct objfile *objfile)
/* Kludge for Irix 5.2 zero fh->adr. */
if (!relocatable
&& (pst->textlow == 0 || procaddr < pst->textlow))
pst->textlow = procaddr;
&& (TEXTLOW (pst) == 0 || procaddr < TEXTLOW (pst)))
TEXTLOW (pst) = procaddr;
high = procaddr + sh.value;
if (high > pst->texthigh)
pst->texthigh = high;
if (high > TEXTHIGH (pst))
TEXTHIGH (pst) = high;
continue;
case stStatic: /* Variable */
@ -3015,16 +3037,16 @@ parse_partial_symbols (struct objfile *objfile)
empty and put on the free list. */
fdr_to_pst[f_idx].pst = end_psymtab (save_pst,
psymtab_include_list, includes_used,
-1, save_pst->texthigh,
-1, TEXTHIGH (save_pst),
dependency_list, dependencies_used, textlow_not_set);
includes_used = 0;
dependencies_used = 0;
if (objfile->ei.entry_point >= save_pst->textlow &&
objfile->ei.entry_point < save_pst->texthigh)
if (objfile->ei.entry_point >= TEXTLOW (save_pst) &&
objfile->ei.entry_point < TEXTHIGH (save_pst))
{
objfile->ei.entry_file_lowpc = save_pst->textlow;
objfile->ei.entry_file_highpc = save_pst->texthigh;
objfile->ei.entry_file_lowpc = TEXTLOW (save_pst);
objfile->ei.entry_file_highpc = TEXTHIGH (save_pst);
}
/* The objfile has its functions reordered if this partial symbol
@ -3040,15 +3062,15 @@ parse_partial_symbols (struct objfile *objfile)
other cases. */
save_pst = fdr_to_pst[f_idx].pst;
if (save_pst != NULL
&& save_pst->textlow != 0
&& TEXTLOW (save_pst) != 0
&& !(objfile->flags & OBJF_REORDERED))
{
ALL_OBJFILE_PSYMTABS (objfile, pst)
{
if (save_pst != pst
&& save_pst->textlow >= pst->textlow
&& save_pst->textlow < pst->texthigh
&& save_pst->texthigh > pst->texthigh)
&& TEXTLOW (save_pst) >= TEXTLOW (pst)
&& TEXTLOW (save_pst) < TEXTHIGH (pst)
&& TEXTHIGH (save_pst) > TEXTHIGH (pst))
{
objfile->flags |= OBJF_REORDERED;
break;
@ -3252,7 +3274,7 @@ psymtab_to_symtab_1 (struct partial_symtab *pst, char *filename)
/* Do nothing if this is a dummy psymtab. */
if (pst->n_global_syms == 0 && pst->n_static_syms == 0
&& pst->textlow == 0 && pst->texthigh == 0)
&& TEXTLOW (pst) == 0 && TEXTHIGH (pst) == 0)
return;
/* Now read the symbols for this symtab */
@ -3400,7 +3422,7 @@ psymtab_to_symtab_1 (struct partial_symtab *pst, char *filename)
if (! last_symtab_ended)
{
st = end_symtab (pst->texthigh, pst->objfile, SECT_OFF_TEXT (pst->objfile));
st = end_symtab (TEXTHIGH (pst), pst->objfile, SECT_OFF_TEXT (pst->objfile));
end_stabs ();
}
@ -3490,7 +3512,7 @@ psymtab_to_symtab_1 (struct partial_symtab *pst, char *filename)
top_stack->cur_st = st;
top_stack->cur_block = BLOCKVECTOR_BLOCK (BLOCKVECTOR (st),
STATIC_BLOCK);
BLOCK_START (top_stack->cur_block) = pst->textlow;
BLOCK_START (top_stack->cur_block) = TEXTLOW (pst);
BLOCK_END (top_stack->cur_block) = 0;
top_stack->blocktype = stFile;
top_stack->maxsyms = 2 * f_max;

View File

@ -104,12 +104,12 @@ switch (CUR_SYMBOL_TYPE)
if (past_first_source_file && pst
/* The gould NP1 uses low values for .o and -l symbols
which are not the address. */
&& CUR_SYMBOL_VALUE >= pst->textlow)
&& CUR_SYMBOL_VALUE >= TEXTLOW (pst))
{
END_PSYMTAB (pst, psymtab_include_list, includes_used,
symnum * symbol_size,
CUR_SYMBOL_VALUE > pst->texthigh
? CUR_SYMBOL_VALUE : pst->texthigh,
CUR_SYMBOL_VALUE > TEXTHIGH (pst)
? CUR_SYMBOL_VALUE : TEXTHIGH (pst),
dependency_list, dependencies_used, textlow_not_set);
pst = (struct partial_symtab *) 0;
includes_used = 0;
@ -236,7 +236,7 @@ switch (CUR_SYMBOL_TYPE)
{
END_PSYMTAB (pst, psymtab_include_list, includes_used,
symnum * symbol_size,
valu > pst->texthigh ? valu : pst->texthigh,
valu > TEXTHIGH (pst) ? valu : TEXTHIGH (pst),
dependency_list, dependencies_used,
prev_textlow_not_set);
pst = (struct partial_symtab *) 0;
@ -405,8 +405,8 @@ switch (CUR_SYMBOL_TYPE)
function relative stabs, or the address of the function's
end for old style stabs. */
valu = CUR_SYMBOL_VALUE + last_function_start;
if (pst->texthigh == 0 || valu > pst->texthigh)
pst->texthigh = valu;
if (TEXTHIGH (pst) == 0 || valu > TEXTHIGH (pst))
TEXTHIGH (pst) = valu;
break;
}
#endif
@ -610,7 +610,7 @@ switch (CUR_SYMBOL_TYPE)
}
if (pst && textlow_not_set)
{
pst->textlow = CUR_SYMBOL_VALUE;
TEXTLOW (pst) = CUR_SYMBOL_VALUE;
textlow_not_set = 0;
}
#endif
@ -626,12 +626,12 @@ switch (CUR_SYMBOL_TYPE)
the partial symbol table. */
if (pst
&& (textlow_not_set
|| (CUR_SYMBOL_VALUE < pst->textlow
|| (CUR_SYMBOL_VALUE < TEXTLOW (pst)
&& (CUR_SYMBOL_VALUE
!= ANOFFSET (objfile->section_offsets,
SECT_OFF_TEXT (objfile))))))
{
pst->textlow = CUR_SYMBOL_VALUE;
TEXTLOW (pst) = CUR_SYMBOL_VALUE;
textlow_not_set = 0;
}
#endif /* DBXREAD_ONLY */
@ -677,7 +677,7 @@ switch (CUR_SYMBOL_TYPE)
}
if (pst && textlow_not_set)
{
pst->textlow = CUR_SYMBOL_VALUE;
TEXTLOW (pst) = CUR_SYMBOL_VALUE;
textlow_not_set = 0;
}
#endif
@ -693,12 +693,12 @@ switch (CUR_SYMBOL_TYPE)
the partial symbol table. */
if (pst
&& (textlow_not_set
|| (CUR_SYMBOL_VALUE < pst->textlow
|| (CUR_SYMBOL_VALUE < TEXTLOW (pst)
&& (CUR_SYMBOL_VALUE
!= ANOFFSET (objfile->section_offsets,
SECT_OFF_TEXT (objfile))))))
{
pst->textlow = CUR_SYMBOL_VALUE;
TEXTLOW (pst) = CUR_SYMBOL_VALUE;
textlow_not_set = 0;
}
#endif /* DBXREAD_ONLY */
@ -813,7 +813,7 @@ switch (CUR_SYMBOL_TYPE)
case N_ENDM:
#ifdef SOFUN_ADDRESS_MAYBE_MISSING
/* Solaris 2 end of module, finish current partial symbol table.
END_PSYMTAB will set pst->texthigh to the proper value, which
END_PSYMTAB will set TEXTHIGH (pst) to the proper value, which
is necessary if a module compiled without debugging info
follows this module. */
if (pst)

View File

@ -1989,6 +1989,7 @@ allocate_psymtab (char *filename, struct objfile *objfile)
psymtab->filename = obsavestring (filename, strlen (filename),
&objfile->psymbol_obstack);
psymtab->symtab = NULL;
psymtab->text_addrs = addrset_new (&objfile->psymbol_obstack);
/* Prepend it to the psymtab list for the objfile it belongs to.
Psymtabs are searched in most recent inserted -> least recent