* monitor.c: Include gnu-regex.h rather than system regex.h.
[deliverable/binutils-gdb.git] / gdb / partial-stab.h
index bfefbcc665ce6ae062541350635ac13fa29aa170..ac2149d975197d1e3fbb2fbb389a25c03427d6c5 100644 (file)
@@ -1,5 +1,5 @@
 /* Shared code to pre-read a stab (dbx-style), when building a psymtab.
 /* Shared code to pre-read a stab (dbx-style), when building a psymtab.
-   Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993
+   Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995
    Free Software Foundation, Inc.
 
 This file is part of GDB.
    Free Software Foundation, Inc.
 
 This file is part of GDB.
@@ -16,12 +16,23 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
 
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
-Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 /* The following need to be defined:
    SET_NAMESTRING() --Set namestring to name of symbol.
    CUR_SYMBOL_TYPE --Type code of current symbol.
    CUR_SYMBOL_VALUE --Value field of current symbol.  May be adjusted here.
 
 /* The following need to be defined:
    SET_NAMESTRING() --Set namestring to name of symbol.
    CUR_SYMBOL_TYPE --Type code of current symbol.
    CUR_SYMBOL_VALUE --Value field of current symbol.  May be adjusted here.
+   namestring - variable pointing to the name of the stab.
+   section_offsets - variable pointing to the section offsets.
+   pst - the partial symbol table being built.
+
+   psymtab_include_list, includes_used, includes_allocated - list of include
+     file names (N_SOL) seen so far.
+   dependency_list, dependencies_used, dependencies_allocated - list of
+     N_EXCL stabs seen so far.
+
+   END_PSYMTAB -- end a partial symbol table.
+   START_PSYMTAB -- start a partial symbol table.
  */
 
 /* End of macro definitions, now let's handle them symbols!  */
  */
 
 /* End of macro definitions, now let's handle them symbols!  */
@@ -80,7 +91,14 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
              || (namestring [(nsl = strlen (namestring)) - 1] == 'o'
                  && namestring [nsl - 2] == '.')
 #ifdef GDB_TARGET_IS_HPPA
              || (namestring [(nsl = strlen (namestring)) - 1] == 'o'
                  && namestring [nsl - 2] == '.')
 #ifdef GDB_TARGET_IS_HPPA
-              /* some cooperation from gcc to get around ld stupidity */
+              /* This braindamage is necessary for versions of GCC 2.6 and
+                earlier; it will not be necessary for GCC 2.7.
+
+                In a nutshell, we need a way to determine when we've hit
+                the end of a file with debug symbols.  Most ports do this
+                with a N_SO record with a NULL symbol name (as will GCC 2.7
+                on the PA).  GCC 2.6 (and earlier) on the PA instead creates
+                an N_TEXT symbol with the name "end_file."  */
               || (namestring[0] == 'e' && STREQ (namestring, "end_file."))
 #endif
              )
               || (namestring[0] == 'e' && STREQ (namestring, "end_file."))
 #endif
              )
@@ -193,6 +211,13 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
          char *p;
 
          valu = CUR_SYMBOL_VALUE + ANOFFSET (section_offsets, SECT_OFF_TEXT);
          char *p;
 
          valu = CUR_SYMBOL_VALUE + ANOFFSET (section_offsets, SECT_OFF_TEXT);
+#ifdef SOFUN_ADDRESS_MAYBE_MISSING
+         /* A zero value is probably an indication for the SunPRO 3.0
+            compiler. end_psymtab explicitly tests for zero, so
+            don't relocate it.  */
+         if (CUR_SYMBOL_VALUE == 0)
+           valu = 0;
+#endif
 
          past_first_source_file = 1;
 
 
          past_first_source_file = 1;
 
@@ -217,6 +242,10 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
          SET_NAMESTRING();
 
 
          SET_NAMESTRING();
 
+         /* Null name means end of .o file.  Don't start a new one. */
+         if (*namestring == '\000')
+           continue;
+
          /* Some compilers (including gcc) emit a pair of initial N_SOs.
             The first one is a directory name; the second the file name.
             If pst exists, is empty, and has a filename ending in '/',
          /* Some compilers (including gcc) emit a pair of initial N_SOs.
             The first one is a directory name; the second the file name.
             If pst exists, is empty, and has a filename ending in '/',
@@ -367,6 +396,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
            {
            case 'S':
              CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA);
            {
            case 'S':
              CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA);
+#ifdef STATIC_TRANSFORM_NAME
+             namestring = STATIC_TRANSFORM_NAME (namestring);
+#endif
              ADD_PSYMBOL_ADDR_TO_LIST (namestring, p - namestring,
                                        VAR_NAMESPACE, LOC_STATIC,
                                        objfile->static_psymbols,
              ADD_PSYMBOL_ADDR_TO_LIST (namestring, p - namestring,
                                        VAR_NAMESPACE, LOC_STATIC,
                                        objfile->static_psymbols,
@@ -452,6 +484,17 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
              if (*p++ == 'e')
                {
 
              if (*p++ == 'e')
                {
+                 /* The aix4 compiler emits extra crud before the members.  */
+                 if (*p == '-')
+                   {
+                     /* Skip over the type (?).  */
+                     while (*p != ':')
+                       p++;
+
+                     /* Skip over the colon.  */
+                     p++;
+                   }
+
                  /* We have found an enumerated type.  */
                  /* According to comments in read_enum_type
                     a comma could end it instead of a semicolon.
                  /* We have found an enumerated type.  */
                  /* According to comments in read_enum_type
                     a comma could end it instead of a semicolon.
@@ -463,7 +506,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
                      /* Check for and handle cretinous dbx symbol name
                         continuation!  */
 
                      /* Check for and handle cretinous dbx symbol name
                         continuation!  */
-                     if (*p == '\\')
+                     if (*p == '\\' || (*p == '?' && p[1] == '\0'))
                        p = next_symbol_text ();
 
                      /* Point to the character after the name
                        p = next_symbol_text ();
 
                      /* Point to the character after the name
@@ -496,11 +539,17 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
              continue;
 
            case 'f':
              continue;
 
            case 'f':
+             CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_TEXT);
 #ifdef DBXREAD_ONLY
              /* Kludges for ELF/STABS with Sun ACC */
              last_function_name = namestring;
 #ifdef DBXREAD_ONLY
              /* Kludges for ELF/STABS with Sun ACC */
              last_function_name = namestring;
-             if (pst && pst->textlow == 0)
-               pst->textlow = CUR_SYMBOL_VALUE;
+#ifdef SOFUN_ADDRESS_MAYBE_MISSING
+             /* Do not fix textlow==0 for .o or NLM files, as 0 is a legit
+                value for the bottom of the text seg in those cases. */
+             if (pst && pst->textlow == 0 && !symfile_relocatable)
+               pst->textlow =
+                 find_stab_function_addr (namestring, pst, objfile);
+#endif
 #if 0
              if (startup_file_end == 0)
                startup_file_end = CUR_SYMBOL_VALUE;
 #if 0
              if (startup_file_end == 0)
                startup_file_end = CUR_SYMBOL_VALUE;
@@ -517,11 +566,17 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
                 are put into the global psymtab like one would expect.
                 They're also in the minimal symbol table.  */
            case 'F':
                 are put into the global psymtab like one would expect.
                 They're also in the minimal symbol table.  */
            case 'F':
+             CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_TEXT);
 #ifdef DBXREAD_ONLY
              /* Kludges for ELF/STABS with Sun ACC */
              last_function_name = namestring;
 #ifdef DBXREAD_ONLY
              /* Kludges for ELF/STABS with Sun ACC */
              last_function_name = namestring;
-             if (pst && pst->textlow == 0)
-               pst->textlow = CUR_SYMBOL_VALUE;
+#ifdef SOFUN_ADDRESS_MAYBE_MISSING
+             /* Do not fix textlow==0 for .o or NLM files, as 0 is a legit
+                value for the bottom of the text seg in those cases. */
+             if (pst && pst->textlow == 0 && !symfile_relocatable)
+               pst->textlow =
+                 find_stab_function_addr (namestring, pst, objfile);
+#endif
 #if 0
              if (startup_file_end == 0)
                startup_file_end = CUR_SYMBOL_VALUE;
 #if 0
              if (startup_file_end == 0)
                startup_file_end = CUR_SYMBOL_VALUE;
@@ -549,16 +604,31 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
            case '7':
            case '8':
            case '9':
            case '7':
            case '8':
            case '9':
+           case '-':
              continue;
 
              continue;
 
-           default:
-             /* Unexpected symbol.  Ignore it; perhaps it is an extension
-                that we don't know about.
-
-                Someone says sun cc puts out symbols like
+           case ':':
+             /* It is a C++ nested symbol.  We don't need to record it
+                (I don't think); if we try to look up foo::bar::baz,
+                then symbols for the symtab containing foo should get
+                read in, I think.  */
+             /* Someone says sun cc puts out symbols like
                 /foo/baz/maclib::/usr/local/bin/maclib,
                 which would get here with a symbol type of ':'.  */
                 /foo/baz/maclib::/usr/local/bin/maclib,
                 which would get here with a symbol type of ':'.  */
+             continue;
+
+           default:
+             /* Unexpected symbol descriptor.  The second and subsequent stabs
+                of a continued stab can show up here.  The question is
+                whether they ever can mimic a normal stab--it would be
+                nice if not, since we certainly don't want to spend the
+                time searching to the end of every string looking for
+                a backslash.  */
+
              complain (&unknown_symchar_complaint, p[1]);
              complain (&unknown_symchar_complaint, p[1]);
+
+             /* Ignore it; perhaps it is an extension that we don't
+                know about.  */
              continue;
            }
 
              continue;
            }
 
@@ -610,9 +680,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #endif
                  }
              }
 #endif
                  }
              }
-           else
-             error ("Invalid symbol data: \"repeated\" header file not previously seen, at symtab pos %d.",
-                    symnum);
          }
 #endif /* DBXREAD_ONLY */
          continue;
          }
 #endif /* DBXREAD_ONLY */
          continue;
@@ -654,6 +721,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
          /* If we haven't found it yet, ignore it.  It's probably some
             new type we don't know about yet.  */
          complain (&unknown_symtype_complaint,
          /* If we haven't found it yet, ignore it.  It's probably some
             new type we don't know about yet.  */
          complain (&unknown_symtype_complaint,
-                   local_hex_string ((unsigned long) CUR_SYMBOL_TYPE));
+                   local_hex_string (CUR_SYMBOL_TYPE));
          continue;
        }
          continue;
        }
This page took 0.025446 seconds and 4 git commands to generate.