From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 15553 invoked by alias); 6 Jan 2003 11:36:50 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 15520 invoked from network); 6 Jan 2003 11:36:44 -0000 Received: from unknown (HELO takamaka.act-europe.fr) (217.128.22.42) by 209.249.29.67 with SMTP; 6 Jan 2003 11:36:44 -0000 Received: by takamaka.act-europe.fr (Postfix, from userid 507) id BDFC2D34AE; Mon, 6 Jan 2003 15:36:18 +0400 (RET) Date: Mon, 06 Jan 2003 11:36:00 -0000 From: Joel Brobecker To: gdb-patches@sources.redhat.com Subject: Re: [RFA] Fix a "pc ... in psymtab but not in symtab" internal error warning Message-ID: <20030106113618.GV693@gnat.com> References: <20030103190722.GL693@gnat.com> <20030103191915.GA7201@nevyn.them.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="8JPrznbw0YAQ/KXy" Content-Disposition: inline In-Reply-To: <20030103191915.GA7201@nevyn.them.org> User-Agent: Mutt/1.4i X-SW-Source: 2003-01/txt/msg00202.txt.bz2 --8JPrznbw0YAQ/KXy Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-length: 1160 > > 2003-01-03 J. Brobecker > > > > * 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 --8JPrznbw0YAQ/KXy Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="mdebugread.c.diff" Content-length: 4526 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 ---- --8JPrznbw0YAQ/KXy--