use remote-utils facilities for baud_rate
[deliverable/binutils-gdb.git] / gdb / stabsread.c
index bd02dd65d7b86326e9beeedd637d56197ad120d8..ed820bbe287fb14f9ed62de30d4bdb99231e8206 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 */
@@ -142,6 +144,11 @@ static const char vb_name[] =   { '_','v','b',CPLUS_MARKER,'\0' };
 #define BELIEVE_PCC_PROMOTION 0
 #endif
 
+#if 0
+/* I think this can go away, all current uses have been removed.
+   GCC emits a few crazy types which can only be distinguished by the
+   name (complex, long long on some machines), but I'd say fix GCC.  */
+
 /* During some calls to read_type (and thus to read_range_type), this
    contains the name of the type being defined.  Range types are only
    used in C as basic types.  We use the name to distinguish the otherwise
@@ -149,6 +156,7 @@ static const char vb_name[] =   { '_','v','b',CPLUS_MARKER,'\0' };
    FIXME, this should disappear with better type management.  */
 
 static char *long_kludge_name;
+#endif
 
 #if 0
 struct complaint dbx_class_complaint =
@@ -208,35 +216,6 @@ static int undef_types_length;
     if (**(pp) == '\\') *(pp) = next_symbol_text ();   \
   } while (0)
 
-\f
-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.
@@ -568,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);
@@ -607,14 +588,15 @@ define_symbol (valu, string, desc, type, objfile)
   else
     deftype = *p++;
 
-  /* c is a special case, not followed by a type-number.
-     SYMBOL:c=iVALUE for an integer constant symbol.
-     SYMBOL:c=rVALUE for a floating constant symbol.
-     SYMBOL:c=eTYPE,INTVALUE for an enum constant symbol.
-        e.g. "b:c=e6,0" for "const b = blob1"
-       (where type 6 is defined by "blobs:t6=eblob1:0,blob2:1,;").  */
-  if (deftype == 'c')
+  switch (deftype)
     {
+    case 'c':
+      /* c is a special case, not followed by a type-number.
+        SYMBOL:c=iVALUE for an integer constant symbol.
+        SYMBOL:c=rVALUE for a floating constant symbol.
+        SYMBOL:c=eTYPE,INTVALUE for an enum constant symbol.
+        e.g. "b:c=e6,0" for "const b = blob1"
+        (where type 6 is defined by "blobs:t6=eblob1:0,blob2:1,;").  */
       if (*p != '=')
        {
          SYMBOL_CLASS (sym) = LOC_CONST;
@@ -715,52 +697,10 @@ define_symbol (valu, string, desc, type, objfile)
       SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
       add_symbol_to_list (sym, &file_symbols);
       return sym;
-    }
-
-  /* Now usually comes a number that says which data type,
-     and possibly more stuff to define the type
-     (all of which is handled by read_type)  */
-
-  if (deftype == 'p' && *p == 'F')
-    /* pF is a two-letter code that means a function parameter in Fortran.
-       The type-number specifies the type of the return value.
-       Translate it into a pointer-to-function type.  */
-    {
-      p++;
-      SYMBOL_TYPE (sym)
-       = lookup_pointer_type (lookup_function_type (read_type (&p, objfile)));
-    }
-  else
-    {
-      /* The symbol class letter is followed by a type (typically the
-        type of the symbol, or its return-type, or etc).  Read it.  */
 
-      synonym = *p == 't';
-
-      if (synonym)
-       {
-         p++;
-         type_synonym_name = obsavestring (SYMBOL_NAME (sym),
-                                           strlen (SYMBOL_NAME (sym)),
-                                           &objfile -> symbol_obstack);
-       }
-
-      /* Here we save the name of the symbol for read_range_type, which
-        ends up reading in the basic types.  In stabs, unfortunately there
-        is no distinction between "int" and "long" types except their
-        names.  Until we work out a saner type policy (eliminating most
-        builtin types and using the names specified in the files), we
-        save away the name so that far away from here in read_range_type,
-        we can examine it to decide between "int" and "long".  FIXME.  */
-      long_kludge_name = SYMBOL_NAME (sym);
-
-      SYMBOL_TYPE (sym) = read_type (&p, objfile);
-    }
-
-  switch (deftype)
-    {
     case 'C':
       /* The name of a caught exception.  */
+      SYMBOL_TYPE (sym) = read_type (&p, objfile);
       SYMBOL_CLASS (sym) = LOC_LABEL;
       SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
       SYMBOL_VALUE_ADDRESS (sym) = valu;
@@ -769,6 +709,7 @@ define_symbol (valu, string, desc, type, objfile)
 
     case 'f':
       /* A static function definition.  */
+      SYMBOL_TYPE (sym) = read_type (&p, objfile);
       SYMBOL_CLASS (sym) = LOC_BLOCK;
       SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
       add_symbol_to_list (sym, &file_symbols);
@@ -811,6 +752,7 @@ define_symbol (valu, string, desc, type, objfile)
 
     case 'F':
       /* A global function definition.  */
+      SYMBOL_TYPE (sym) = read_type (&p, objfile);
       SYMBOL_CLASS (sym) = LOC_BLOCK;
       SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
       add_symbol_to_list (sym, &global_symbols);
@@ -821,6 +763,7 @@ define_symbol (valu, string, desc, type, objfile)
         value is not correct.  It is necessary to search for the
         corresponding linker definition to find the value.
         These definitions appear at the end of the namelist.  */
+      SYMBOL_TYPE (sym) = read_type (&p, objfile);
       i = hashname (SYMBOL_NAME (sym));
       SYMBOL_VALUE_CHAIN (sym) = global_sym_chain[i];
       global_sym_chain[i] = sym;
@@ -833,6 +776,7 @@ define_symbol (valu, string, desc, type, objfile)
         when there is no code letter in the dbx data.
         Dbx data never actually contains 'l'.  */
     case 'l':
+      SYMBOL_TYPE (sym) = read_type (&p, objfile);
       SYMBOL_CLASS (sym) = LOC_LOCAL;
       SYMBOL_VALUE (sym) = valu;
       SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
@@ -840,11 +784,25 @@ define_symbol (valu, string, desc, type, objfile)
       break;
 
     case 'p':
+      if (*p == 'F')
+       /* pF is a two-letter code that means a function parameter in Fortran.
+          The type-number specifies the type of the return value.
+          Translate it into a pointer-to-function type.  */
+       {
+         p++;
+         SYMBOL_TYPE (sym)
+           = lookup_pointer_type
+             (lookup_function_type (read_type (&p, objfile)));
+       }
+      else
+       SYMBOL_TYPE (sym) = read_type (&p, objfile);
+
       /* Normally this is a parameter, a LOC_ARG.  On the i960, it
         can also be a LOC_LOCAL_ARG depending on symbol type.  */
 #ifndef DBX_PARM_SYMBOL_CLASS
 #define        DBX_PARM_SYMBOL_CLASS(type)     LOC_ARG
 #endif
+
       SYMBOL_CLASS (sym) = DBX_PARM_SYMBOL_CLASS (type);
       SYMBOL_VALUE (sym) = valu;
       SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
@@ -940,11 +898,15 @@ define_symbol (valu, string, desc, type, objfile)
          are referenced by this file.  gdb is not prepared to deal
          with this extra information.  FIXME, it ought to.  */
       if (type == N_FUN)
-       goto process_prototype_types;
+       {
+         read_type (&p, objfile);
+         goto process_prototype_types;
+       }
       /*FALLTHROUGH*/
 
     case 'R':
       /* Parameter which is in a register.  */
+      SYMBOL_TYPE (sym) = read_type (&p, objfile);
       SYMBOL_CLASS (sym) = LOC_REGPARM;
       SYMBOL_VALUE (sym) = STAB_REG_TO_REGNUM (valu);
       if (SYMBOL_VALUE (sym) >= NUM_REGS)
@@ -958,6 +920,7 @@ define_symbol (valu, string, desc, type, objfile)
 
     case 'r':
       /* Register variable (either global or local).  */
+      SYMBOL_TYPE (sym) = read_type (&p, objfile);
       SYMBOL_CLASS (sym) = LOC_REGISTER;
       SYMBOL_VALUE (sym) = STAB_REG_TO_REGNUM (valu);
       if (SYMBOL_VALUE (sym) >= NUM_REGS)
@@ -998,6 +961,7 @@ define_symbol (valu, string, desc, type, objfile)
 
     case 'S':
       /* Static symbol at top level of file */
+      SYMBOL_TYPE (sym) = read_type (&p, objfile);
       SYMBOL_CLASS (sym) = LOC_STATIC;
       SYMBOL_VALUE_ADDRESS (sym) = valu;
       SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
@@ -1005,6 +969,19 @@ define_symbol (valu, string, desc, type, objfile)
       break;
 
     case 't':
+#if 0
+      /* See comment where long_kludge_name is declared.  */
+      /* Here we save the name of the symbol for read_range_type, which
+        ends up reading in the basic types.  In stabs, unfortunately there
+        is no distinction between "int" and "long" types except their
+        names.  Until we work out a saner type policy (eliminating most
+        builtin types and using the names specified in the files), we
+        save away the name so that far away from here in read_range_type,
+        we can examine it to decide between "int" and "long".  FIXME.  */
+      long_kludge_name = SYMBOL_NAME (sym);
+#endif
+      SYMBOL_TYPE (sym) = read_type (&p, objfile);
+
       /* For a nameless type, we don't want a create a symbol, thus we
         did not use `sym'. Return without further processing. */
       if (nameless) return NULL;
@@ -1013,28 +990,67 @@ define_symbol (valu, string, desc, type, objfile)
       SYMBOL_VALUE (sym) = valu;
       SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
       /* C++ vagaries: we may have a type which is derived from
-       a base type which did not have its name defined when the
-       derived class was output.  We fill in the derived class's
-       base part member's name here in that case.  */
+        a base type which did not have its name defined when the
+        derived class was output.  We fill in the derived class's
+        base part member's name here in that case.  */
       if (TYPE_NAME (SYMBOL_TYPE (sym)) != NULL)
-        if ((TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_STRUCT
-                || TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_UNION)
-               && TYPE_N_BASECLASSES (SYMBOL_TYPE (sym)))
-        {
-          int j;
-          for (j = TYPE_N_BASECLASSES (SYMBOL_TYPE (sym)) - 1; j >= 0; j--)
-            if (TYPE_BASECLASS_NAME (SYMBOL_TYPE (sym), j) == 0)
-              TYPE_BASECLASS_NAME (SYMBOL_TYPE (sym), j) =
-                type_name_no_tag (TYPE_BASECLASS (SYMBOL_TYPE (sym), j));
-        }
+       if ((TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_STRUCT
+            || TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_UNION)
+           && TYPE_N_BASECLASSES (SYMBOL_TYPE (sym)))
+         {
+           int j;
+           for (j = TYPE_N_BASECLASSES (SYMBOL_TYPE (sym)) - 1; j >= 0; j--)
+             if (TYPE_BASECLASS_NAME (SYMBOL_TYPE (sym), j) == 0)
+               TYPE_BASECLASS_NAME (SYMBOL_TYPE (sym), j) =
+                 type_name_no_tag (TYPE_BASECLASS (SYMBOL_TYPE (sym), j));
+         }
 
       if (TYPE_NAME (SYMBOL_TYPE (sym)) == NULL)
-       TYPE_NAME (SYMBOL_TYPE (sym)) = SYMBOL_NAME (sym);
+       {
+         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" 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 or functions.  */
+           }
+         else
+           TYPE_NAME (SYMBOL_TYPE (sym)) = SYMBOL_NAME (sym);
+       }
 
       add_symbol_to_list (sym, &file_symbols);
       break;
 
     case 'T':
+      /* Struct, union, or enum tag.  For GNU C++, this can be be followed
+        by 't' which means we are typedef'ing it as well.  */
+      synonym = *p == 't';
+
+      if (synonym)
+       {
+         p++;
+         type_synonym_name = obsavestring (SYMBOL_NAME (sym),
+                                           strlen (SYMBOL_NAME (sym)),
+                                           &objfile -> symbol_obstack);
+       }
+
+      SYMBOL_TYPE (sym) = read_type (&p, objfile);
+
       /* For a nameless type, we don't want a create a symbol, thus we
         did not use `sym'. Return without further processing. */
       if (nameless) return NULL;
@@ -1042,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)
@@ -1061,12 +1072,16 @@ 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;
 
     case 'V':
       /* Static symbol of local scope */
+      SYMBOL_TYPE (sym) = read_type (&p, objfile);
       SYMBOL_CLASS (sym) = LOC_STATIC;
       SYMBOL_VALUE_ADDRESS (sym) = valu;
       SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
@@ -1075,6 +1090,7 @@ define_symbol (valu, string, desc, type, objfile)
 
     case 'v':
       /* Reference parameter */
+      SYMBOL_TYPE (sym) = read_type (&p, objfile);
       SYMBOL_CLASS (sym) = LOC_REF_ARG;
       SYMBOL_VALUE (sym) = valu;
       SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
@@ -1086,6 +1102,7 @@ define_symbol (valu, string, desc, type, objfile)
         Sun claims ("dbx and dbxtool interfaces", 2nd ed)
         that Pascal uses it too, but when I tried it Pascal used
         "x:3" (local symbol) instead.  */
+      SYMBOL_TYPE (sym) = read_type (&p, objfile);
       SYMBOL_CLASS (sym) = LOC_LOCAL;
       SYMBOL_VALUE (sym) = valu;
       SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
@@ -1093,9 +1110,9 @@ define_symbol (valu, string, desc, type, objfile)
       break;
 
     default:
+      SYMBOL_TYPE (sym) = error_type (&p);
       SYMBOL_CLASS (sym) = LOC_CONST;
       SYMBOL_VALUE (sym) = 0;
-      SYMBOL_TYPE (sym) = error_type (&p);
       SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
       add_symbol_to_list (sym, &file_symbols);
       break;
@@ -1177,13 +1194,11 @@ error_type (pp)
 }
 
 \f
-/* Read a dbx type reference or definition;
-   return the type that is meant.
-   This can be just a number, in which case it references
-   a type already defined and placed in type_vector.
-   Or the number can be followed by an =, in which case
-   it means to define a new type according to the text that
-   follows the =.  */
+/* Read type information or a type definition; return the type.  Even
+   though this routine accepts either type information or a type
+   definition, the distinction is relevant--some parts of stabsread.c
+   assume that type information starts with a digit, '-', or '(' in
+   deciding whether to call read_type.  */
 
 struct type *
 read_type (pp, objfile)
@@ -1212,22 +1227,31 @@ read_type (pp, objfile)
        return dbx_alloc_type (typenums, objfile);
 
       /* Type is being defined here.  */
-#if 0 /* Callers aren't prepared for a NULL result!  FIXME -- metin!  */
-      {
-       struct type *tt;
-
-       /* if such a type already exists, this is an unnecessary duplication
-          of the stab string, which is common in (RS/6000) xlc generated
-          objects.  In that case, simply return NULL and let the caller take
-          care of it. */
-
-       tt = *dbx_lookup_type (typenums);
-       if (tt && tt->length && tt->code)
-         return NULL;
-      }
-#endif
+      /* Skip the '='.  */
+      ++(*pp);
 
-      *pp += 2;
+      while (**pp == '@')
+       {
+         char *p = *pp + 1;
+         /* It might be a type attribute or a member type.  */
+         if (isdigit (*p) || *p ==  '(' || *p == '-')
+           /* Member type.  */
+           break;
+         else
+           {
+             /* Type attributes; skip to the semicolon.  */
+             while (*p != ';' && *p != '\0')
+               ++p;
+             *pp = p;
+             if (*p == '\0')
+               return error_type (pp);
+             else
+               /* Skip the semicolon.  */
+               ++*pp;
+           }
+       }
+      /* Skip the type descriptor, we get it below with (*pp)[-1].  */
+      ++(*pp);
     }
   else
     {
@@ -1251,11 +1275,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.  */
@@ -1263,15 +1283,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);
@@ -1279,17 +1296,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++) != ':')
@@ -1298,23 +1306,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.  */
@@ -1332,7 +1323,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);
@@ -1347,7 +1338,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;
 
@@ -1553,7 +1544,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)
     {
@@ -1633,8 +1624,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);
@@ -1650,19 +1640,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:
@@ -2011,7 +2001,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;
@@ -2082,14 +2071,13 @@ read_cpp_abbrev (fip, pp, type, objfile)
       fip->list->field.bitsize = 0;
       fip->list->visibility = VISIBILITY_PRIVATE;
     }
-  else if (*p == '_')
-    {
-      /* GNU C++ anonymous type.  */
-      complain (&stabs_general_complaint, "g++ anonymous type $_ not handled");
-    }
   else
     {
       complain (&invalid_cpp_abbrev_complaint, *pp);
+      /* We have no idea what syntax an unrecognized abbrev would have, so
+        better return 0.  If we returned 1, we would need to at least advance
+        *pp to avoid an infinite loop.  */
+      return 0;
     }
   return 1;
 }
@@ -2289,7 +2277,11 @@ read_struct_fields (fip, pp, type, objfile)
 
       /* Get the field name.  */
       p = *pp;
-      if (*p == CPLUS_MARKER)
+      /* If is starts with CPLUS_MARKER it is a special abbreviation, unless
+        the CPLUS_MARKER is followed by an underscore, in which case it is
+        just the name of an anonymous type, which we should handle like any
+        other type name.  */
+      if (*p == CPLUS_MARKER && p[1] != '_')
        {
          if (!read_cpp_abbrev (fip, pp, type, objfile))
            return 0;
@@ -3079,7 +3071,7 @@ read_huge_number (pp, end, bits)
     }
 
   upper_limit = LONG_MAX / radix;
-  while ((c = *p++) >= '0' && c <= ('0' + radix))
+  while ((c = *p++) >= '0' && c < ('0' + radix))
     {
       if (n <= upper_limit)
        {
@@ -3115,7 +3107,7 @@ read_huge_number (pp, end, bits)
        {
          if (bits != NULL)
            *bits = -1;
-         return;
+         return 0;
        }
     }
   else
@@ -3130,7 +3122,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
@@ -3190,7 +3182,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)
@@ -3426,7 +3418,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.032693 seconds and 4 git commands to generate.