Modified Files:
[binutils-gdb.git] / gdb / stabsread.c
index 75d53a92de96a0fbeacd4402b506a11d9a2439fa..8e7aec405bd04c2ae139f3e3edb36ba7153cba86 100644 (file)
@@ -1,5 +1,5 @@
 /* Support routines for decoding "stabs" debugging information format.
-   Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993
+   Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994
              Free Software Foundation, Inc.
 
 This file is part of GDB.
@@ -25,6 +25,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
    Avoid placing any object file format specific code in this file. */
 
 #include "defs.h"
+#include <string.h>
 #include "bfd.h"
 #include "obstack.h"
 #include "symtab.h"
@@ -194,10 +195,39 @@ static int undef_types_length;
 /* Check for and handle cretinous stabs symbol name continuation!  */
 #define STABS_CONTINUE(pp)                             \
   do {                                                 \
-    if (**(pp) == '\\') *(pp) = next_symbol_text ();   \
+    if (**(pp) == '\\' || (**(pp) == '?' && (*(pp))[1] == '\0')) \
+      *(pp) = next_symbol_text ();     \
   } while (0)
-
 \f
+/* FIXME: These probably should be our own types (like rs6000_builtin_type
+   has its own types) rather than builtin_type_*.  */
+static struct type **os9k_type_vector[] = {
+       0,
+       &builtin_type_int,
+       &builtin_type_char,
+       &builtin_type_long,
+       &builtin_type_short,
+       &builtin_type_unsigned_char,
+       &builtin_type_unsigned_short,
+       &builtin_type_unsigned_long,
+       &builtin_type_unsigned_int,
+       &builtin_type_float,
+       &builtin_type_double,
+       &builtin_type_void,
+       &builtin_type_long_double
+};
+
+static void os9k_init_type_vector PARAMS ((struct type **));
+
+static void
+os9k_init_type_vector(tv)
+    struct type **tv;
+{
+  int i;
+  for (i=0; i<sizeof(os9k_type_vector)/sizeof(struct type **); i++)
+    tv[i] = (os9k_type_vector[i] == 0 ? 0 : *(os9k_type_vector[i]));
+}
+
 /* Look up a dbx type-number pair.  Return the address of the slot
    where the type for that number-pair is stored.
    The number-pair is in TYPENUMS.
@@ -263,6 +293,10 @@ Invalid symbol data: type number (%d,%d) out of range at symtab pos %d.",
                      (type_vector_length * sizeof (struct type *)));
          memset (&type_vector[old_len], 0,
                  (type_vector_length - old_len) * sizeof (struct type *));
+
+         if (os9k_stabs)
+           /* Deal with OS9000 fundamental types.  */
+           os9k_init_type_vector (type_vector);
        }
       return (&type_vector[index]);
     }
@@ -771,6 +805,7 @@ define_symbol (valu, string, desc, type, objfile)
       /* This case is faked by a conditional above,
         when there is no code letter in the dbx data.
         Dbx data never actually contains 'l'.  */
+    case 's':
     case 'l':
       SYMBOL_TYPE (sym) = read_type (&p, objfile);
       SYMBOL_CLASS (sym) = LOC_LOCAL;
@@ -1098,7 +1133,10 @@ define_symbol (valu, string, desc, type, objfile)
       SYMBOL_CLASS (sym) = LOC_STATIC;
       SYMBOL_VALUE_ADDRESS (sym) = valu;
       SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
-      add_symbol_to_list (sym, &local_symbols);
+      if (os9k_stabs)
+       add_symbol_to_list (sym, &global_symbols);
+      else
+       add_symbol_to_list (sym, &local_symbols);
       break;
 
     case 'v':
@@ -1190,7 +1228,7 @@ error_type (pp)
        }
 
       /* Check for and handle cretinous dbx symbol name continuation!  */
-      if ((*pp)[-1] == '\\')
+      if ((*pp)[-1] == '\\' || (*pp)[-1] == '?')
        {
          *pp = next_symbol_text ();
        }
@@ -1418,41 +1456,49 @@ read_type (pp, objfile)
     case '9':
     case '(':
 
-      (*pp)--;
-      if (read_type_number (pp, xtypenums) != 0)
-       return error_type (pp);
+      {
+       char *pp_saved;
 
-      if (typenums[0] == xtypenums[0] && typenums[1] == xtypenums[1])
-       /* It's being defined as itself.  That means it is "void".  */
-       type = init_type (TYPE_CODE_VOID, 0, 0, NULL, objfile);
-      else
-       {
-         struct type *xtype = *dbx_lookup_type (xtypenums);
+       (*pp)--;
+       pp_saved = *pp;
 
-         /* This can happen if we had '-' followed by a garbage character,
-            for example.  */
-         if (xtype == NULL)
-           return error_type (pp);
+       /* Peek ahead at the number to detect void.  */
+       if (read_type_number (pp, xtypenums) != 0)
+         return error_type (pp);
 
-         /* The type is being defined to another type.  So we copy the type.
-            This loses if we copy a C++ class and so we lose track of how
-            the names are mangled (but g++ doesn't output stabs like this
-            now anyway).  */
-
-         type = alloc_type (objfile);
-         memcpy (type, xtype, sizeof (struct type));
-
-         /* The idea behind clearing the names is that the only purpose
-            for defining a type to another type is so that the name of
-            one can be different.  So we probably don't need to worry much
-            about the case where the compiler doesn't give a name to the
-            new type.  */
-         TYPE_NAME (type) = NULL;
-         TYPE_TAG_NAME (type) = NULL;
-       }
-      if (typenums[0] != -1)
-       *dbx_lookup_type (typenums) = type;
-      break;
+       if (typenums[0] == xtypenums[0] && typenums[1] == xtypenums[1])
+         /* It's being defined as itself.  That means it is "void".  */
+         type = init_type (TYPE_CODE_VOID, 0, 0, NULL, objfile);
+       else
+         {
+           struct type *xtype;
+
+           /* Go back to the number and have read_type get it.  This means
+              that we can deal with something like t(1,2)=(3,4)=... which
+              the Lucid compiler uses.  */
+           *pp = pp_saved;
+           xtype = read_type (pp, objfile);
+
+           /* The type is being defined to another type.  So we copy the type.
+              This loses if we copy a C++ class and so we lose track of how
+              the names are mangled (but g++ doesn't output stabs like this
+              now anyway).  */
+
+           type = alloc_type (objfile);
+           memcpy (type, xtype, sizeof (struct type));
+
+           /* The idea behind clearing the names is that the only purpose
+              for defining a type to another type is so that the name of
+              one can be different.  So we probably don't need to worry much
+              about the case where the compiler doesn't give a name to the
+              new type.  */
+           TYPE_NAME (type) = NULL;
+           TYPE_TAG_NAME (type) = NULL;
+         }
+       if (typenums[0] != -1)
+         *dbx_lookup_type (typenums) = type;
+       break;
+      }
 
     /* In the following types, we must be sure to overwrite any existing
        type that the typenums refer to, rather than allocating a new one
@@ -1472,16 +1518,36 @@ read_type (pp, objfile)
       break;
 
     case 'f':                          /* Function returning another type */
+      if (os9k_stabs && **pp == '(')
+       {
+         /* Function prototype; skip it.
+            We must conditionalize this on os9k_stabs because otherwise
+            it could be confused with a Sun-style (1,3) typenumber
+            (I think).  */
+         while (**pp != ')')
+           ++*pp;
+         ++*pp;
+       }
       type1 = read_type (pp, objfile);
       type = make_function_type (type1, dbx_lookup_type (typenums));
       break;
 
-    case 'k':                          /* Const qualifier on some type (Sun) */
+    case 'k':                     /* Const qualifier on some type (Sun) */
+    case 'c':                     /* Const qualifier on some type (OS9000) */
+      /* Because 'c' means other things to AIX and 'k' is perfectly good,
+        only accept 'c' in the os9k_stabs case.  */
+      if (type_descriptor == 'c' && !os9k_stabs)
+       return error_type (pp);
       type = read_type (pp, objfile);
       /* FIXME! For now, we ignore const and volatile qualifiers.  */
       break;
 
-    case 'B':                          /* Volatile qual on some type (Sun) */
+    case 'B':                       /* Volatile qual on some type (Sun) */
+    case 'i':                       /* Volatile qual on some type (OS9000) */
+      /* Because 'i' means other things to AIX and 'B' is perfectly good,
+        only accept 'i' in the os9k_stabs case.  */
+      if (type_descriptor == 'i' && !os9k_stabs)
+       return error_type (pp);
       type = read_type (pp, objfile);
       /* FIXME! For now, we ignore const and volatile qualifiers.  */
       break;
@@ -1542,10 +1608,17 @@ read_type (pp, objfile)
        *dbx_lookup_type (typenums) = type;
       break;
 
-    case 'b':                          /* Sun ACC builtin int type */
-      type = read_sun_builtin_type (pp, typenums, objfile);
-      if (typenums[0] != -1)
-       *dbx_lookup_type (typenums) = type;
+    case 'b':
+      if (os9k_stabs)
+       /* Const and volatile qualified type.  */
+       type = read_type (pp, objfile);
+      else
+       {
+         /* Sun ACC builtin int type */
+         type = read_sun_builtin_type (pp, typenums, objfile);
+         if (typenums[0] != -1)
+           *dbx_lookup_type (typenums) = type;
+       }
       break;
 
     case 'R':                          /* Sun ACC builtin float type */
@@ -2815,24 +2888,29 @@ read_array_type (pp, type, objfile)
   int nbits;
 
   /* Format of an array type:
-     "ar<index type>;lower;upper;<array_contents_type>".  Put code in
-     to handle this.
+     "ar<index type>;lower;upper;<array_contents_type>".
+     OS9000: "arlower,upper;<array_contents_type>".
 
      Fortran adjustable arrays use Adigits or Tdigits for lower or upper;
      for these, produce a type like float[][].  */
 
-  index_type = read_type (pp, objfile);
-  if (**pp != ';')
-    /* Improper format of array type decl.  */
-    return error_type (pp);
-  ++*pp;
+  if (os9k_stabs)
+    index_type = builtin_type_int;
+  else
+    {
+      index_type = read_type (pp, objfile);
+      if (**pp != ';')
+       /* Improper format of array type decl.  */
+       return error_type (pp);
+      ++*pp;
+    }
 
   if (!(**pp >= '0' && **pp <= '9') && **pp != '-')
     {
       (*pp)++;
       adjustable = 1;
     }
-  lower = read_huge_number (pp, ';', &nbits);
+  lower = read_huge_number (pp, os9k_stabs ? ',' : ';', &nbits);
   if (nbits != 0)
     return error_type (pp);
 
@@ -2892,6 +2970,7 @@ read_enum_type (pp, type, objfile)
   struct pending **symlist;
   struct pending *osyms, *syms;
   int o_nsyms;
+  int nbits;
 
 #if 0
   /* FIXME!  The stabs produced by Sun CC merrily define things that ought
@@ -2905,12 +2984,21 @@ read_enum_type (pp, type, objfile)
   osyms = *symlist;
   o_nsyms = osyms ? osyms->nsyms : 0;
 
+  if (os9k_stabs)
+    {
+      /* Size.  Perhaps this does not have to be conditionalized on
+        os9k_stabs (assuming the name of an enum constant can't start
+        with a digit).  */
+      read_huge_number (pp, 0, &nbits);
+      if (nbits != 0)
+       return error_type (pp);
+    }
+
   /* Read the value-names and their values.
      The input syntax is NAME:VALUE,NAME:VALUE, and so on.
      A semicolon or comma instead of a NAME means the end.  */
   while (**pp && **pp != ';' && **pp != ',')
     {
-      int nbits;
       STABS_CONTINUE (pp);
       p = *pp;
       while (*p != ':') p++;
@@ -2937,7 +3025,7 @@ read_enum_type (pp, type, objfile)
 
   /* Now fill in the fields of the type-structure.  */
 
-  TYPE_LENGTH (type) = sizeof (int);
+  TYPE_LENGTH (type) = TARGET_INT_BIT / HOST_CHAR_BIT;
   TYPE_CODE (type) = TYPE_CODE_ENUM;
   TYPE_FLAGS (type) &= ~TYPE_FLAG_STUB;
   TYPE_NFIELDS (type) = nsyms;
@@ -2971,17 +3059,6 @@ read_enum_type (pp, type, objfile)
        break;
     }
 
-#if 0
-  /* This screws up perfectly good C programs with enums.  FIXME.  */
-  /* Is this Modula-2's BOOLEAN type?  Flag it as such if so. */
-  if(TYPE_NFIELDS(type) == 2 &&
-     ((STREQ(TYPE_FIELD_NAME(type,0),"TRUE") &&
-       STREQ(TYPE_FIELD_NAME(type,1),"FALSE")) ||
-      (STREQ(TYPE_FIELD_NAME(type,1),"TRUE") &&
-       STREQ(TYPE_FIELD_NAME(type,0),"FALSE"))))
-     TYPE_CODE(type) = TYPE_CODE_BOOL;
-#endif
-
   return type;
 }
 
@@ -3045,6 +3122,14 @@ read_sun_builtin_type (pp, typenums, objfile)
   type_bits = read_huge_number (pp, 0, &nbits);
   if (nbits != 0)
     return error_type (pp);
+  /* The type *should* end with a semicolon.  If it are embedded
+     in a larger type the semicolon may be the only way to know where
+     the type ends.  If this type is at the end of the stabstring we
+     can deal with the omitted semicolon (but we don't have to like
+     it).  Don't bother to complain(), Sun's compiler omits the semicolon
+     for "void".  */
+  if (**pp == ';')
+    ++(*pp);
 
   return init_type (type_bits == 0 ? TYPE_CODE_VOID : TYPE_CODE_INT,
                    type_bits / TARGET_CHAR_BIT,
@@ -3759,6 +3844,8 @@ void start_stabs ()
 
   /* FIXME: If common_block_name is not already NULL, we should complain().  */
   common_block_name = NULL;
+
+  os9k_stabs = 0;
 }
 
 /* Call after end_symtab() */