* breakpoint.c, breakpoint.h (breakpoint_init_inferior): New function
[deliverable/binutils-gdb.git] / gdb / stabsread.c
index 784708da274fe769bfac5dad319a1296533aab41..6a019d84d8fe7231eccb1b83709db6200902fb1c 100644 (file)
@@ -36,6 +36,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "complaints.h"
 #include "demangle.h"
 
+#include <ctype.h>
+
 /* Ask stabsread.h to define the vars it normally declares `extern'.  */
 #define        EXTERN  /**/
 #include "stabsread.h"         /* Our own declarations */
@@ -214,38 +216,6 @@ static int undef_types_length;
     if (**(pp) == '\\') *(pp) = next_symbol_text ();   \
   } while (0)
 
-\f
-/* This is used by other symbol readers besides stabs, so for cleanliness
-   should probably be in buildsym.c.  */
-
-int
-hashname (name)
-     char *name;
-{
-  register char *p = name;
-  register int total = p[0];
-  register int c;
-
-  c = p[1];
-  total += c << 2;
-  if (c)
-    {
-      c = p[2];
-      total += c << 4;
-      if (c)
-       {
-         total += p[3] << 6;
-       }
-    }
-
-  /* Ensure result is positive.  */
-  if (total < 0)
-    {
-      total += (1000 << 6);
-    }
-  return (total % HASHSIZE);
-}
-
 \f
 /* Look up a dbx type-number pair.  Return the address of the slot
    where the type for that number-pair is stored.
@@ -497,7 +467,7 @@ static char *type_synonym_name;
 /* ARGSUSED */
 struct symbol *
 define_symbol (valu, string, desc, type, objfile)
-     unsigned int valu;
+     CORE_ADDR valu;
      char *string;
      int desc;
      int type;
@@ -577,9 +547,11 @@ define_symbol (valu, string, desc, type, objfile)
       SYMBOL_LANGUAGE (sym) = current_subfile -> language;
       SYMBOL_NAME (sym)        = (char *)
        obstack_alloc (&objfile -> symbol_obstack, ((p - string) + 1));
-      /* Open-coded bcopy--saves function call time.  */
+      /* Open-coded memcpy--saves function call time.  */
       /* FIXME:  Does it really?  Try replacing with simple strcpy and
         try it on an executable with a large symbol table. */
+      /* FIXME: considering that gcc can open code memcpy anyway, I
+        doubt it.  xoxorich. */
       {
        register char *p1 = string;
        register char *p2 = SYMBOL_NAME (sym);
@@ -1035,25 +1007,27 @@ define_symbol (valu, string, desc, type, objfile)
 
       if (TYPE_NAME (SYMBOL_TYPE (sym)) == NULL)
        {
-         if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_PTR)
+         if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_PTR
+             || TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_FUNC)
            {
-             /* If we are giving a name to a type such as "pointer
-                to foo", we better not set the TYPE_NAME.  If the
-                program contains "typedef char *caddr_t;", we don't
-                want all variables of type char * to print as
-                caddr_t.  This is not just a consequence of GDB's
-                type management; PCC and GCC (at least through
-                version 2.4) both output variables of either type
-                char * or caddr_t with the type number defined in
-                the 't' symbol for caddr_t.  If a future compiler
-                cleans this up it GDB is not ready for it yet, but
-                if it becomes ready we somehow need to disable this
-                check (without breaking the PCC/GCC2.4 case).
+             /* If we are giving a name to a type such as "pointer to
+                foo" or "function returning foo", we better not set
+                the TYPE_NAME.  If the program contains "typedef char
+                *caddr_t;", we don't want all variables of type char
+                * to print as caddr_t.  This is not just a
+                consequence of GDB's type management; PCC and GCC (at
+                least through version 2.4) both output variables of
+                either type char * or caddr_t with the type number
+                defined in the 't' symbol for caddr_t.  If a future
+                compiler cleans this up it GDB is not ready for it
+                yet, but if it becomes ready we somehow need to
+                disable this check (without breaking the PCC/GCC2.4
+                case).
 
                 Sigh.
 
                 Fortunately, this check seems not to be necessary
-                for anything except pointers.  */
+                for anything except pointers or functions.  */
            }
          else
            TYPE_NAME (SYMBOL_TYPE (sym)) = SYMBOL_NAME (sym);
@@ -1084,14 +1058,9 @@ define_symbol (valu, string, desc, type, objfile)
       SYMBOL_CLASS (sym) = LOC_TYPEDEF;
       SYMBOL_VALUE (sym) = valu;
       SYMBOL_NAMESPACE (sym) = STRUCT_NAMESPACE;
-      if (TYPE_NAME (SYMBOL_TYPE (sym)) == 0)
-       TYPE_NAME (SYMBOL_TYPE (sym))
-         = obconcat (&objfile -> type_obstack, "",
-                     (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_ENUM
-                      ? "enum "
-                      : (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_STRUCT
-                         ? "struct " : "union ")),
-                     SYMBOL_NAME (sym));
+      if (TYPE_TAG_NAME (SYMBOL_TYPE (sym)) == 0)
+       TYPE_TAG_NAME (SYMBOL_TYPE (sym))
+         = obconcat (&objfile -> type_obstack, "", "", SYMBOL_NAME (sym));
       add_symbol_to_list (sym, &file_symbols);
 
       if (synonym)
@@ -1103,6 +1072,9 @@ define_symbol (valu, string, desc, type, objfile)
          SYMBOL_CLASS (typedef_sym) = LOC_TYPEDEF;
          SYMBOL_VALUE (typedef_sym) = valu;
          SYMBOL_NAMESPACE (typedef_sym) = VAR_NAMESPACE;
+         if (TYPE_NAME (SYMBOL_TYPE (sym)) == 0)
+           TYPE_NAME (SYMBOL_TYPE (sym))
+             = obconcat (&objfile -> type_obstack, "", "", SYMBOL_NAME (sym));
          add_symbol_to_list (typedef_sym, &file_symbols);
        }
       break;
@@ -1239,6 +1211,10 @@ read_type (pp, objfile)
   int xtypenums[2];
   char type_descriptor;
 
+  /* Size in bits of type if specified by a type attribute, or -1 if
+     there is no size attribute.  */
+  int type_size = -1;
+
   /* Read type number if present.  The type number may be omitted.
      for instance in a two-dimensional array declared with type
      "ar1;1;10;ar1;1;10;4".  */
@@ -1267,7 +1243,10 @@ read_type (pp, objfile)
            break;
          else
            {
-             /* Type attributes; skip to the semicolon.  */
+             /* Type attributes.  */
+             char *attr = p;
+
+             /* Skip to the semicolon.  */
              while (*p != ';' && *p != '\0')
                ++p;
              *pp = p;
@@ -1276,6 +1255,19 @@ read_type (pp, objfile)
              else
                /* Skip the semicolon.  */
                ++*pp;
+
+             switch (*attr)
+               {
+               case 's':
+                 type_size = atoi (attr + 1);
+                 if (type_size <= 0)
+                   type_size = -1;
+                 break;
+               default:
+                 /* Ignore unrecognized type attributes, so future compilers
+                    can invent new ones.  */
+                 break;
+               }
            }
        }
       /* Skip the type descriptor, we get it below with (*pp)[-1].  */
@@ -1303,11 +1295,7 @@ read_type (pp, objfile)
        /* Name including "struct", etc.  */
        char *type_name;
        
-       /* Name without "struct", etc.  */
-       char *type_name_only;
-
        {
-         char *prefix;
          char *from, *to;
          
          /* Set the type code according to the following letter.  */
@@ -1315,15 +1303,12 @@ read_type (pp, objfile)
            {
            case 's':
              code = TYPE_CODE_STRUCT;
-             prefix = "struct ";
              break;
            case 'u':
              code = TYPE_CODE_UNION;
-             prefix = "union ";
              break;
            case 'e':
              code = TYPE_CODE_ENUM;
-             prefix = "enum ";
              break;
            default:
              return error_type (pp);
@@ -1331,17 +1316,8 @@ read_type (pp, objfile)
          
          to = type_name = (char *)
            obstack_alloc (&objfile -> type_obstack,
-                          (strlen (prefix) +
-                           ((char *) strchr (*pp, ':') - (*pp)) + 1));
+                          (((char *) strchr (*pp, ':') - (*pp)) + 1));
        
-         /* Copy the prefix.  */
-         from = prefix;
-         while ((*to++ = *from++) != '\0')
-           ;
-         to--; 
-       
-         type_name_only = to;
-
          /* Copy the name.  */
          from = *pp + 1;
          while ((*to++ = *from++) != ':')
@@ -1350,23 +1326,6 @@ read_type (pp, objfile)
          
          /* Set the pointer ahead of the name which we just read.  */
          *pp = from;
-       
-#if 0
-         /* The following hack is clearly wrong, because it doesn't
-            check whether we are in a baseclass.  I tried to reproduce
-            the case that it is trying to fix, but I couldn't get
-            g++ to put out a cross reference to a basetype.  Perhaps
-            it doesn't do it anymore.  */
-         /* Note: for C++, the cross reference may be to a base type which
-            has not yet been seen.  In this case, we skip to the comma,
-            which will mark the end of the base class name.  (The ':'
-            at the end of the base class name will be skipped as well.)
-            But sometimes (ie. when the cross ref is the last thing on
-            the line) there will be no ','.  */
-         from = (char *) strchr (*pp, ',');
-         if (from)
-           *pp = from;
-#endif /* 0 */
        }
 
        /* Now check to see whether the type has already been declared.  */
@@ -1384,7 +1343,7 @@ read_type (pp, objfile)
              if (SYMBOL_CLASS (sym) == LOC_TYPEDEF
                  && SYMBOL_NAMESPACE (sym) == STRUCT_NAMESPACE
                  && (TYPE_CODE (SYMBOL_TYPE (sym)) == code)
-                 && STREQ (SYMBOL_NAME (sym), type_name_only))
+                 && STREQ (SYMBOL_NAME (sym), type_name))
                {
                  obstack_free (&objfile -> type_obstack, type_name);
                  type = SYMBOL_TYPE (sym);
@@ -1399,7 +1358,7 @@ read_type (pp, objfile)
           type.  */
        type = dbx_alloc_type (typenums, objfile);
        TYPE_CODE (type) = code;
-       TYPE_NAME (type) = type_name;
+       TYPE_TAG_NAME (type) = type_name;
        INIT_CPLUS_SPECIFIC(type);
        TYPE_FLAGS (type) |= TYPE_FLAG_STUB;
 
@@ -1420,27 +1379,40 @@ read_type (pp, objfile)
     case '9':
     case '(':
 
-      /* The type is being defined to another type.  When we support
-        Ada (and arguably for C, so "whatis foo" can give "size_t",
-        "wchar_t", or whatever it was declared as) we'll need to
-        allocate a distinct type here rather than returning the
-        existing one.  GCC is currently (deliberately) incapable of
-        putting out the debugging information to do that, however.  */
-
       (*pp)--;
       if (read_type_number (pp, xtypenums) != 0)
        return error_type (pp);
+
       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
-       type = *dbx_lookup_type (xtypenums);
+       {
+         struct type *xtype = *dbx_lookup_type (xtypenums);
+
+         /* This can happen if we had '-' followed by a garbage character,
+            for example.  */
+         if (xtype == NULL)
+           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;
-      /* This can happen if we had '-' followed by a garbage character,
-        for example.  */
-      if (type == NULL)
-       return error_type (pp);
       break;
 
     /* In the following types, we must be sure to overwrite any existing
@@ -1591,6 +1563,10 @@ read_type (pp, objfile)
       return error_type (pp);
     }
 
+  /* Size specified in a type attribute overrides any other size.  */
+  if (type_size != -1)
+    TYPE_LENGTH (type) = type_size / TARGET_CHAR_BIT;
+
   return type;
 }
 \f
@@ -1605,7 +1581,7 @@ rs6000_builtin_type (typenum)
 #define NUMBER_RECOGNIZED 30
   /* This includes an empty slot for type number -0.  */
   static struct type *negative_types[NUMBER_RECOGNIZED + 1];
-  struct type *rettype;
+  struct type *rettype = NULL;
 
   if (typenum >= 0 || typenum < -NUMBER_RECOGNIZED)
     {
@@ -1685,8 +1661,7 @@ rs6000_builtin_type (typenum)
       rettype = init_type (TYPE_CODE_INT, 4, 0, "integer", NULL);
       break;
     case 16:
-      /* What is the proper size of this type?  */
-      rettype = init_type (TYPE_CODE_BOOL, 1, 0, "boolean", NULL);
+      rettype = init_type (TYPE_CODE_BOOL, 4, 0, "boolean", NULL);
       break;
     case 17:
       rettype = init_type (TYPE_CODE_FLT, 4, 0, "short real", NULL);
@@ -1702,19 +1677,19 @@ rs6000_builtin_type (typenum)
                           "character", NULL);
       break;
     case 21:
-      rettype = init_type (TYPE_CODE_INT, 1, TYPE_FLAG_UNSIGNED,
+      rettype = init_type (TYPE_CODE_BOOL, 1, TYPE_FLAG_UNSIGNED,
                           "logical*1", NULL);
       break;
     case 22:
-      rettype = init_type (TYPE_CODE_INT, 2, TYPE_FLAG_UNSIGNED,
+      rettype = init_type (TYPE_CODE_BOOL, 2, TYPE_FLAG_UNSIGNED,
                           "logical*2", NULL);
       break;
     case 23:
-      rettype = init_type (TYPE_CODE_INT, 4, TYPE_FLAG_UNSIGNED,
+      rettype = init_type (TYPE_CODE_BOOL, 4, TYPE_FLAG_UNSIGNED,
                           "logical*4", NULL);
       break;
     case 24:
-      rettype = init_type (TYPE_CODE_INT, 4, TYPE_FLAG_UNSIGNED,
+      rettype = init_type (TYPE_CODE_BOOL, 4, TYPE_FLAG_UNSIGNED,
                           "logical", NULL);
       break;
     case 25:
@@ -2063,7 +2038,6 @@ read_cpp_abbrev (fip, pp, type, objfile)
      struct objfile *objfile;
 {
   register char *p;
-  const char *prefix;
   char *name;
   char cpp_abbrev;
   struct type *context;
@@ -3170,7 +3144,7 @@ read_huge_number (pp, end, bits)
        {
          if (bits != NULL)
            *bits = -1;
-         return;
+         return 0;
        }
     }
   else
@@ -3185,7 +3159,7 @@ read_huge_number (pp, end, bits)
             count how many bits are in them).  */
          if (bits != NULL)
            *bits = -1;
-         return;
+         return 0;
        }
       
       /* -0x7f is the same as 0x80.  So deal with it by adding one to
@@ -3245,7 +3219,7 @@ read_range_type (pp, typenums, objfile)
       char got_signed = 0;
       char got_unsigned = 0;
       /* Number of bits in the type.  */
-      int nbits;
+      int nbits = 0;
 
       /* Range from 0 to <large number> is an unsigned large integral type.  */
       if ((n2bits == 0 && n2 == 0) && n3bits != 0)
@@ -3254,8 +3228,12 @@ read_range_type (pp, typenums, objfile)
          nbits = n3bits;
        }
       /* Range from <large number> to <large number>-1 is a large signed
-        integral type.  */
-      else if (n2bits != 0 && n3bits != 0 && n2bits == n3bits + 1)
+        integral type.  Take care of the case where <large number> doesn't
+        fit in a long but <large number>-1 does.  */
+      else if ((n2bits != 0 && n3bits != 0 && n2bits == n3bits + 1)
+              || (n2bits != 0 && n3bits == 0
+                  && (n2bits == sizeof (long) * HOST_CHAR_BIT)
+                  && n3 == LONG_MAX))
        {
          got_signed = 1;
          nbits = n2bits;
@@ -3284,9 +3262,7 @@ read_range_type (pp, typenums, objfile)
      GDB does not have complex types.
 
      Just return the complex as a float of that size.  It won't work right
-     for the complex values, but at least it makes the file loadable.
-
-     FIXME, we may be able to distinguish these by their names. FIXME.  */
+     for the complex values, but at least it makes the file loadable.  */
 
   if (n3 == 0 && n2 > 0)
     {
@@ -3481,7 +3457,7 @@ cleanup_undefined_types ()
                struct pending *ppt;
                int i;
                /* Name of the type, without "struct" or "union" */
-               char *typename = type_name_no_tag (*type);
+               char *typename = TYPE_TAG_NAME (*type);
 
                if (typename == NULL)
                  {
This page took 0.028189 seconds and 4 git commands to generate.