use remote-utils facilities for baud_rate
[deliverable/binutils-gdb.git] / gdb / partial-stab.h
index 6b6e3de9a31dd21f24e8fa5115dcd324b28fbd47..e511599b6419c1919545f1284fde92bb5e900e96 100644 (file)
@@ -1,6 +1,6 @@
 /* Shared code to pre-read a stab (dbx-style), when building a psymtab.
-   Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992 Free Software Foundation,
-   Inc.
+   Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993
+   Free Software Foundation, Inc.
 
 This file is part of GDB.
 
@@ -35,16 +35,24 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
        case N_TEXT | N_EXT:
        case N_NBTEXT | N_EXT:
+         CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_TEXT);
+         goto record_it;
+
+       case N_DATA | N_EXT:
        case N_NBDATA | N_EXT:
+         CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA);
+         goto record_it;
+
+       case N_BSS:
+       case N_BSS | N_EXT:
        case N_NBBSS | N_EXT:
-       case N_SETV | N_EXT:
+        case N_SETV | N_EXT:           /* FIXME, is this in BSS? */
+         CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_BSS);
+         goto record_it;
+
        case N_ABS | N_EXT:
-       case N_DATA | N_EXT:
-       case N_BSS | N_EXT:
+       record_it:
 #ifdef DBXREAD_ONLY
-
-         CUR_SYMBOL_VALUE += addr;             /* Relocate */
-
          SET_NAMESTRING();
 
        bss_ext_symbol:
@@ -66,23 +74,29 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
        case N_FN_SEQ:
        case N_TEXT:
 #ifdef DBXREAD_ONLY
-         CUR_SYMBOL_VALUE += addr;             /* Relocate */
+         CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_TEXT);
          SET_NAMESTRING();
          if ((namestring[0] == '-' && namestring[1] == 'l')
              || (namestring [(nsl = strlen (namestring)) - 1] == 'o'
-                 && namestring [nsl - 2] == '.'))
+                 && namestring [nsl - 2] == '.')
+#ifdef GDB_TARGET_IS_HPPA
+              /* some cooperation from gcc to get around ld stupidity */
+              || (namestring[0] == 'e' && STREQ (namestring, "end_file."))
+#endif
+             )
            {
+#ifndef GDB_TARGET_IS_HPPA
              if (objfile -> ei.entry_point <  CUR_SYMBOL_VALUE &&
-                 objfile -> ei.entry_point >= last_o_file_start &&
-                 addr == 0)            /* FIXME nogood nomore */
+                 objfile -> ei.entry_point >= last_o_file_start)
                {
                  objfile -> ei.entry_file_lowpc = last_o_file_start;
                  objfile -> ei.entry_file_highpc = CUR_SYMBOL_VALUE;
                }
+#endif
              if (past_first_source_file && pst
                  /* The gould NP1 uses low values for .o and -l symbols
                     which are not the address.  */
-                 && CUR_SYMBOL_VALUE > pst->textlow)
+                 && CUR_SYMBOL_VALUE >= pst->textlow)
                {
                  END_PSYMTAB (pst, psymtab_include_list, includes_used,
                               symnum * symbol_size, CUR_SYMBOL_VALUE,
@@ -95,25 +109,14 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
                past_first_source_file = 1;
              last_o_file_start = CUR_SYMBOL_VALUE;
            }
+         else
+           goto record_it;
 #endif /* DBXREAD_ONLY */
          continue;
 
        case N_DATA:
-#ifdef DBXREAD_ONLY
-         CUR_SYMBOL_VALUE += addr;             /* Relocate */
-         SET_NAMESTRING ();
-         /* Check for __DYNAMIC, which is used by Sun shared libraries. 
-            Record it even if it's local, not global, so we can find it.
-            Same with virtual function tables, both global and static.  */
-         if ((namestring[8] == 'C' && (strcmp ("__DYNAMIC", namestring) == 0))
-             || VTBL_PREFIX_P ((namestring+HASH_OFFSET)))
-           {
-             /* Not really a function here, but... */
-             record_minimal_symbol (namestring, CUR_SYMBOL_VALUE,
-                                   CUR_SYMBOL_TYPE, objfile); /* Always */
-         }
-#endif /* DBXREAD_ONLY */
-         continue;
+         CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA);
+         goto record_it;
 
        case N_UNDF | N_EXT:
 #ifdef DBXREAD_ONLY
@@ -157,7 +160,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
            /* Lots of symbol types we can just ignore.  */
 
        case N_ABS:
-       case N_BSS:
        case N_NBDATA:
        case N_NBBSS:
          continue;
@@ -185,18 +187,36 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
           */
 
        case N_SO: {
-         unsigned long valu = CUR_SYMBOL_VALUE;
-         static int last_so_symnum = -10;
-         static int dir_so_symnum = -1;
-         int tmp;
+         unsigned long valu;
+         static int prev_so_symnum = -10;
+         static int first_so_symnum;
          char *p;
-         
+
+         valu = CUR_SYMBOL_VALUE + ANOFFSET (section_offsets, SECT_OFF_TEXT);
+
+         past_first_source_file = 1;
+
+         if (prev_so_symnum != symnum - 1)
+           {                   /* Here if prev stab wasn't N_SO */
+             first_so_symnum = symnum;
+
+             if (pst)
+               {
+                 END_PSYMTAB (pst, psymtab_include_list, includes_used,
+                              symnum * symbol_size, valu,
+                              dependency_list, dependencies_used);
+                 pst = (struct partial_symtab *) 0;
+                 includes_used = 0;
+                 dependencies_used = 0;
+               }
+           }
+
+         prev_so_symnum = symnum;
+
          /* End the current partial symtab and start a new one */
 
          SET_NAMESTRING();
 
-         valu += addr;         /* Relocate */
-
          /* 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 '/',
@@ -204,40 +224,18 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
          p = strrchr (namestring, '/');
          if (p && *(p+1) == '\000')
-           {
-             dir_so_symnum = symnum;
-             continue;         /* Simply ignore directory name SOs */
-           }
+           continue;           /* Simply ignore directory name SOs */
 
          /* Some other compilers (C++ ones in particular) emit useless
-            SOs for non-existant .c files. */
-
-         if (last_so_symnum == symnum - 1)
-           continue;           /* Ignore repeated SOs */
-         last_so_symnum = symnum;
-
-         if (pst)
-           {
-             END_PSYMTAB (pst, psymtab_include_list, includes_used,
-                          symnum * symbol_size, valu,
-                          dependency_list, dependencies_used);
-             pst = (struct partial_symtab *) 0;
-             includes_used = 0;
-             dependencies_used = 0;
-           }
-
-         past_first_source_file = 1;
-
-         if (dir_so_symnum == symnum - 1) /* Was prev. SO a directory? */
-           tmp = dir_so_symnum;
-         else
-           tmp = symnum;
-         pst = START_PSYMTAB (objfile, addr,
-                              namestring, valu,
-                              tmp * symbol_size,
-                              objfile -> global_psymbols.next,
-                              objfile -> static_psymbols.next);
-         dir_so_symnum = -1;
+            SOs for non-existant .c files.  We ignore all subsequent SOs that
+            immediately follow the first.  */
+
+         if (!pst)
+           pst = START_PSYMTAB (objfile, section_offsets,
+                                namestring, valu,
+                                first_so_symnum * symbol_size,
+                                objfile -> global_psymbols.next,
+                                objfile -> static_psymbols.next);
          continue;
        }
 
@@ -253,20 +251,11 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
          /* Mark down an include file in the current psymtab */
 
-         psymtab_include_list[includes_used++] = namestring;
-         if (includes_used >= includes_allocated)
-           {
-             char **orig = psymtab_include_list;
-
-             psymtab_include_list = (char **)
-               alloca ((includes_allocated *= 2) *
-                       sizeof (char *));
-             memcpy ((PTR)psymtab_include_list, (PTR)orig,
-                     includes_used * sizeof (char *));
-           }
+         goto record_include_file;
 
-#endif /* DBXREAD_ONLY */
+#else /* DBXREAD_ONLY */
          continue;
+#endif
 
        case N_SOL:
          /* Mark down an include file in the current psymtab */
@@ -283,12 +272,12 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
             things like "break c-exp.y:435" need to work (I
             suppose the psymtab_include_list could be hashed or put
             in a binary tree, if profiling shows this is a major hog).  */
-         if (pst && !strcmp (namestring, pst->filename))
+         if (pst && STREQ (namestring, pst->filename))
            continue;
          {
            register int i;
            for (i = 0; i < includes_used; i++)
-             if (!strcmp (namestring, psymtab_include_list[i]))
+             if (STREQ (namestring, psymtab_include_list[i]))
                {
                  i = -1; 
                  break;
@@ -297,6 +286,10 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
              continue;
          }
 
+#ifdef DBXREAD_ONLY
+       record_include_file:
+#endif
+
          psymtab_include_list[includes_used++] = namestring;
          if (includes_used >= includes_allocated)
            {
@@ -313,30 +306,73 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
        case N_LSYM:            /* Typedef or automatic variable. */
        case N_STSYM:           /* Data seg var -- static  */
        case N_LCSYM:           /* BSS      "  */
+       case N_ROSYM:           /* Read-only data seg var -- static.  */
        case N_NBSTS:           /* Gould nobase.  */
        case N_NBLCS:           /* symbols.  */
+       case N_FUN:
+       case N_GSYM:            /* Global (extern) variable; can be
+                                  data or bss (sigh FIXME).  */
+
+       /* Following may probably be ignored; I'll leave them here
+          for now (until I do Pascal and Modula 2 extensions).  */
+
+       case N_PC:              /* I may or may not need this; I
+                                  suspect not.  */
+       case N_M2C:             /* I suspect that I can ignore this here. */
+       case N_SCOPE:           /* Same.   */
 
          SET_NAMESTRING();
 
          p = (char *) strchr (namestring, ':');
+         if (!p)
+           continue;           /* Not a debugging symbol.   */
+
 
-         /* Skip if there is no :.  */
-         if (!p) continue;
+
+         /* Main processing section for debugging symbols which
+            the initial read through the symbol tables needs to worry
+            about.  If we reach this point, the symbol which we are
+            considering is definitely one we are interested in.
+            p must also contain the (valid) index into the namestring
+            which indicates the debugging type symbol.  */
 
          switch (p[1])
            {
+           case 'S':
+             CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA);
+             ADD_PSYMBOL_ADDR_TO_LIST (namestring, p - namestring,
+                                       VAR_NAMESPACE, LOC_STATIC,
+                                       objfile->static_psymbols,
+                                       CUR_SYMBOL_VALUE,
+                                       psymtab_language, objfile);
+             continue;
+           case 'G':
+             CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA);
+             /* The addresses in these entries are reported to be
+                wrong.  See the code that reads 'G's for symtabs. */
+             ADD_PSYMBOL_ADDR_TO_LIST (namestring, p - namestring,
+                                       VAR_NAMESPACE, LOC_STATIC,
+                                       objfile->global_psymbols,
+                                       CUR_SYMBOL_VALUE,
+                                       psymtab_language, objfile);
+             continue;
+
            case 'T':
              if (p != namestring)      /* a name is there, not just :T... */
                {
                  ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
                                       STRUCT_NAMESPACE, LOC_TYPEDEF,
-                                      objfile->static_psymbols, CUR_SYMBOL_VALUE);
+                                      objfile->static_psymbols,
+                                      CUR_SYMBOL_VALUE,
+                                      psymtab_language, objfile);
                  if (p[2] == 't')
                    {
                      /* Also a typedef with the same name.  */
                      ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
                                           VAR_NAMESPACE, LOC_TYPEDEF,
-                                          objfile->static_psymbols, CUR_SYMBOL_VALUE);
+                                          objfile->static_psymbols,
+                                          CUR_SYMBOL_VALUE, psymtab_language,
+                                          objfile);
                      p += 1;
                    }
                }
@@ -346,7 +382,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
                {
                  ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
                                       VAR_NAMESPACE, LOC_TYPEDEF,
-                                      objfile->static_psymbols, CUR_SYMBOL_VALUE);
+                                      objfile->static_psymbols,
+                                      CUR_SYMBOL_VALUE,
+                                      psymtab_language, objfile);
                }
            check_enum:
              /* If this is an enumerated type, we need to
@@ -355,9 +393,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
                 "enum {a, b} c;" in C, but fortunately those are
                 rare.  There is no way for GDB to find those from the
                 enum type without spending too much time on it.  Thus
-                to solve this problem, the compiler needs to put out separate
-                constant symbols ('c' N_LSYMS) for enum constants in
-                enums without names, or put out a dummy type.  */
+                to solve this problem, the compiler needs to put out the
+                enum in a nameless type.  GCC2 does this.  */
 
              /* We are looking for something of the form
                 <name> ":" ("t" | "T") [<number> "="] "e"
@@ -396,7 +433,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
                         enum constants in psymtabs, just in symtabs.  */
                      ADD_PSYMBOL_TO_LIST (p, q - p,
                                           VAR_NAMESPACE, LOC_CONST,
-                                          objfile->static_psymbols, 0);
+                                          objfile->static_psymbols, 0,
+                                          psymtab_language, objfile);
                      /* Point past the name.  */
                      p = q;
                      /* Skip over the value.  */
@@ -412,75 +450,15 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
              /* Constant, e.g. from "const" in Pascal.  */
              ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
                                   VAR_NAMESPACE, LOC_CONST,
-                                  objfile->static_psymbols, CUR_SYMBOL_VALUE);
-             continue;
-           default:
-             /* Skip if the thing following the : is
-                not a letter (which indicates declaration of a local
-                variable, which we aren't interested in).  */
-             continue;
-           }
-
-       case N_FUN:
-       case N_GSYM:            /* Global (extern) variable; can be
-                                  data or bss (sigh).  */
-
-       /* Following may probably be ignored; I'll leave them here
-          for now (until I do Pascal and Modula 2 extensions).  */
-
-       case N_PC:              /* I may or may not need this; I
-                                  suspect not.  */
-       case N_M2C:             /* I suspect that I can ignore this here. */
-       case N_SCOPE:           /* Same.   */
-
-         SET_NAMESTRING();
-
-         p = (char *) strchr (namestring, ':');
-         if (!p)
-           continue;           /* Not a debugging symbol.   */
-
-
-
-         /* Main processing section for debugging symbols which
-            the initial read through the symbol tables needs to worry
-            about.  If we reach this point, the symbol which we are
-            considering is definitely one we are interested in.
-            p must also contain the (valid) index into the namestring
-            which indicates the debugging type symbol.  */
-
-         switch (p[1])
-           {
-           case 'c':
-             ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
-                                  VAR_NAMESPACE, LOC_CONST,
-                                  objfile->static_psymbols, CUR_SYMBOL_VALUE);
-             continue;
-           case 'S':
-             CUR_SYMBOL_VALUE += addr;         /* Relocate */
-             ADD_PSYMBOL_ADDR_TO_LIST (namestring, p - namestring,
-                                  VAR_NAMESPACE, LOC_STATIC,
-                                  objfile->static_psymbols, CUR_SYMBOL_VALUE);
-             continue;
-           case 'G':
-             CUR_SYMBOL_VALUE += addr;         /* Relocate */
-             /* The addresses in these entries are reported to be
-                wrong.  See the code that reads 'G's for symtabs. */
-             ADD_PSYMBOL_ADDR_TO_LIST (namestring, p - namestring,
-                                  VAR_NAMESPACE, LOC_STATIC,
-                                  objfile->global_psymbols, CUR_SYMBOL_VALUE);
-             continue;
-
-           case 't':
-             ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
-                                  VAR_NAMESPACE, LOC_TYPEDEF,
-                                  objfile->static_psymbols, CUR_SYMBOL_VALUE);
+                                  objfile->static_psymbols, CUR_SYMBOL_VALUE,
+                                  psymtab_language, objfile);
              continue;
 
            case 'f':
 #ifdef DBXREAD_ONLY
              /* Kludges for ELF/STABS with Sun ACC */
              last_function_name = namestring;
-             if (pst->textlow == 0)
+             if (pst && pst->textlow == 0)
                pst->textlow = CUR_SYMBOL_VALUE;
 #if 0
              if (startup_file_end == 0)
@@ -490,19 +468,18 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #endif /* DBXREAD_ONLY */
              ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
                                   VAR_NAMESPACE, LOC_BLOCK,
-                                  objfile->static_psymbols, CUR_SYMBOL_VALUE);
+                                  objfile->static_psymbols, CUR_SYMBOL_VALUE,
+                                  psymtab_language, objfile);
              continue;
 
              /* Global functions were ignored here, but now they
                 are put into the global psymtab like one would expect.
-                They're also in the misc fn vector... 
-                FIXME, why did it used to ignore these?  That broke
-                "i fun" on these functions.  */
+                They're also in the minimal symbol table.  */
            case 'F':
 #ifdef DBXREAD_ONLY
              /* Kludges for ELF/STABS with Sun ACC */
              last_function_name = namestring;
-             if (pst->textlow == 0)
+             if (pst && pst->textlow == 0)
                pst->textlow = CUR_SYMBOL_VALUE;
 #if 0
              if (startup_file_end == 0)
@@ -512,7 +489,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #endif /* DBXREAD_ONLY */
              ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
                                   VAR_NAMESPACE, LOC_BLOCK,
-                                  objfile->global_psymbols, CUR_SYMBOL_VALUE);
+                                  objfile->global_psymbols, CUR_SYMBOL_VALUE,
+                                  psymtab_language, objfile);
              continue;
 
              /* Two things show up here (hopefully); static symbols of
@@ -539,6 +517,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
                 Someone says sun cc puts out symbols like
                 /foo/baz/maclib::/usr/local/bin/maclib,
                 which would get here with a symbol type of ':'.  */
+             complain (&unknown_symchar_complaint, p[1]);
              continue;
            }
 
@@ -623,8 +602,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
        case N_NSYMS:           /* Ultrix 4.0: symbol count */
        case N_DEFD:            /* GNU Modula-2 */
 
-       case N_OBJ:             /* two useless types from Solaris */
+       case N_OBJ:             /* useless types from Solaris */
        case N_OPT:
+       case N_ENDM:
          /* These symbols aren't interesting; don't worry about them */
 
          continue;
@@ -632,6 +612,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
        default:
          /* 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(CUR_SYMBOL_TYPE));
+         complain (&unknown_symtype_complaint,
+                   local_hex_string (CUR_SYMBOL_TYPE));
          continue;
        }
This page took 0.029125 seconds and 4 git commands to generate.