Patch from David Mosberger.
[deliverable/binutils-gdb.git] / gdb / mdebugread.c
index b5a15c38d7d9f0dad726ac7a81a9982b10b2f41d..30e94c7a4751619f13cb287fefcdd205e7cf6459 100644 (file)
@@ -1,6 +1,6 @@
 /* Read a symbol table in ECOFF format (Third-Eye).
    Copyright 1986, 1987, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
-   1997, 1998, 1999, 2000, 2001, 2002
+   1997, 1998, 1999, 2000, 2001, 2002, 2003
    Free Software Foundation, Inc.
    Original version contributed by Alessandro Forin (af@cs.cmu.edu) at
    CMU.  Major work by Per Bothner, John Gilmore and Ian Lance Taylor
@@ -751,6 +751,38 @@ 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 */
+      /* 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;
@@ -795,6 +827,11 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
       /* Make a type for the procedure itself */
       SYMBOL_TYPE (s) = lookup_function_type (t);
 
+      /* All functions in C++ have prototypes.  For C we don't have enough
+         information in the debug info.  */
+      if (SYMBOL_LANGUAGE (s) == language_cplus)
+       TYPE_FLAGS (SYMBOL_TYPE (s)) |= TYPE_FLAG_PROTOTYPED;
+
       /* Create and enter a new lexical context */
       b = new_block (top_stack->maxsyms);
       SYMBOL_BLOCK_VALUE (s) = b;
@@ -1480,9 +1517,11 @@ parse_type (int fd, union aux_ext *ax, unsigned int aux_index, int *bs,
   if (t->fBitfield)
     {
       int width = AUX_GET_WIDTH (bigend, ax);
-
-      /* Inhibit core dumps with some cfront generated objects that
-         corrupt the TIR.  */
+#if 0 /* OBSOLETE CFront */
+// OBSOLETE      /* Inhibit core dumps with some cfront generated objects that
+// OBSOLETE         corrupt the TIR.  */
+#endif /* OBSOLETE CFront */
+      /* Inhibit core dumps if TIR is corrupted.  */
       if (bs == (int *) NULL)
        {
          /* Alpha cc -migrate encodes char and unsigned char types
@@ -2911,7 +2950,7 @@ parse_partial_symbols (struct objfile *objfile)
                          psymtab_include_list = (char **)
                            alloca ((includes_allocated *= 2) *
                                    sizeof (char *));
-                         memcpy ((PTR) psymtab_include_list, (PTR) orig,
+                         memcpy (psymtab_include_list, orig,
                                  includes_used * sizeof (char *));
                        }
                      continue;
@@ -2999,20 +3038,22 @@ parse_partial_symbols (struct objfile *objfile)
                                                     psymtab_language, objfile);
                                p += 1;
                              }
-                           /* The semantics of C++ state that "struct foo { ... }"
-                              also defines a typedef for "foo".  Unfortuantely, cfront
-                              never makes the typedef when translating from C++ to C.
-                              We make the typedef here so that "ptype foo" works as
-                              expected for cfront translated code.  */
-                           else if (psymtab_language == language_cplus)
-                             {
-                               /* Also a typedef with the same name.  */
-                               add_psymbol_to_list (namestring, p - namestring,
-                                                    VAR_NAMESPACE, LOC_TYPEDEF,
-                                                    &objfile->static_psymbols,
-                                                    sh.value, 0,
-                                                    psymtab_language, objfile);
-                             }
+#if 0 /* OBSOLETE CFront */
+// OBSOLETE                        /* The semantics of C++ state that "struct foo { ... }"
+// OBSOLETE                           also defines a typedef for "foo".  Unfortuantely, cfront
+// OBSOLETE                           never makes the typedef when translating from C++ to C.
+// OBSOLETE                           We make the typedef here so that "ptype foo" works as
+// OBSOLETE                           expected for cfront translated code.  */
+// OBSOLETE                        else if (psymtab_language == language_cplus)
+// OBSOLETE                          {
+// OBSOLETE                            /* Also a typedef with the same name.  */
+// OBSOLETE                            add_psymbol_to_list (namestring, p - namestring,
+// OBSOLETE                                                 VAR_NAMESPACE, LOC_TYPEDEF,
+// OBSOLETE                                                 &objfile->static_psymbols,
+// OBSOLETE                                                 sh.value, 0,
+// OBSOLETE                                                 psymtab_language, objfile);
+// OBSOLETE                          }
+#endif /* OBSOLETE CFront */
                          }
                        goto check_enum;
                      case 't':
@@ -3159,9 +3200,11 @@ parse_partial_symbols (struct objfile *objfile)
                      case '9':
                      case '-':
                      case '#':         /* for symbol identification (used in live ranges) */
-                       /* added to support cfront stabs strings */
-                     case 'Z':         /* for definition continuations */
-                     case 'P':         /* for prototypes */
+#if 0 /* OBSOLETE CFront */
+// OBSOLETE                    /* added to support cfront stabs strings */
+// OBSOLETE                  case 'Z':         /* for definition continuations */
+// OBSOLETE                  case 'P':         /* for prototypes */
+#endif /* OBSOLETE CFront */
                        continue;
 
                      case ':':
@@ -3323,6 +3366,39 @@ 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 */
+                   }
+
+                  /* 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
@@ -3345,30 +3421,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
This page took 0.025631 seconds and 4 git commands to generate.