(parse_symbol): Skip stProc entries which storage class is not scText.
authorJoel Brobecker <brobecker@gnat.com>
Fri, 3 Jan 2003 15:29:29 +0000 (15:29 +0000)
committerJoel Brobecker <brobecker@gnat.com>
Fri, 3 Jan 2003 15:29:29 +0000 (15:29 +0000)
 These do not define "real" procedures.
(parse_partial_symbols): Likewise.
Fixes [C102-001].

gdb/mdebugread.c

index b5a15c3..92557d2 100644 (file)
@@ -751,6 +751,33 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
 
     case stProc:               /* Procedure, usually goes into global block */
     case stStaticProc:         /* Static procedure, goes into current block */
+      /* Make sure this is a "real" procedure.  Otherwise, skip it.  */
+      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;
@@ -3323,6 +3350,34 @@ parse_partial_symbols (struct objfile *objfile)
                  /* 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 */
+                   }
+
+                  /* Make sure that this stProc entry represents a "real"
+                     procedure.  If not, ignore it.  */
+                  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
@@ -3345,30 +3400,8 @@ parse_partial_symbols (struct objfile *objfile)
                                         &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,
                                  ((char *) debug_info->external_sym