This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]