* configure.in: Make --without-x work.
[deliverable/binutils-gdb.git] / binutils / stabs.c
index 53e1070c8bcdd7beb09c313a70a7816c5c670e42..087358289261e202cb7993096d707f7dbeaa13e2 100644 (file)
@@ -1,5 +1,6 @@
 /* stabs.c -- Parse stabs debugging information
-   Copyright (C) 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
+   Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001
+   Free Software Foundation, Inc.
    Written by Ian Lance Taylor <ian@cygnus.com>.
 
    This file is part of GNU Binutils.
    trying to identify the correct address for anything.  */
 
 #include <stdio.h>
-#include <ctype.h>
 
 #include "bfd.h"
 #include "bucomm.h"
 #include "libiberty.h"
+#include "safe-ctype.h"
 #include "demangle.h"
 #include "debug.h"
 #include "budbg.h"
+#include "filenames.h"
 
 /* Meaningless definition needs by aout64.h.  FIXME.  */
 #define BYTES_IN_WORD 4
 #include "aout/aout64.h"
 #include "aout/stab_gnu.h"
 
-#ifndef DIR_SEPARATOR
-#ifdef _WIN32
-#define DIR_SEPARATOR '\\'
-#else
-#define DIR_SEPARATOR '/'
-#endif
-#endif
-
 /* The number of predefined XCOFF types.  */
 
 #define XCOFF_TYPE_COUNT 34
@@ -313,11 +307,11 @@ parse_number (pp, poverflow)
          int d;
 
          d = *p++;
-         if (isdigit ((unsigned char) d))
+         if (ISDIGIT (d))
            d -= '0';
-         else if (isupper ((unsigned char) d))
+         else if (ISUPPER (d))
            d -= 'A';
-         else if (islower ((unsigned char) d))
+         else if (ISLOWER (d))
            d -= 'a';
          else
            break;
@@ -372,7 +366,6 @@ warn_stab (p, err)
 
 /* Create a handle to parse stabs symbols with.  */
 
-/*ARGSUSED*/
 PTR
 start_stab (dhandle, abfd, sections, syms, symcount)
      PTR dhandle ATTRIBUTE_UNUSED;
@@ -568,12 +561,7 @@ parse_stab (dhandle, handle, type, desc, value, string)
 
          f = info->so_string;
 
-         if (   (string[0] == '/')
-             || (string[0] == DIR_SEPARATOR)
-             || (   (DIR_SEPARATOR == '\\')
-                 && (string[1] == ':')
-                 && (   (string[2] == DIR_SEPARATOR)
-                     || (string[2] == '/'))))
+         if (IS_ABSOLUTE_PATH (string))
            info->so_string = xstrdup (string);
          else
            info->so_string = concat (info->so_string, string,
@@ -706,6 +694,7 @@ parse_stab (dhandle, handle, type, desc, value, string)
     case N_OBJ:
     case N_ENDM:
     case N_MAIN:
+    case N_WARNING:
       break;
     }
 
@@ -791,7 +780,7 @@ parse_stab_string (dhandle, info, stabtype, desc, value, string)
     }
 
   ++p;
-  if (isdigit ((unsigned char) *p) || *p == '(' || *p == '-')
+  if (ISDIGIT (*p) || *p == '(' || *p == '-')
     type = 'l';
   else
     type = *p++;
@@ -1195,7 +1184,7 @@ parse_stab_type (dhandle, info, typename, pp, slotp)
   /* 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".  */
-  if (! isdigit ((unsigned char) **pp) && **pp != '(' && **pp != '-')
+  if (! ISDIGIT (**pp) && **pp != '(' && **pp != '-')
     {
       /* 'typenums=' not present, type is anonymous.  Read and return
         the definition, but don't put it in the type vector.  */
@@ -1238,7 +1227,7 @@ parse_stab_type (dhandle, info, typename, pp, slotp)
          const char *p = *pp + 1;
          const char *attr;
 
-         if (isdigit ((unsigned char) *p) || *p == '(' || *p == '-')
+         if (ISDIGIT (*p) || *p == '(' || *p == '-')
            {
              /* Member type.  */
              break;
@@ -1261,6 +1250,7 @@ parse_stab_type (dhandle, info, typename, pp, slotp)
            {
            case 's':
              size = atoi (attr + 1);
+             size /= 8;  /* Size is in bits.  We store it in bytes.  */
              if (size <= 0)
                size = -1;
              break;
@@ -1639,7 +1629,7 @@ parse_stab_type (dhandle, info, typename, pp, slotp)
   if (size != -1)
     {
       if (! debug_record_type_size (dhandle, dtype, (unsigned int) size))
-       return false;
+       return DEBUG_TYPE_NULL;
     }
 
   return dtype;
@@ -1821,7 +1811,7 @@ parse_stab_range_type (dhandle, info, typename, pp, typenums)
          else if (n3 == (bfd_signed_vma) 0xffffffff)
            return debug_make_int_type (dhandle, 4, true);
 #ifdef BFD64
-         else if (n3 == ((((bfd_vma) 0xffffffff) << 32) | 0xffffffff))
+         else if (n3 == ((((bfd_signed_vma) 0xffffffff) << 32) | 0xffffffff))
            return debug_make_int_type (dhandle, 8, true);
 #endif
        }
@@ -1921,7 +1911,7 @@ parse_stab_sun_builtin_type (dhandle, pp)
     }
   ++*pp;
 
-  /* The second number is always 0, so ignore it too. */
+  /* The second number is always 0, so ignore it too.  */
   (void) parse_number (pp, (boolean *) NULL);
   if (**pp != ';')
     {
@@ -1930,7 +1920,7 @@ parse_stab_sun_builtin_type (dhandle, pp)
     }
   ++*pp;
 
-  /* The third number is the number of bits for this type. */
+  /* The third number is the number of bits for this type.  */
   bits = parse_number (pp, (boolean *) NULL);
 
   /* The type *should* end with a semicolon.  If it are embedded
@@ -1983,7 +1973,7 @@ parse_stab_sun_floating_type (dhandle, pp)
       || details == NF_COMPLEX32)
     return debug_make_complex_type (dhandle, bytes);
 
-  return debug_make_float_type (dhandle, bytes);      
+  return debug_make_float_type (dhandle, bytes);
 }
 
 /* Handle an enum type.  */
@@ -2317,7 +2307,7 @@ parse_stab_struct_fields (dhandle, info, pp, retp, staticsp)
       /* Look for the ':' that separates the field name from the field
         values.  Data members are delimited by a single ':', while member
         functions are delimited by a pair of ':'s.  When we hit the member
-        functions (if any), terminate scan loop and return. */
+        functions (if any), terminate scan loop and return.  */
 
       p = strchr (p, ':');
       if (p == NULL)
@@ -2768,27 +2758,27 @@ parse_stab_members (dhandle, info, tagname, pp, typenums, retp)
                  /* Figure out from whence this virtual function
                     came.  It may belong to virtual function table of
                     one of its baseclasses.  */
-                   look_ahead_type = parse_stab_type (dhandle, info,
-                                                      (const char *) NULL,
-                                                      pp,
-                                                      (debug_type **) NULL);
-                   if (**pp == ':')
-                     {
-                       /* g++ version 1 overloaded methods.  */
-                       context = DEBUG_TYPE_NULL;
-                     }
-                   else
-                     {
-                       context = look_ahead_type;
-                       look_ahead_type = DEBUG_TYPE_NULL;
-                       if (**pp != ';')
-                         {
-                           bad_stab (orig);
-                           return false;
-                         }
-                       ++*pp;
-                     }
-                 }
+                 look_ahead_type = parse_stab_type (dhandle, info,
+                                                    (const char *) NULL,
+                                                    pp,
+                                                    (debug_type **) NULL);
+                 if (**pp == ':')
+                   {
+                     /* g++ version 1 overloaded methods.  */
+                     context = DEBUG_TYPE_NULL;
+                   }
+                 else
+                   {
+                     context = look_ahead_type;
+                     look_ahead_type = DEBUG_TYPE_NULL;
+                     if (**pp != ';')
+                       {
+                         bad_stab (orig);
+                         return false;
+                       }
+                     ++*pp;
+                   }
+               }
              break;
 
            case '?':
@@ -2922,7 +2912,7 @@ parse_stab_argtypes (dhandle, info, class_type, fieldname, tagname,
   /* Constructors are sometimes handled specially.  */
   is_full_physname_constructor = ((argtypes[0] == '_'
                                   && argtypes[1] == '_'
-                                  && (isdigit ((unsigned char) argtypes[2])
+                                  && (ISDIGIT (argtypes[2])
                                       || argtypes[2] == 'Q'
                                       || argtypes[2] == 't'))
                                  || strncmp (argtypes, "__ct", 4) == 0);
@@ -3044,7 +3034,7 @@ parse_stab_tilde_field (dhandle, info, pp, typenums, retvptrbase, retownvptr)
 
   orig = *pp;
 
-  /* If we are positioned at a ';', then skip it. */
+  /* If we are positioned at a ';', then skip it.  */
   if (**pp == ';')
     ++*pp;
 
@@ -3056,7 +3046,7 @@ parse_stab_tilde_field (dhandle, info, pp, typenums, retvptrbase, retownvptr)
   if (**pp == '=' || **pp == '+' || **pp == '-')
     {
       /* Obsolete flags that used to indicate the presence of
-        constructors and/or destructors. */
+        constructors and/or destructors.  */
       ++*pp;
     }
 
@@ -3097,7 +3087,7 @@ parse_stab_tilde_field (dhandle, info, pp, typenums, retvptrbase, retownvptr)
       *pp = p + 1;
     }
 
-  return true;    
+  return true;
 }
 
 /* Read a definition of an array type.  */
@@ -3131,7 +3121,7 @@ parse_stab_array_type (dhandle, info, pp, stringp)
   /* If the index type is type 0, we take it as int.  */
   p = *pp;
   if (! parse_stab_type_number (&p, typenums))
-    return false;
+    return DEBUG_TYPE_NULL;
   if (typenums[0] == 0 && typenums[1] == 0 && **pp != '=')
     {
       index_type = debug_find_named_type (dhandle, "int");
@@ -3139,7 +3129,7 @@ parse_stab_array_type (dhandle, info, pp, stringp)
        {
          index_type = debug_make_int_type (dhandle, 4, false);
          if (index_type == DEBUG_TYPE_NULL)
-           return false;
+           return DEBUG_TYPE_NULL;
        }
       *pp = p;
     }
@@ -3158,7 +3148,7 @@ parse_stab_array_type (dhandle, info, pp, stringp)
 
   adjustable = false;
 
-  if (! isdigit ((unsigned char) **pp) && **pp != '-')
+  if (! ISDIGIT (**pp) && **pp != '-')
     {
       ++*pp;
       adjustable = true;
@@ -3168,11 +3158,11 @@ parse_stab_array_type (dhandle, info, pp, stringp)
   if (**pp != ';')
     {
       bad_stab (orig);
-      return false;
+      return DEBUG_TYPE_NULL;
     }
   ++*pp;
 
-  if (! isdigit ((unsigned char) **pp) && **pp != '-')
+  if (! ISDIGIT (**pp) && **pp != '-')
     {
       ++*pp;
       adjustable = true;
@@ -3182,14 +3172,14 @@ parse_stab_array_type (dhandle, info, pp, stringp)
   if (**pp != ';')
     {
       bad_stab (orig);
-      return false;
+      return DEBUG_TYPE_NULL;
     }
   ++*pp;
 
   element_type = parse_stab_type (dhandle, info, (const char *) NULL, pp,
                                  (debug_type **) NULL);
   if (element_type == DEBUG_TYPE_NULL)
-    return false;
+    return DEBUG_TYPE_NULL;
 
   if (adjustable)
     {
@@ -3781,7 +3771,7 @@ stab_demangle_count (pp)
   unsigned int count;
 
   count = 0;
-  while (isdigit ((unsigned char) **pp))
+  while (ISDIGIT (**pp))
     {
       count *= 10;
       count += **pp - '0';
@@ -3798,12 +3788,12 @@ stab_demangle_get_count (pp, pi)
      const char **pp;
      unsigned int *pi;
 {
-  if (! isdigit ((unsigned char) **pp))
+  if (! ISDIGIT (**pp))
     return false;
 
   *pi = **pp - '0';
   ++*pp;
-  if (isdigit ((unsigned char) **pp))
+  if (ISDIGIT (**pp))
     {
       unsigned int count;
       const char *p;
@@ -3816,7 +3806,7 @@ stab_demangle_get_count (pp, pi)
          count += *p - '0';
          ++p;
        }
-      while (isdigit ((unsigned char) *p));
+      while (ISDIGIT (*p));
       if (*p == '_')
        {
          *pp = p + 1;
@@ -3911,7 +3901,7 @@ stab_demangle_prefix (minfo, pp)
     scan += i - 2;
 
   if (scan == *pp
-      && (isdigit ((unsigned char) scan[2])
+      && (ISDIGIT (scan[2])
          || scan[2] == 'Q'
          || scan[2] == 't'))
     {
@@ -3920,7 +3910,7 @@ stab_demangle_prefix (minfo, pp)
       return true;
     }
   else if (scan == *pp
-          && ! isdigit ((unsigned char) scan[2])
+          && ! ISDIGIT (scan[2])
           && scan[2] != 't')
     {
       /* Look for the `__' that separates the prefix from the
@@ -4135,13 +4125,13 @@ stab_demangle_qualified (minfo, pp, ptype)
         preceded by an underscore (to distinguish it from the <= 9
         case) and followed by an underscore.  */
       p = *pp + 2;
-      if (! isdigit ((unsigned char) *p) || *p == '0')
+      if (! ISDIGIT (*p) || *p == '0')
        {
          stab_bad_demangle (orig);
          return false;
        }
       qualifiers = atoi (p);
-      while (isdigit ((unsigned char) *p))
+      while (ISDIGIT (*p))
        ++p;
       if (*p != '_')
        {
@@ -4406,7 +4396,7 @@ stab_demangle_template (minfo, pp, pname)
            {
              if (**pp == 'm')
                ++*pp;
-             while (isdigit ((unsigned char) **pp))
+             while (ISDIGIT (**pp))
                ++*pp;
            }
          else if (charp)
@@ -4437,18 +4427,18 @@ stab_demangle_template (minfo, pp, pname)
            {
              if (**pp == 'm')
                ++*pp;
-             while (isdigit ((unsigned char) **pp))
+             while (ISDIGIT (**pp))
                ++*pp;
              if (**pp == '.')
                {
                  ++*pp;
-                 while (isdigit ((unsigned char) **pp))
+                 while (ISDIGIT (**pp))
                    ++*pp;
                }
              if (**pp == 'e')
                {
                  ++*pp;
-                 while (isdigit ((unsigned char) **pp))
+                 while (ISDIGIT (**pp))
                    ++*pp;
                }
            }
@@ -4470,7 +4460,7 @@ stab_demangle_template (minfo, pp, pname)
      regular demangling routine.  */
   if (pname != NULL)
     {
-      char *s1, *s2, *s3, *s4;
+      char *s1, *s2, *s3, *s4 = NULL;
       char *from, *to;
 
       s1 = savestring (orig, *pp - orig);
@@ -4701,7 +4691,7 @@ stab_demangle_type (minfo, pp, ptype)
        high = 0;
        while (**pp != '\0' && **pp != '_')
          {
-           if (! isdigit ((unsigned char) **pp))
+           if (! ISDIGIT (**pp))
              {
                stab_bad_demangle (orig);
                return false;
@@ -4805,7 +4795,7 @@ stab_demangle_type (minfo, pp, ptype)
        varargs = false;
 
        ++*pp;
-       if (isdigit ((unsigned char) **pp))
+       if (ISDIGIT (**pp))
          {
            n = stab_demangle_count (pp);
            if (strlen (*pp) < n)
@@ -5115,7 +5105,7 @@ stab_demangle_fund_type (minfo, pp, ptype)
 
     case 'G':
       ++*pp;
-      if (! isdigit ((unsigned char) **pp))
+      if (! ISDIGIT (**pp))
        {
          stab_bad_demangle (orig);
          return false;
This page took 0.031818 seconds and 4 git commands to generate.