* stabsread.h, stabsread.c, dbxread.c (common_block*, copy_pending):
authorJim Kingdon <jkingdon@engr.sgi.com>
Tue, 12 Oct 1993 20:02:11 +0000 (20:02 +0000)
committerJim Kingdon <jkingdon@engr.sgi.com>
Tue, 12 Oct 1993 20:02:11 +0000 (20:02 +0000)
Move common block handling from dbxread.c to stabsread.c.
Use the name from the BCOMM instead of the ECOMM.
Allocate things on the symbol_obstack.
* xcoffread.c (process_xcoff_symbol): Process C_BCOMM, C_ECOMM,
and C_ECOML.  On unrecognized storage classes, go ahead and call
define_symbol (after the complaint).

* dbxread.c (process_one_symbol): Don't relocate 'S' symbols by
the text offset.

gdb/ChangeLog
gdb/stabsread.c
gdb/stabsread.h
gdb/xcoffread.c

index 09e957f..82a446e 100644 (file)
@@ -1,3 +1,16 @@
+Tue Oct 12 08:59:15 1993  Jim Kingdon  (kingdon@lioth.cygnus.com)
+
+       * stabsread.h, stabsread.c, dbxread.c (common_block*, copy_pending):
+       Move common block handling from dbxread.c to stabsread.c.
+       Use the name from the BCOMM instead of the ECOMM.
+       Allocate things on the symbol_obstack.
+       * xcoffread.c (process_xcoff_symbol): Process C_BCOMM, C_ECOMM,
+       and C_ECOML.  On unrecognized storage classes, go ahead and call
+       define_symbol (after the complaint).
+
+       * dbxread.c (process_one_symbol): Don't relocate 'S' symbols by
+       the text offset.
+
 Tue Oct 12 12:33:09 1993  Peter Schauer  (pes@regent.e-technik.tu-muenchen.de)
 
        * osfsolib.c (solib_create_inferior_hook):  Reset stop_soon_quietly
index 5731e69..667f519 100644 (file)
@@ -3388,6 +3388,103 @@ read_args (pp, end, objfile)
   memcpy (rval, types, n * sizeof (struct type *));
   return rval;
 }
+\f
+/* Common block handling.  */
+
+/* List of symbols declared since the last BCOMM.  This list is a tail
+   of local_symbols.  When ECOMM is seen, the symbols on the list
+   are noted so their proper addresses can be filled in later,
+   using the common block base address gotten from the assembler
+   stabs.  */
+
+static struct pending *common_block;
+static int common_block_i;
+
+/* Name of the current common block.  We get it from the BCOMM instead of the
+   ECOMM to match IBM documentation (even though IBM puts the name both places
+   like everyone else).  */
+static char *common_block_name;
+
+/* Process a N_BCOMM symbol.  The storage for NAME is not guaranteed
+   to remain after this function returns.  */
+
+void
+common_block_start (name, objfile)
+     char *name;
+     struct objfile *objfile;
+{
+  if (common_block_name != NULL)
+    {
+      static struct complaint msg = {
+       "Invalid symbol data: common block within common block",
+       0, 0};
+      complain (&msg);
+    }
+  common_block = local_symbols;
+  common_block_i = local_symbols ? local_symbols->nsyms : 0;
+  common_block_name = obsavestring (name, strlen (name),
+                                   &objfile -> symbol_obstack);
+}
+
+/* Process a N_ECOMM symbol.  */
+
+void
+common_block_end (objfile)
+     struct objfile *objfile;
+{
+  /* Symbols declared since the BCOMM are to have the common block
+     start address added in when we know it.  common_block and
+     common_block_i point to the first symbol after the BCOMM in
+     the local_symbols list; copy the list and hang it off the
+     symbol for the common block name for later fixup.  */
+  int i;
+  struct symbol *sym;
+  struct pending *new = 0;
+  struct pending *next;
+  int j;
+
+  if (common_block_name == NULL)
+    {
+      static struct complaint msg = {"ECOMM symbol unmatched by BCOMM", 0, 0};
+      complain (&msg);
+      return;
+    }
+
+  sym = (struct symbol *) 
+    obstack_alloc (&objfile -> symbol_obstack, sizeof (struct symbol));
+  memset (sym, 0, sizeof (struct symbol));
+  SYMBOL_NAME (sym) = common_block_name;
+  SYMBOL_CLASS (sym) = LOC_BLOCK;
+
+  /* Now we copy all the symbols which have been defined since the BCOMM.  */
+
+  /* Copy all the struct pendings before common_block.  */
+  for (next = local_symbols;
+       next != NULL && next != common_block;
+       next = next->next)
+    {
+      for (j = 0; j < next->nsyms; j++)
+       add_symbol_to_list (next->symbol[j], &new);
+    }
+
+  /* Copy however much of COMMON_BLOCK we need.  If COMMON_BLOCK is
+     NULL, it means copy all the local symbols (which we already did
+     above).  */
+
+  if (common_block != NULL)
+    for (j = common_block_i; j < common_block->nsyms; j++)
+      add_symbol_to_list (common_block->symbol[j], &new);
+
+  SYMBOL_NAMESPACE (sym) = (enum namespace)((long) new);
+
+  /* Should we be putting local_symbols back to what it was?
+     Does it matter?  */
+
+  i = hashname (SYMBOL_NAME (sym));
+  SYMBOL_VALUE_CHAIN (sym) = global_sym_chain[i];
+  global_sym_chain[i] = sym;
+  common_block_name = NULL;
+}
 
 /* Add a common block's start address to the offset of each symbol
    declared to be in it (by being between a BCOMM/ECOMM pair that uses
@@ -3624,6 +3721,9 @@ void start_stabs ()
   n_this_object_header_files = 1;
   type_vector_length = 0;
   type_vector = (struct type **) 0;
+
+  /* FIXME: If common_block_name is not already NULL, we should complain().  */
+  common_block_name = NULL;
 }
 
 /* Call after end_symtab() */
index 67cefc2..3b890d8 100644 (file)
@@ -44,6 +44,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 EXTERN struct symbol *global_sym_chain[HASHSIZE];
 
+extern void common_block_start PARAMS ((char *, struct objfile *));
+extern void common_block_end PARAMS ((struct objfile *));
+
 /* Kludge for xcoffread.c */
 
 struct pending_stabs
@@ -55,15 +58,6 @@ struct pending_stabs
 
 EXTERN struct pending_stabs *global_stabs;
 
-/* List of symbols declared since the last BCOMM.  This list is a tail
-   of local_symbols.  When ECOMM is seen, the symbols on the list
-   are noted so their proper addresses can be filled in later,
-   using the common block base address gotten from the assembler
-   stabs.  */
-
-EXTERN struct pending *common_block;
-EXTERN int common_block_i;
-
 /* The type code that process_one_symbol saw on its previous invocation.
    Used to detect pairs of N_SO symbols. */
 
index c6a138a..3ecdf18 100644 (file)
@@ -1598,19 +1598,26 @@ process_xcoff_symbol (cs, objfile)
       break;
 #endif
 
-    case C_DECL:                       /* a type decleration?? */
-
-      sym = define_symbol (cs->c_value, cs->c_name, 0, 0, objfile);
-      if (sym != NULL)
-       SYMBOL_SECTION (sym) = cs->c_secnum;
-      return sym;
-
     case C_GSYM:
       add_stab_to_list (name, &global_stabs);
       break;
 
+    case C_BCOMM:
+      common_block_start (cs->c_name, objfile);
+      break;
+
+    case C_ECOMM:
+      common_block_end (objfile);
+      break;
+
+    default:
+      complain (&storclass_complaint, cs->c_sclass);
+      /* FALLTHROUGH */
+
+    case C_DECL:
     case C_PSYM:
     case C_RPSYM:
+    case C_ECOML:
 
       sym = define_symbol (cs->c_value, cs->c_name, 0, 0, objfile);
       if (sym != NULL)
@@ -1624,7 +1631,7 @@ process_xcoff_symbol (cs, objfile)
        /* If we are going to use Sun dbx's define_symbol(), we need to
           massage our stab string a little. Change 'V' type to 'S' to be
           comparible with Sun. */
-        /* FIXME: I believe this is to avoid a Sun-specific hack somewhere.
+        /* FIXME: Is this to avoid a Sun-specific hack somewhere?
           Needs more investigation.  */
 
        if (*name == ':' || (pp = (char *) strchr(name, ':')) == NULL)
@@ -1694,10 +1701,6 @@ process_xcoff_symbol (cs, objfile)
          complain (&rsym_complaint, name);
          return NULL;
        }
-
-    default    :
-      complain (&storclass_complaint, cs->c_sclass);
-      return NULL;
     }
   }
   return sym2;