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]
Other format: [Raw text]

[rfa:symtab] Delete stabs live range splitting support


GCC never officially supported it, and its bloating each symbol by ~20%.

Tested on PPC NetBSD which is still using stabs.

ok?
Andrew
2003-11-04  Andrew Cagney  <cagney@redhat.com>

	* symtab.c (find_active_alias): Delete function.
	(lookup_block_symbol): Delete alias code.
	* stabsread.c (resolve_live_range): Delete function.
	(add_live_range): Delete function.
	(resolve_symbol_reference): Delete function.
	(define_symbol): Delete live range and alias code.
	(scan_file_globals): Delete alias code.
	* symtab.h (SYMBOL_RANGES): Delete macro.
	(struct range_list): Delete structure.
	(struct symbol): Delete field "ranges".
	(SYMBOL_ALIASES): Delete macro.
	(struct alias_list): Delete structure.
	(struct symbol): Delete field "aliases".

Index: stabsread.c
===================================================================
RCS file: /cvs/src/src/gdb/stabsread.c,v
retrieving revision 1.65
diff -u -r1.65 stabsread.c
--- stabsread.c	6 Oct 2003 19:27:12 -0000	1.65
+++ stabsread.c	4 Nov 2003 18:20:06 -0000
@@ -156,18 +156,10 @@
 
 static char *find_name_end (char *name);
 
-static void add_live_range (struct objfile *, struct symbol *, CORE_ADDR,
-			    CORE_ADDR);
-
-static int resolve_live_range (struct objfile *, struct symbol *, char *);
-
 static int process_reference (char **string);
 
 static CORE_ADDR ref_search_value (int refnum);
 
-static int resolve_symbol_reference (struct objfile *, struct symbol *,
-				     char *);
-
 void stabsread_clear_cache (void);
 
 static const char vptr_name[] = "_vptr$";
@@ -475,109 +467,6 @@
 #define VISIBILITY_PUBLIC	'2'	/* Stabs character for public field */
 #define VISIBILITY_IGNORE	'9'	/* Optimized out or zero length */
 
-/* This routine fixes up symbol references/aliases to point to the original
-   symbol definition.  Returns 0 on failure, non-zero on success.  */
-
-static int
-resolve_symbol_reference (struct objfile *objfile, struct symbol *sym, char *p)
-{
-  int refnum;
-  struct symbol *ref_sym = 0;
-  struct alias_list *alias;
-
-  /* If this is not a symbol reference return now.  */
-  if (*p != '#')
-    return 0;
-
-  /* Use "#<num>" as the name; we'll fix the name later.
-     We stored the original symbol name as "#<id>=<name>"
-     so we can now search for "#<id>" to resolving the reference.
-     We'll fix the names later by removing the "#<id>" or "#<id>=" */
-
-/*---------------------------------------------------------*/
-  /* Get the reference id number, and 
-     advance p past the names so we can parse the rest. 
-     eg: id=2 for p : "2=", "2=z:r(0,1)" "2:r(0,1);l(#5,#6),l(#7,#4)" */
-/*---------------------------------------------------------*/
-
-  /* This gets reference name from string.  sym may not have a name. */
-
-  /* Get the reference number associated with the reference id in the
-     gdb stab string.  From that reference number, get the main/primary
-     symbol for this alias.  */
-  refnum = process_reference (&p);
-  ref_sym = ref_search (refnum);
-  if (!ref_sym)
-    {
-      lrs_general_complaint ("symbol for reference not found");
-      return 0;
-    }
-
-  /* Parse the stab of the referencing symbol
-     now that we have the referenced symbol.
-     Add it as a new symbol and a link back to the referenced symbol.
-     eg: p : "=", "=z:r(0,1)" ":r(0,1);l(#5,#6),l(#7,#4)" */
-
-
-  /* If the stab symbol table and string contain:
-     RSYM   0      5      00000000 868    #15=z:r(0,1)
-     LBRAC  0      0      00000000 899    #5=
-     SLINE  0      16     00000003 923    #6=
-     Then the same symbols can be later referenced by:
-     RSYM   0      5      00000000 927    #15:r(0,1);l(#5,#6)
-     This is used in live range splitting to:
-     1) specify that a symbol (#15) is actually just a new storage 
-     class for a symbol (#15=z) which was previously defined.
-     2) specify that the beginning and ending ranges for a symbol 
-     (#15) are the values of the beginning (#5) and ending (#6) 
-     symbols. */
-
-  /* Read number as reference id.
-     eg: p : "=", "=z:r(0,1)" ":r(0,1);l(#5,#6),l(#7,#4)" */
-  /* FIXME! Might I want to use SYMBOL_CLASS (sym) = LOC_OPTIMIZED_OUT;
-     in case of "l(0,0)"? */
-
-/*--------------------------------------------------*/
-  /* Add this symbol to the reference list.           */
-/*--------------------------------------------------*/
-
-  alias = (struct alias_list *) obstack_alloc (&objfile->type_obstack,
-					       sizeof (struct alias_list));
-  if (!alias)
-    {
-      lrs_general_complaint ("Unable to allocate alias list memory");
-      return 0;
-    }
-
-  alias->next = 0;
-  alias->sym = sym;
-
-  if (!SYMBOL_ALIASES (ref_sym))
-    {
-      SYMBOL_ALIASES (ref_sym) = alias;
-    }
-  else
-    {
-      struct alias_list *temp;
-
-      /* Get to the end of the list.  */
-      for (temp = SYMBOL_ALIASES (ref_sym);
-	   temp->next;
-	   temp = temp->next)
-	;
-      temp->next = alias;
-    }
-
-  /* Want to fix up name so that other functions (eg. valops)
-     will correctly print the name.
-     Don't add_symbol_to_list so that lookup_symbol won't find it.
-     nope... needed for fixups. */
-  DEPRECATED_SYMBOL_NAME (sym) = DEPRECATED_SYMBOL_NAME (ref_sym);
-
-  /* Done!  */
-  return 1;
-}
-
 /* Structure for storing pointers to reference definitions for fast lookup 
    during "process_later". */
 
@@ -804,41 +693,6 @@
 	  goto normal;		/* Do *something* with it */
 	}
     }
-  else if (string[0] == '#')
-    {
-      /* Special GNU C extension for referencing symbols.  */
-      char *s;
-      int refnum, nlen;
-
-      /* If STRING defines a new reference id, then add it to the
-         reference map.  Else it must be referring to a previously
-         defined symbol, so add it to the alias list of the previously
-         defined symbol.  */
-      s = string;
-      refnum = symbol_reference_defined (&s);
-      if (refnum >= 0)
-	ref_add (refnum, sym, string, SYMBOL_VALUE (sym));
-      else if (!resolve_symbol_reference (objfile, sym, string))
-	return NULL;
-
-      /* S..P contains the name of the symbol.  We need to store
-         the correct name into DEPRECATED_SYMBOL_NAME.  */
-      nlen = p - s;
-      if (refnum >= 0)
-	{
-	  if (nlen > 0)
-	    SYMBOL_SET_NAMES (sym, s, nlen, objfile);
-	  else
-	    /* FIXME! Want DEPRECATED_SYMBOL_NAME (sym) = 0;
-	       Get error if leave name 0.  So give it something. */
-	    {
-	      nlen = p - string;
-	      SYMBOL_SET_NAMES (sym, string, nlen, objfile);
-	    }
-	}
-      /* Advance STRING beyond the reference id.  */
-      string = s;
-    }
   else
     {
     normal:
@@ -1521,136 +1375,9 @@
 	SYMBOL_CLASS (sym) = LOC_REF_ARG;
     }
 
-  /* Is there more to parse?  For example LRS/alias information?  */
-  while (*p && *p == ';')
-    {
-      p++;
-      if (*p && p[0] == 'l' && p[1] == '(')
-	{
-	  /* GNU extensions for live range splitting may be appended to 
-	     the end of the stab string.  eg. "l(#1,#2);l(#3,#5)" */
-
-	  /* Resolve the live range and add it to SYM's live range list.  */
-	  if (!resolve_live_range (objfile, sym, p))
-	    return NULL;
-
-	  /* Find end of live range info. */
-	  p = strchr (p, ')');
-	  if (!*p || *p != ')')
-	    {
-	      lrs_general_complaint ("live range format not recognized");
-	      return NULL;
-	    }
-	  p++;
-	}
-    }
   return sym;
 }
 
-/* Add the live range found in P to the symbol SYM in objfile OBJFILE.  Returns
-   non-zero on success, zero otherwise.  */
-
-static int
-resolve_live_range (struct objfile *objfile, struct symbol *sym, char *p)
-{
-  int refnum;
-  CORE_ADDR start, end;
-
-  /* Sanity check the beginning of the stabs string.  */
-  if (!*p || *p != 'l')
-    {
-      lrs_general_complaint ("live range string 1");
-      return 0;
-    }
-  p++;
-
-  if (!*p || *p != '(')
-    {
-      lrs_general_complaint ("live range string 2");
-      return 0;
-    }
-  p++;
-
-  /* Get starting value of range and advance P past the reference id.
-
-     ?!? In theory, the process_reference should never fail, but we should
-     catch that case just in case the compiler scrogged the stabs.  */
-  refnum = process_reference (&p);
-  start = ref_search_value (refnum);
-  if (!start)
-    {
-      lrs_general_complaint ("Live range symbol not found 1");
-      return 0;
-    }
-
-  if (!*p || *p != ',')
-    {
-      lrs_general_complaint ("live range string 3");
-      return 0;
-    }
-  p++;
-
-  /* Get ending value of range and advance P past the reference id.
-
-     ?!? In theory, the process_reference should never fail, but we should
-     catch that case just in case the compiler scrogged the stabs.  */
-  refnum = process_reference (&p);
-  end = ref_search_value (refnum);
-  if (!end)
-    {
-      lrs_general_complaint ("Live range symbol not found 2");
-      return 0;
-    }
-
-  if (!*p || *p != ')')
-    {
-      lrs_general_complaint ("live range string 4");
-      return 0;
-    }
-
-  /* Now that we know the bounds of the range, add it to the
-     symbol.  */
-  add_live_range (objfile, sym, start, end);
-
-  return 1;
-}
-
-/* Add a new live range defined by START and END to the symbol SYM
-   in objfile OBJFILE.  */
-
-static void
-add_live_range (struct objfile *objfile, struct symbol *sym, CORE_ADDR start,
-		CORE_ADDR end)
-{
-  struct range_list *r, *rs;
-
-  if (start >= end)
-    {
-      lrs_general_complaint ("end of live range follows start");
-      return;
-    }
-
-  /* Alloc new live range structure. */
-  r = (struct range_list *)
-    obstack_alloc (&objfile->type_obstack,
-		   sizeof (struct range_list));
-  r->start = start;
-  r->end = end;
-  r->next = 0;
-
-  /* Append this range to the symbol's range list. */
-  if (!SYMBOL_RANGES (sym))
-    SYMBOL_RANGES (sym) = r;
-  else
-    {
-      /* Get the last range for the symbol. */
-      for (rs = SYMBOL_RANGES (sym); rs->next; rs = rs->next)
-	;
-      rs->next = r;
-    }
-}
-
-
 /* Skip rest of this symbol and return an error type.
 
    General notes on error recovery:  error_type always skips to the
@@ -4510,7 +4237,7 @@
 {
   int hash;
   struct minimal_symbol *msymbol;
-  struct symbol *sym, *prev, *rsym;
+  struct symbol *sym, *prev;
   struct objfile *resolve_objfile;
 
   /* SVR4 based linkers copy referenced global symbols from shared
@@ -4564,9 +4291,6 @@
 	      if (DEPRECATED_SYMBOL_NAME (msymbol)[0] == DEPRECATED_SYMBOL_NAME (sym)[0] &&
 		  STREQ (DEPRECATED_SYMBOL_NAME (msymbol) + 1, DEPRECATED_SYMBOL_NAME (sym) + 1))
 		{
-
-		  struct alias_list *aliases;
-
 		  /* Splice this symbol out of the hash chain and
 		     assign the value we have to it. */
 		  if (prev)
@@ -4581,37 +4305,20 @@
 		  /* Check to see whether we need to fix up a common block.  */
 		  /* Note: this code might be executed several times for
 		     the same symbol if there are multiple references.  */
-
-		  /* If symbol has aliases, do minimal symbol fixups for each.
-		     These live aliases/references weren't added to 
-		     global_sym_chain hash but may also need to be fixed up. */
-		  /* FIXME: Maybe should have added aliases to the global chain,                     resolved symbol name, then treated aliases as normal 
-		     symbols?  Still, we wouldn't want to add_to_list. */
-		  /* Now do the same for each alias of this symbol */
-		  rsym = sym;
-		  aliases = SYMBOL_ALIASES (sym);
-		  while (rsym)
+		  if (sym)
 		    {
-		      if (SYMBOL_CLASS (rsym) == LOC_BLOCK)
+		      if (SYMBOL_CLASS (sym) == LOC_BLOCK)
 			{
-			  fix_common_block (rsym,
+			  fix_common_block (sym,
 					    SYMBOL_VALUE_ADDRESS (msymbol));
 			}
 		      else
 			{
-			  SYMBOL_VALUE_ADDRESS (rsym)
+			  SYMBOL_VALUE_ADDRESS (sym)
 			    = SYMBOL_VALUE_ADDRESS (msymbol);
 			}
-		      SYMBOL_SECTION (rsym) = SYMBOL_SECTION (msymbol);
-		      if (aliases)
-			{
-			  rsym = aliases->sym;
-			  aliases = aliases->next;
-			}
-		      else
-			rsym = NULL;
+		      SYMBOL_SECTION (sym) = SYMBOL_SECTION (msymbol);
 		    }
-
 
 		  if (prev)
 		    {
Index: symtab.c
===================================================================
RCS file: /cvs/src/src/gdb/symtab.c,v
retrieving revision 1.120
diff -u -r1.120 symtab.c
--- symtab.c	21 Oct 2003 22:56:38 -0000	1.120
+++ symtab.c	4 Nov 2003 18:20:07 -0000
@@ -114,8 +114,6 @@
 					  struct symtab **symtab);
 #endif
 
-static struct symbol *find_active_alias (struct symbol *sym, CORE_ADDR addr);
-
 /* This flag is used in hppa-tdep.c, and set in hp-symtab-read.c */
 /* Signals the presence of objects compiled by HP compilers */
 int hp_som_som_object_present = 0;
@@ -1668,29 +1666,6 @@
 	      && (linkage_name != NULL
 		  ? strcmp (SYMBOL_LINKAGE_NAME (sym), linkage_name) == 0 : 1))
 	    {
-	      /* If SYM has aliases, then use any alias that is active
-	         at the current PC.  If no alias is active at the current
-	         PC, then use the main symbol.
-
-	         ?!? Is checking the current pc correct?  Is this routine
-	         ever called to look up a symbol from another context?
-
-	         FIXME: No, it's not correct.  If someone sets a
-	         conditional breakpoint at an address, then the
-	         breakpoint's `struct expression' should refer to the
-	         `struct symbol' appropriate for the breakpoint's
-	         address, which may not be the PC.
-
-	         Even if it were never called from another context,
-	         it's totally bizarre for lookup_symbol's behavior to
-	         depend on the value of the inferior's current PC.  We
-	         should pass in the appropriate PC as well as the
-	         block.  The interface to lookup_symbol should change
-	         to require the caller to provide a PC.  */
-
-	      if (SYMBOL_ALIASES (sym))
-		sym = find_active_alias (sym, read_pc ());
-
 	      sym_found = sym;
 	      if (SYMBOL_CLASS (sym) != LOC_ARG &&
 		  SYMBOL_CLASS (sym) != LOC_LOCAL_ARG &&
@@ -1707,38 +1682,6 @@
       return (sym_found);	/* Will be NULL if not found. */
     }
 }
-
-/* Given a main symbol SYM and ADDR, search through the alias
-   list to determine if an alias is active at ADDR and return
-   the active alias.
-
-   If no alias is active, then return SYM.  */
-
-static struct symbol *
-find_active_alias (struct symbol *sym, CORE_ADDR addr)
-{
-  struct range_list *r;
-  struct alias_list *aliases;
-
-  /* If we have aliases, check them first.  */
-  aliases = SYMBOL_ALIASES (sym);
-
-  while (aliases)
-    {
-      if (!SYMBOL_RANGES (aliases->sym))
-	return aliases->sym;
-      for (r = SYMBOL_RANGES (aliases->sym); r; r = r->next)
-	{
-	  if (r->start <= addr && r->end > addr)
-	    return aliases->sym;
-	}
-      aliases = aliases->next;
-    }
-
-  /* Nothing found, return the main symbol.  */
-  return sym;
-}
-
 
 /* Find the symtab associated with PC and SECTION.  Look through the
    psymtabs and read in another symtab if necessary. */
Index: symtab.h
===================================================================
RCS file: /cvs/src/src/gdb/symtab.h,v
retrieving revision 1.81
diff -u -r1.81 symtab.h
--- symtab.h	21 Oct 2003 22:56:39 -0000	1.81
+++ symtab.h	4 Nov 2003 18:20:07 -0000
@@ -583,22 +583,6 @@
 			      struct axs_value * value);
 };
 
-/* Linked list of symbol's live ranges. */
-
-struct range_list
-{
-  CORE_ADDR start;
-  CORE_ADDR end;
-  struct range_list *next;
-};
-
-/* Linked list of aliases for a particular main/primary symbol.  */
-struct alias_list
-{
-  struct symbol *sym;
-  struct alias_list *next;
-};
-
 /* This structure is space critical.  See space comments at the top. */
 
 struct symbol
@@ -651,15 +635,6 @@
   }
   aux_value;
 
-
-  /* Link to a list of aliases for this symbol.
-     Only a "primary/main symbol may have aliases.  */
-  struct alias_list *aliases;
-
-  /* List of ranges where this symbol is active.  This is only
-     used by alias symbols at the current time.  */
-  struct range_list *ranges;
-
   struct symbol *hash_next;
 };
 
@@ -670,8 +645,6 @@
 #define SYMBOL_LINE(symbol)		(symbol)->line
 #define SYMBOL_BASEREG(symbol)		(symbol)->aux_value.basereg
 #define SYMBOL_OBJFILE(symbol)          (symbol)->aux_value.objfile
-#define SYMBOL_ALIASES(symbol)		(symbol)->aliases
-#define SYMBOL_RANGES(symbol)		(symbol)->ranges
 #define SYMBOL_LOCATION_BATON(symbol)   (symbol)->aux_value.loc.baton
 #define SYMBOL_LOCATION_FUNCS(symbol)   (symbol)->aux_value.loc.funcs
 

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