* target.h: Add enum target_waitkind, enum target_signal, and
[deliverable/binutils-gdb.git] / gdb / partial-stab.h
index e76c8d86dd287a01d3b6ddd26530e55528d74e83..30942351b687fb43deaa7206698c4afde63fad2b 100644 (file)
@@ -43,6 +43,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
          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:           /* FIXME, is this in BSS? */
@@ -108,30 +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 += ANOFFSET (section_offsets, SECT_OFF_DATA);
-         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.
-            FIXME:  this might want to check for _DYNAMIC and the current
-                    symbol_leading_char.  */
-         if (namestring[8] == 'C' && STREQ ("__DYNAMIC", namestring))
-           goto record_it;
-
-         /* Same with virtual function tables, both global and static.  */
-         {
-           char *tempstring = namestring;
-           if (tempstring[0] == bfd_get_symbol_leading_char (objfile->obfd))
-             tempstring++;
-           if (VTBL_PREFIX_P ((tempstring)))
-             goto record_it;
-         }
-#endif /* DBXREAD_ONLY */
-         continue;
+         goto record_it;
 
        case N_UNDF | N_EXT:
 #ifdef DBXREAD_ONLY
@@ -175,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;
@@ -203,11 +187,13 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
           */
 
        case N_SO: {
-         unsigned long valu = CUR_SYMBOL_VALUE;
+         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)
@@ -231,8 +217,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
          SET_NAMESTRING();
 
-         valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
-
          /* 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 '/',
@@ -256,67 +240,96 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
        }
 
        case N_BINCL:
+         {
 #ifdef DBXREAD_ONLY
-         /* Add this bincl to the bincl_list for future EXCLs.  No
-            need to save the string; it'll be around until
-            read_dbx_symtab function returns */
+           enum language tmp_language;
+           /* Add this bincl to the bincl_list for future EXCLs.  No
+              need to save the string; it'll be around until
+              read_dbx_symtab function returns */
 
-         SET_NAMESTRING();
+           SET_NAMESTRING();
+
+           tmp_language = deduce_language_from_filename (namestring);
 
-         add_bincl_to_list (pst, namestring, CUR_SYMBOL_VALUE);
+           /* Only change the psymtab's language if we've learned
+              something useful (eg. tmp_language is not language_unknown).
+              In addition, to match what start_subfile does, never change
+              from C++ to C.  */
+           if (tmp_language != language_unknown
+               && (tmp_language != language_c
+                   || psymtab_language != language_cplus))
+             psymtab_language = tmp_language;
 
-         /* Mark down an include file in the current psymtab */
+           add_bincl_to_list (pst, namestring, CUR_SYMBOL_VALUE);
 
-         goto record_include_file;
+           /* Mark down an include file in the current psymtab */
+
+           goto record_include_file;
 
 #else /* DBXREAD_ONLY */
-         continue;
+           continue;
 #endif
+         }
 
        case N_SOL:
-         /* Mark down an include file in the current psymtab */
-
-         SET_NAMESTRING();
-
-         /* In C++, one may expect the same filename to come round many
-            times, when code is coming alternately from the main file
-            and from inline functions in other files. So I check to see
-            if this is a file we've seen before -- either the main
-            source file, or a previously included file.
-
-            This seems to be a lot of time to be spending on N_SOL, but
-            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 && STREQ (namestring, pst->filename))
-           continue;
          {
-           register int i;
-           for (i = 0; i < includes_used; i++)
-             if (STREQ (namestring, psymtab_include_list[i]))
-               {
-                 i = -1; 
-                 break;
-               }
-           if (i == -1)
+           enum language tmp_language;
+           /* Mark down an include file in the current psymtab */
+           
+           SET_NAMESTRING();
+  
+           tmp_language = deduce_language_from_filename (namestring);
+  
+           /* Only change the psymtab's language if we've learned
+              something useful (eg. tmp_language is not language_unknown).
+              In addition, to match what start_subfile does, never change
+              from C++ to C.  */
+           if (tmp_language != language_unknown
+               && (tmp_language != language_c
+                   || psymtab_language != language_cplus))
+             psymtab_language = tmp_language;
+           
+           /* In C++, one may expect the same filename to come round many
+              times, when code is coming alternately from the main file
+              and from inline functions in other files. So I check to see
+              if this is a file we've seen before -- either the main
+              source file, or a previously included file.
+              
+              This seems to be a lot of time to be spending on N_SOL, but
+              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 && STREQ (namestring, pst->filename))
              continue;
-         }
-
-       record_include_file:
-
-         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 *));
+             register int i;
+             for (i = 0; i < includes_used; i++)
+               if (STREQ (namestring, psymtab_include_list[i]))
+                 {
+                   i = -1; 
+                   break;
+                 }
+             if (i == -1)
+               continue;
            }
-         continue;
-
+           
+#ifdef DBXREAD_ONLY
+         record_include_file:
+#endif
+           
+           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 *));
+             }
+           continue;
+         }
        case N_LSYM:            /* Typedef or automatic variable. */
        case N_STSYM:           /* Data seg var -- static  */
        case N_LCSYM:           /* BSS      "  */
@@ -389,6 +402,20 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
                                           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,
+                                          CUR_SYMBOL_VALUE, psymtab_language,
+                                          objfile);
+                  }
                }
              goto check_enum;
            case 't':
@@ -524,14 +551,28 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
            case '9':
              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 ':'.  */
+             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]);
+
+             /* Ignore it; perhaps it is an extension that we don't
+                know about.  */
              continue;
            }
 
@@ -577,8 +618,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
                           (dependencies_used
                            * sizeof (struct partial_symtab *)));
 #ifdef DEBUG_INFO
-                   fprintf (stderr, "Had to reallocate dependency list.\n");
-                   fprintf (stderr, "New dependencies allocated: %d\n",
+                   fprintf_unfiltered (gdb_stderr, "Had to reallocate dependency list.\n");
+                   fprintf_unfiltered (gdb_stderr, "New dependencies allocated: %d\n",
                             dependencies_allocated);
 #endif
                  }
@@ -627,6 +668,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,
-                   local_hex_string (CUR_SYMBOL_TYPE));
+                   local_hex_string ((unsigned long) CUR_SYMBOL_TYPE));
          continue;
        }
This page took 0.026163 seconds and 4 git commands to generate.