2001-11-06 Elena Zannoni <ezannoni@redhat.com>
authorElena Zannoni <ezannoni@kwikemart.cygnus.com>
Tue, 6 Nov 2001 22:35:25 +0000 (22:35 +0000)
committerElena Zannoni <ezannoni@kwikemart.cygnus.com>
Tue, 6 Nov 2001 22:35:25 +0000 (22:35 +0000)
        * mdebugread.c (CUR_SYMBOL_TYPE, CUR_SYMBOL_VALUE, START_PSYMTAB,
        END_PSYMTAB, SET_NAMESTRING, HANDLE_RBRAC): Delete definitions.
        (parse_partial_symbols): Don't include partial-stab.h any
        more. Don't reuse code in partial-stab.h, include the code
        directly, instead. Simplify code from partial-stab.h eliminating
        ifdef DBXREAD_ONLY code.

        * Makefile.in (mdebugread.o): Remove dependency on partial-stab.h.

gdb/ChangeLog
gdb/Makefile.in
gdb/mdebugread.c

index aaa1344..ff16527 100644 (file)
@@ -1,3 +1,14 @@
+2001-11-06  Elena Zannoni  <ezannoni@redhat.com>
+
+        * mdebugread.c (CUR_SYMBOL_TYPE, CUR_SYMBOL_VALUE, START_PSYMTAB,
+        END_PSYMTAB, SET_NAMESTRING, HANDLE_RBRAC): Delete definitions.
+        (parse_partial_symbols): Don't include partial-stab.h any
+        more. Don't reuse code in partial-stab.h, include the code
+        directly, instead. Simplify code from partial-stab.h eliminating
+        ifdef DBXREAD_ONLY code.
+
+        * Makefile.in (mdebugread.o): Remove dependency on partial-stab.h.
+
 2001-11-06  Jim Blandy  <jimb@redhat.com>
 
        * s390-nat.c: #include "regcache.h", to get declaration for
index de8e8f0..1370388 100644 (file)
@@ -1702,7 +1702,7 @@ mcore-rom.o: mcore-rom.c $(defs_h) $(gdbcore_h) $(target_h) $(monitor_h) \
 
 mdebugread.o: mdebugread.c $(buildsym_h) $(complaints_h) $(bfd_h) $(defs_h) \
        $(expression_h) $(gdb_stabs_h) $(gdbcore_h) $(gdbtypes_h) \
-       $(language_h) $(objfiles_h) partial-stab.h $(stabsread_h) \
+       $(language_h) partial-stab.h $(objfiles_h) $(stabsread_h) \
        $(symfile_h) $(symtab_h) $(gdb_string_h)
 
 mipsm3-nat.o: mipsm3-nat.c $(defs_h) $(inferior_h) $(regcache_h)
index 255ad99..8ce2d0f 100644 (file)
@@ -88,7 +88,7 @@ typedef struct mips_extra_func_info
 #include "aout/stab_gnu.h"     /* STABS information */
 
 #include "expression.h"
-#include "language.h"          /* Needed inside partial-stab.h */
+#include "language.h"          /* For local_hex_string() */
 
 extern void _initialize_mdebugread (void);
 
@@ -2717,17 +2717,549 @@ parse_partial_symbols (struct objfile *objfile)
                    len += len2;
                  }
 
-#define SET_NAMESTRING() \
-  namestring = stabstring
-#define CUR_SYMBOL_TYPE type_code
-#define CUR_SYMBOL_VALUE sh.value
-#define START_PSYMTAB(ofile,fname,low,symoff,global_syms,static_syms)\
-  (pst = save_pst)
-#define END_PSYMTAB(pst,ilist,ninc,c_off,c_text,dep_list,n_deps,textlow_not_set) (void)0
-#define HANDLE_RBRAC(val) \
-  if ((val) > TEXTHIGH (save_pst)) TEXTHIGH (save_pst) = (val);
-#include "partial-stab.h"
+               switch (type_code)
+                 {
+                   static struct complaint function_outside_compilation_unit = {
+                     "function `%s' appears to be defined outside of all compilation units", 0, 0
+                   };
+                   char *p;
+                   /*
+                    * Standard, external, non-debugger, symbols
+                    */
+
+                 case N_TEXT | N_EXT:
+                 case N_NBTEXT | N_EXT:
+                   sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
+                   goto record_it;
+
+                 case N_DATA | N_EXT:
+                 case N_NBDATA | N_EXT:
+                   sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
+                   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? */
+                   sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS (objfile));
+                   goto record_it;
+
+                 case N_ABS | N_EXT:
+                 record_it:
+                 continue;
+
+                 /* Standard, local, non-debugger, symbols */
+
+                 case N_NBTEXT:
+
+                   /* We need to be able to deal with both N_FN or N_TEXT,
+                      because we have no way of knowing whether the sys-supplied ld
+                      or GNU ld was used to make the executable.  Sequents throw
+                      in another wrinkle -- they renumbered N_FN.  */
+
+                 case N_FN:
+                 case N_FN_SEQ:
+                 case N_TEXT:
+                   continue;
+
+                 case N_DATA:
+                   sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
+                   goto record_it;
+
+                 case N_UNDF | N_EXT:
+                   continue;                   /* Just undefined, not COMMON */
+
+                 case N_UNDF:
+                   continue;
+
+                   /* Lots of symbol types we can just ignore.  */
+
+                 case N_ABS:
+                 case N_NBDATA:
+                 case N_NBBSS:
+                   continue;
+
+                   /* Keep going . . . */
+
+                   /*
+                    * Special symbol types for GNU
+                    */
+                 case N_INDR:
+                 case N_INDR | N_EXT:
+                 case N_SETA:
+                 case N_SETA | N_EXT:
+                 case N_SETT:
+                 case N_SETT | N_EXT:
+                 case N_SETD:
+                 case N_SETD | N_EXT:
+                 case N_SETB:
+                 case N_SETB | N_EXT:
+                 case N_SETV:
+                   continue;
+
+                   /*
+                    * Debugger symbols
+                    */
+
+                 case N_SO:
+                   {
+                     CORE_ADDR valu;
+                     static int prev_so_symnum = -10;
+                     static int first_so_symnum;
+                     char *p;
+                     int prev_textlow_not_set;
+
+                     valu = sh.value + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
+
+                     prev_textlow_not_set = textlow_not_set;
+
+#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 (sh.value == 0)
+                       {
+                         textlow_not_set = 1;
+                         valu = 0;
+                       }
+                     else
+                       textlow_not_set = 0;
+#else
+                     textlow_not_set = 0;
+#endif
+                     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)
+                           {
+                             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 ();*/
+                     namestring = stabstring;
+
+                     /* 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 '/',
+                        we assume the previous N_SO was a directory name. */
+
+                     p = strrchr (namestring, '/');
+                     if (p && *(p + 1) == '\000')
+                       continue;               /* Simply ignore directory name SOs */
+
+                     /* Some other compilers (C++ ones in particular) emit useless
+                        SOs for non-existant .c files.  We ignore all subsequent SOs that
+                        immediately follow the first.  */
+
+                     if (!pst)
+                       pst = save_pst;
+                     continue;
+                   }
+
+                 case N_BINCL:
+                   continue;
+
+                 case N_SOL:
+                   {
+                     enum language tmp_language;
+                     /* Mark down an include file in the current psymtab */
+
+                     /* SET_NAMESTRING ();*/
+                     namestring = stabstring;
+
+                     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;
+                     {
+                       register int i;
+                       for (i = 0; i < includes_used; i++)
+                         if (STREQ (namestring, psymtab_include_list[i]))
+                           {
+                             i = -1;
+                             break;
+                           }
+                       if (i == -1)
+                         continue;
+                     }
+
+                     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      "  */
+                 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 ();*/
+                   namestring = stabstring;
+                   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 'S':
+                       sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
+#ifdef STATIC_TRANSFORM_NAME
+                       namestring = STATIC_TRANSFORM_NAME (namestring);
+#endif
+                       add_psymbol_to_list (namestring, p - namestring,
+                                            VAR_NAMESPACE, LOC_STATIC,
+                                            &objfile->static_psymbols,
+                                            0, sh.value,
+                                            psymtab_language, objfile);
+                       continue;
+                     case 'G':
+                       sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
+                       /* The addresses in these entries are reported to be
+                          wrong.  See the code that reads 'G's for symtabs. */
+                       add_psymbol_to_list (namestring, p - namestring,
+                                            VAR_NAMESPACE, LOC_STATIC,
+                                            &objfile->global_psymbols,
+                                            0, sh.value,
+                                            psymtab_language, objfile);
+                       continue;
+
+                     case 'T':
+                       /* When a 'T' entry is defining an anonymous enum, it
+                          may have a name which is the empty string, or a
+                          single space.  Since they're not really defining a
+                          symbol, those shouldn't go in the partial symbol
+                          table.  We do pick up the elements of such enums at
+                          'check_enum:', below.  */
+                       if (p >= namestring + 2
+                           || (p == namestring + 1
+                               && namestring[0] != ' '))
+                         {
+                           add_psymbol_to_list (namestring, p - namestring,
+                                                STRUCT_NAMESPACE, LOC_TYPEDEF,
+                                                &objfile->static_psymbols,
+                                                sh.value, 0,
+                                                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,
+                                                    sh.value, 0,
+                                                    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);
+                             }
+                         }
+                       goto check_enum;
+                     case 't':
+                       if (p != namestring)    /* a name is there, not just :T... */
+                         {
+                           add_psymbol_to_list (namestring, p - namestring,
+                                                VAR_NAMESPACE, LOC_TYPEDEF,
+                                                &objfile->static_psymbols,
+                                                sh.value, 0,
+                                                psymtab_language, objfile);
+                         }
+                     check_enum:
+                       /* If this is an enumerated type, we need to
+                          add all the enum constants to the partial symbol
+                          table.  This does not cover enums without names, e.g.
+                          "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 the
+                          enum in a nameless type.  GCC2 does this.  */
+
+                       /* We are looking for something of the form
+                          <name> ":" ("t" | "T") [<number> "="] "e"
+                          {<constant> ":" <value> ","} ";".  */
+
+                       /* Skip over the colon and the 't' or 'T'.  */
+                       p += 2;
+                       /* This type may be given a number.  Also, numbers can come
+                          in pairs like (0,26).  Skip over it.  */
+                       while ((*p >= '0' && *p <= '9')
+                              || *p == '(' || *p == ',' || *p == ')'
+                              || *p == '=')
+                         p++;
+
+                       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.
+                              I don't know where that happens.
+                              Accept either.  */
+                           while (*p && *p != ';' && *p != ',')
+                             {
+                               char *q;
+
+                               /* Check for and handle cretinous dbx symbol name
+                                  continuation!  */
+                               if (*p == '\\' || (*p == '?' && p[1] == '\0'))
+                                 p = next_symbol_text (objfile);
+
+                               /* Point to the character after the name
+                                  of the enum constant.  */
+                               for (q = p; *q && *q != ':'; q++)
+                                 ;
+                               /* Note that the value doesn't matter for
+                                  enum constants in psymtabs, just in symtabs.  */
+                               add_psymbol_to_list (p, q - p,
+                                                    VAR_NAMESPACE, LOC_CONST,
+                                                    &objfile->static_psymbols, 0,
+                                                    0, psymtab_language, objfile);
+                               /* Point past the name.  */
+                               p = q;
+                               /* Skip over the value.  */
+                               while (*p && *p != ',')
+                                 p++;
+                               /* Advance past the comma.  */
+                               if (*p)
+                                 p++;
+                             }
+                         }
+                       continue;
+                     case 'c':
+                       /* Constant, e.g. from "const" in Pascal.  */
+                       add_psymbol_to_list (namestring, p - namestring,
+                                            VAR_NAMESPACE, LOC_CONST,
+                                            &objfile->static_psymbols, sh.value,
+                                            0, psymtab_language, objfile);
+                       continue;
+
+                     case 'f':
+                       if (! pst)
+                         {
+                           int name_len = p - namestring;
+                           char *name = xmalloc (name_len + 1);
+                           memcpy (name, namestring, name_len);
+                           name[name_len] = '\0';
+                           complain (&function_outside_compilation_unit, name);
+                           xfree (name);
+                         }
+                       sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
+                       add_psymbol_to_list (namestring, p - namestring,
+                                            VAR_NAMESPACE, LOC_BLOCK,
+                                            &objfile->static_psymbols,
+                                            0, sh.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 minimal symbol table.  */
+                     case 'F':
+                       if (! pst)
+                         {
+                           int name_len = p - namestring;
+                           char *name = xmalloc (name_len + 1);
+                           memcpy (name, namestring, name_len);
+                           name[name_len] = '\0';
+                           complain (&function_outside_compilation_unit, name);
+                           xfree (name);
+                         }
+                       sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
+                       add_psymbol_to_list (namestring, p - namestring,
+                                            VAR_NAMESPACE, LOC_BLOCK,
+                                            &objfile->global_psymbols,
+                                            0, sh.value,
+                                            psymtab_language, objfile);
+                       continue;
+
+                       /* Two things show up here (hopefully); static symbols of
+                          local scope (static used inside braces) or extensions
+                          of structure symbols.  We can ignore both.  */
+                     case 'V':
+                     case '(':
+                     case '0':
+                     case '1':
+                     case '2':
+                     case '3':
+                     case '4':
+                     case '5':
+                     case '6':
+                     case '7':
+                     case '8':
+                     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 */
+                       continue;
+
+                     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;
+                     }
+
+                 case N_EXCL:
+                   continue;
+
+                 case N_ENDM:
+#ifdef SOFUN_ADDRESS_MAYBE_MISSING
+                   /* Solaris 2 end of module, finish current partial symbol table.
+                      END_PSYMTAB will set TEXTHIGH (pst) to the proper value, which
+                      is necessary if a module compiled without debugging info
+                      follows this module.  */
+                   if (pst)
+                     {
+                       pst = (struct partial_symtab *) 0;
+                       includes_used = 0;
+                       dependencies_used = 0;
+                     }
+#endif
+                   continue;
+
+                 case N_RBRAC:
+                   if (sh.value > TEXTHIGH (save_pst))
+                     TEXTHIGH (save_pst) = sh.value;
+                   continue;
+                 case N_EINCL:
+                 case N_DSLINE:
+                 case N_BSLINE:
+                 case N_SSYM:                  /* Claim: Structure or union element.
+                                                  Hopefully, I can ignore this.  */
+                 case N_ENTRY:         /* Alternate entry point; can ignore. */
+                 case N_MAIN:                  /* Can definitely ignore this.   */
+                 case N_CATCH:         /* These are GNU C++ extensions */
+                 case N_EHDECL:                /* that can safely be ignored here. */
+                 case N_LENG:
+                 case N_BCOMM:
+                 case N_ECOMM:
+                 case N_ECOML:
+                 case N_FNAME:
+                 case N_SLINE:
+                 case N_RSYM:
+                 case N_PSYM:
+                 case N_LBRAC:
+                 case N_NSYMS:         /* Ultrix 4.0: symbol count */
+                 case N_DEFD:                  /* GNU Modula-2 */
+                 case N_ALIAS:         /* SunPro F77: alias name, ignore for now.  */
+
+                 case N_OBJ:                   /* useless types from Solaris */
+                 case N_OPT:
+                   /* These symbols aren't interesting; don't worry about them */
+
+                   continue;
+
+                 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 (type_code)); /*CUR_SYMBOL_TYPE*/
+                   continue;
+                 }
                if (stabstring
                    && stabstring != debug_info->ss + fh->issBase + sh.iss)
                  xfree (stabstring);