diff options
Diffstat (limited to 'gdb/mdebugread.c')
-rw-r--r-- | gdb/mdebugread.c | 68 |
1 files changed, 45 insertions, 23 deletions
diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c index 130a458..255ad99 100644 --- a/gdb/mdebugread.c +++ b/gdb/mdebugread.c @@ -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; |