This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

[PATCH] mdebugread.c: remove use of partial-stab.h



This is removing the second occurrence of the infimous
#include "partial-stab.h" from gdb.

This time the file is mdebugread.c.  Including the code directly
allowed to get rid of code that was ifdeffed DBXREAD_ONLY.  Almost all
of all the SOFUN_ADDRESS_MAYBE_MISSING instances were under
DBXREAD_ONLY as well, except 2. So those are left for a second pass.
I am not yet sure we can get rid of them.  I also suspect that the
giant switch can be further simplified a bit.

Next step is to get rid of the last include "partial-stab.h" which is
in dbxread.c.

As usual I'll wait a day or so before I commit this, in case somebody
wants to take a look at it.

Jim (Blandy), I would be extremely grateful if you could wait until
this in in before going ahead with another patch for the address sets.


I tested this on Irix 6.3.

Elena

2001-10-25  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.

Index: Makefile.in
===================================================================
RCS file: /cvs/src/src/gdb/Makefile.in,v
retrieving revision 1.121
diff -u -p -r1.121 Makefile.in
--- Makefile.in	2001/10/21 19:20:29	1.121
+++ Makefile.in	2001/10/25 18:43:20
@@ -1698,7 +1698,7 @@ mcore-rom.o: mcore-rom.c $(defs_h) $(gdb
 
 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) $(objfiles_h) $(stabsread_h) \
 	$(symfile_h) $(symtab_h) $(gdb_string_h)
 
 mipsm3-nat.o: mipsm3-nat.c $(defs_h) $(inferior_h) $(regcache_h)
Index: mdebugread.c
===================================================================
RCS file: /cvs/src/src/gdb/mdebugread.c,v
retrieving revision 1.17
diff -u -p -r1.17 mdebugread.c
--- mdebugread.c	2001/10/24 17:10:18	1.17
+++ mdebugread.c	2001/10/25 18:43:26
@@ -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 *o
 		    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);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]