This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
Re: [RFA] Fix a "pc ... in psymtab but not in symtab" internal error warning
Yes, thanks.
Elena
Joel Brobecker writes:
> > > 2003-01-03 J. Brobecker <brobecker@gnat.com>
> > >
> > > * mdebugread.c (parse_symbol): Skip stProc entries which storage
> > > class is not scText. These do not define "real" procedures.
> > > (parse_partial_symbols): Likewise.
> > >
> > > Ahem, ok to commit?
> >
> > Yes, I think so. Meanwhile, I recommend:
> > http://www.testdrive.hp.com/os/#tru64
> >
> > I imagine they've got a C++ compiler available; yeah, it's a bit of a
> > nuisance to use their systems, but...
>
> Ok, I have tested my change in one of their machines. Announcement: I
> had to install gcc + dejagnu there, so if anyone is interested: I
> installed GNAT 3.16w (2.8.1 based) + dejagnu in /house/brobecke/osf/bin.
>
> My change did not show any regression in the C++ directory (did not run
> the other tests), although as Daniel suggested, the results are rather
> modest. For the record:
>
> # of expected passes 878
> # of unexpected failures 276
> # of expected failures 7
> # of unresolved testcases 33
>
> Here is a new patch, with the comments a bit expanded, as recommended
> by Elena.
>
> Should I check this in?
>
> Thanks,
> --
> Joel
> Index: mdebugread.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/mdebugread.c,v
> retrieving revision 1.35
> diff -c -3 -p -r1.35 mdebugread.c
> *** mdebugread.c 3 Jan 2003 15:34:59 -0000 1.35
> --- mdebugread.c 6 Jan 2003 11:26:38 -0000
> *************** parse_symbol (SYMR *sh, union aux_ext *a
> *** 751,756 ****
> --- 751,788 ----
>
> case stProc: /* Procedure, usually goes into global block */
> case stStaticProc: /* Static procedure, goes into current block */
> + /* For stProc symbol records, we need to check the storage class
> + as well, as only (stProc, scText) entries represent "real"
> + procedures - See the Compaq document titled "Object File /
> + Symbol Table Format Specification" for more information.
> + If the storage class is not scText, we discard the whole block
> + of symbol records for this stProc. */
> + if (sh->st == stProc && sh->sc != scText)
> + {
> + char *ext_tsym = ext_sh;
> + int keep_counting = 1;
> + SYMR tsym;
> +
> + while (keep_counting)
> + {
> + ext_tsym += external_sym_size;
> + (*swap_sym_in) (cur_bfd, ext_tsym, &tsym);
> + count++;
> + switch (tsym.st)
> + {
> + case stParam:
> + break;
> + case stEnd:
> + keep_counting = 0;
> + break;
> + default:
> + complaint (&symfile_complaints,
> + "unknown symbol type 0x%x", sh->st);
> + break;
> + }
> + }
> + break;
> + }
> s = new_symbol (name);
> SYMBOL_NAMESPACE (s) = VAR_NAMESPACE;
> SYMBOL_CLASS (s) = LOC_BLOCK;
> *************** parse_partial_symbols (struct objfile *o
> *** 3323,3328 ****
> --- 3355,3393 ----
> /* FALLTHROUGH */
>
> case stProc:
> + /* Ignore all parameter symbol records. */
> + if (sh.index >= hdr->iauxMax)
> + {
> + /* Should not happen, but does when cross-compiling
> + with the MIPS compiler. FIXME -- pull later. */
> + index_complaint (name);
> + new_sdx = cur_sdx + 1; /* Don't skip at all */
> + }
> + else
> + new_sdx = AUX_GET_ISYM (fh->fBigendian,
> + (debug_info->external_aux
> + + fh->iauxBase
> + + sh.index));
> +
> + if (new_sdx <= cur_sdx)
> + {
> + /* This should not happen either... FIXME. */
> + complaint (&symfile_complaints,
> + "bad proc end in aux found from symbol %s",
> + name);
> + new_sdx = cur_sdx + 1; /* Don't skip backward */
> + }
> +
> + /* For stProc symbol records, we need to check the
> + storage class as well, as only (stProc, scText)
> + entries represent "real" procedures - See the
> + Compaq document titled "Object File / Symbol Table
> + Format Specification" for more information. If the
> + storage class is not scText, we discard the whole
> + block of symbol records for this stProc. */
> + if (sh.st == stProc && sh.sc != scText)
> + goto skip;
> +
> /* Usually there is a local and a global stProc symbol
> for a function. This means that the function name
> has already been entered into the mimimal symbol table
> *************** parse_partial_symbols (struct objfile *o
> *** 3345,3373 ****
> &objfile->static_psymbols,
> 0, sh.value, psymtab_language, objfile);
>
> - /* Skip over procedure to next one. */
> - if (sh.index >= hdr->iauxMax)
> - {
> - /* Should not happen, but does when cross-compiling
> - with the MIPS compiler. FIXME -- pull later. */
> - index_complaint (name);
> - new_sdx = cur_sdx + 1; /* Don't skip at all */
> - }
> - else
> - new_sdx = AUX_GET_ISYM (fh->fBigendian,
> - (debug_info->external_aux
> - + fh->iauxBase
> - + sh.index));
> procaddr = sh.value;
> -
> - if (new_sdx <= cur_sdx)
> - {
> - /* This should not happen either... FIXME. */
> - complaint (&symfile_complaints,
> - "bad proc end in aux found from symbol %s",
> - name);
> - new_sdx = cur_sdx + 1; /* Don't skip backward */
> - }
>
> cur_sdx = new_sdx;
> (*swap_sym_in) (cur_bfd,
> --- 3410,3416 ----