* Rename remote-es1800.c to remote-es.c
[deliverable/binutils-gdb.git] / gdb / coffread.c
index 6e35c5b4e309d82e212b16dbaad89956216c8eae..d4e6db80d7fffbe071b0eab525de6834d79e3e6f 100644 (file)
@@ -1,6 +1,7 @@
 /* Read coff symbol tables and convert to internal format, for GDB.
    Contributed by David D. Johnson, Brown University (ddj@cs.brown.edu).
-   Copyright 1987, 1988, 1989, 1990, 1991, 1992 Free Software Foundation, Inc.
+   Copyright 1987, 1988, 1989, 1990, 1991, 1992, 1993
+   Free Software Foundation, Inc.
 
 This file is part of GDB.
 
@@ -17,7 +18,7 @@ GNU General Public License for more details.
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
-\f
+
 #include "defs.h"
 #include "symtab.h"
 #include "gdbtypes.h"
@@ -327,7 +328,7 @@ coff_lookup_type (index)
       int old_vector_length = type_vector_length;
 
       type_vector_length *= 2;
-      if (type_vector_length < index) {
+      if (index /* is still */ >= type_vector_length) {
        type_vector_length = index * 2;
       }
       type_vector = (struct type **)
@@ -913,6 +914,22 @@ read_coff_symtab (symtab_offset, nsyms, objfile)
   if (!stream)
    perror_with_name(objfile->name);
 
+  /* Work around a stdio bug in SunOS4.1.1 (this makes me nervous....
+     it's hard to know I've really worked around it.  The fix should be
+     harmless, anyway).  The symptom of the bug is that the first
+     fread (in read_one_sym), will (in my example) actually get data
+     from file offset 268, when the fseek was to 264 (and ftell shows
+     264).  This causes all hell to break loose.  I was unable to
+     reproduce this on a short test program which operated on the same
+     file, performing (I think) the same sequence of operations.
+
+     It stopped happening when I put in this rewind().
+
+     FIXME: Find out if this has been reported to Sun, whether it has
+     been fixed in a later release, etc.  */
+
+  rewind (stream);
+
   /* Position to read the symbol table. */
   val = fseek (stream, (long)symtab_offset, 0);
   if (val < 0)
@@ -1013,7 +1030,7 @@ read_coff_symtab (symtab_offset, nsyms, objfile)
 
           case C_STAT:
            if (cs->c_name[0] == '.') {
-                   if (strcmp (cs->c_name, ".text") == 0) {
+                   if (STREQ (cs->c_name, ".text")) {
                            /* FIXME:  don't wire in ".text" as section name
                                       or symbol name! */
                            if (++num_object_files == 1) {
@@ -1068,7 +1085,7 @@ read_coff_symtab (symtab_offset, nsyms, objfile)
            break;
 
          case C_FCN:
-           if (strcmp (cs->c_name, ".bf") == 0)
+           if (STREQ (cs->c_name, ".bf"))
              {
                within_function = 1;
 
@@ -1091,7 +1108,7 @@ read_coff_symtab (symtab_offset, nsyms, objfile)
                new->name = process_coff_symbol (&fcn_cs_saved,
                                                 &fcn_aux_saved, objfile);
              }
-           else if (strcmp (cs->c_name, ".ef") == 0)
+           else if (STREQ (cs->c_name, ".ef"))
              {
                      /* the value of .ef is the address of epilogue code;
                       * not useful for gdb
@@ -1137,7 +1154,7 @@ read_coff_symtab (symtab_offset, nsyms, objfile)
            break;
 
          case C_BLOCK:
-           if (strcmp (cs->c_name, ".bb") == 0)
+           if (STREQ (cs->c_name, ".bb"))
              {
                new = (struct coff_context_stack *)
                            xmalloc (sizeof (struct coff_context_stack));
@@ -1151,7 +1168,7 @@ read_coff_symtab (symtab_offset, nsyms, objfile)
                new->name = 0;
                coff_local_symbols = 0;
              }
-           else if (strcmp (cs->c_name, ".eb") == 0)
+           else if (STREQ (cs->c_name, ".eb"))
              {
                new = coff_context_stack;
                if (new == 0 || depth != new->depth)
@@ -1366,6 +1383,10 @@ getsymname (symbol_entry)
   return result;
 }
 
+/* Extract the file name from the aux entry of a C_FILE symbol.  Return
+   only the last component of the name.  Result is in static storage and
+   is only good for temporary use.  */
+
 static char *
 getfilename (aux_entry)
     union internal_auxent *aux_entry;
@@ -1374,24 +1395,11 @@ getfilename (aux_entry)
   register char *temp;
   char *result;
 
-#ifndef COFF_NO_LONG_FILE_NAMES
-#if defined (x_zeroes)
-  /* Data General.  */
-  if (aux_entry->x_zeroes == 0)
-    strcpy (buffer, stringtab + aux_entry->x_offset);
-#else /* no x_zeroes */
   if (aux_entry->x_file.x_n.x_zeroes == 0)
     strcpy (buffer, stringtab + aux_entry->x_file.x_n.x_offset);
-#endif /* no x_zeroes */
   else
-#endif /* COFF_NO_LONG_FILE_NAMES */
     {
-#if defined (x_name)
-      /* Data General.  */
-      strncpy (buffer, aux_entry->x_name, FILNMLEN);
-#else
       strncpy (buffer, aux_entry->x_file.x_fname, FILNMLEN);
-#endif
       buffer[FILNMLEN] = '\0';
     }
   result = buffer;
@@ -1535,7 +1543,7 @@ patch_opaque_types (s)
          for (sym = opaque_type_chain[hash]; sym;)
            {
              if (name[0] == SYMBOL_NAME (sym)[0] &&
-                 !strcmp (name + 1, SYMBOL_NAME (sym) + 1))
+                 STREQ (name + 1, SYMBOL_NAME (sym) + 1))
                {
                  if (prev)
                    {
@@ -1574,14 +1582,16 @@ process_coff_symbol (cs, aux, objfile)
      struct objfile *objfile;
 {
   register struct symbol *sym
-    = (struct symbol *) obstack_alloc (&objfile->symbol_obstack, sizeof (struct symbol));
+    = (struct symbol *) obstack_alloc (&objfile->symbol_obstack,
+                                      sizeof (struct symbol));
   char *name;
   struct type *temptype;
 
   memset (sym, 0, sizeof (struct symbol));
   name = cs->c_name;
   name = EXTERNAL_NAME (name, objfile->obfd);
-  SYMBOL_NAME (sym) = obstack_copy0 (&objfile->symbol_obstack, name, strlen (name));
+  SYMBOL_NAME (sym) = obstack_copy0 (&objfile->symbol_obstack, name,
+                                    strlen (name));
 
   /* default assumptions */
   SYMBOL_VALUE (sym) = cs->c_value;
@@ -1664,17 +1674,17 @@ process_coff_symbol (cs, aux, objfile)
            add_param_to_type(&in_function_type,sym);
 #endif
            coff_add_symbol_to_list (sym, &coff_local_symbols);
-#if !defined (BELIEVE_PCC_PROMOTION)
+#if !defined (BELIEVE_PCC_PROMOTION) && (TARGET_BYTE_ORDER == BIG_ENDIAN)
            /* If PCC says a parameter is a short or a char,
-              it is really an int.  */
+              aligned on an int boundary, realign it to the "little end"
+              of the int.  */
            temptype = lookup_fundamental_type (current_objfile, FT_INTEGER);
            if (TYPE_LENGTH (SYMBOL_TYPE (sym)) < TYPE_LENGTH (temptype)
-               && TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_INT)
+               && TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_INT
+               && 0 == SYMBOL_VALUE (sym) % TYPE_LENGTH (temptype))
                {
-                   SYMBOL_TYPE (sym) = TYPE_UNSIGNED (SYMBOL_TYPE (sym))
-                       ? lookup_fundamental_type (current_objfile,
-                                                  FT_UNSIGNED_INTEGER)
-                           : temptype;
+                   SYMBOL_VALUE (sym) += TYPE_LENGTH (temptype)
+                                       - TYPE_LENGTH (SYMBOL_TYPE (sym));
                }
 #endif
            break;
@@ -1684,6 +1694,8 @@ process_coff_symbol (cs, aux, objfile)
            SYMBOL_VALUE (sym) = SDB_REG_TO_REGNUM(cs->c_value);
            coff_add_symbol_to_list (sym, &coff_local_symbols);
 #if !defined (BELIEVE_PCC_PROMOTION)
+       /* FIXME:  This should retain the current type, since it's just
+          a register value.  gnu@adobe, 26Feb93 */
            /* If PCC says a parameter is a short or a char,
               it is really an int.  */
            temptype = lookup_fundamental_type (current_objfile, FT_INTEGER);
@@ -1777,7 +1789,7 @@ decode_type (cs, c_type, aux)
        {
          int i, n;
          register unsigned short *dim;
-         struct type *base_type, *index_type;
+         struct type *base_type, *index_type, *range_type;
 
          /* Define an array type.  */
          /* auxent refers to array, not base type */
@@ -1794,8 +1806,10 @@ decode_type (cs, c_type, aux)
 
          base_type = decode_type (cs, new_c_type, aux);
          index_type = lookup_fundamental_type (current_objfile, FT_INTEGER);
-         type = create_array_type ((struct type *) NULL, base_type,
-                                   index_type, 0, n - 1);
+         range_type =
+           create_range_type ((struct type *) NULL, index_type, 0, n - 1);
+         type =
+           create_array_type ((struct type *) NULL, base_type, range_type);
        }
       return type;
     }
@@ -2052,7 +2066,6 @@ coff_read_struct_type (index, length, lastsym)
 /* Read a definition of an enumeration type,
    and create and return a suitable type object.
    Also defines the symbols that represent the values of the type.  */
-/* Currently assumes it's sizeof (int) and doesn't use length.  */
 
 /* ARGSUSED */
 static struct type *
@@ -2112,7 +2125,10 @@ coff_read_enum_type (index, length, lastsym)
 
   /* Now fill in the fields of the type-structure.  */
 
-  TYPE_LENGTH (type) =  TARGET_INT_BIT / TARGET_CHAR_BIT;
+  if (length > 0)
+    TYPE_LENGTH (type) =  length;
+  else
+    TYPE_LENGTH (type) =  TARGET_INT_BIT / TARGET_CHAR_BIT;    /* Assume ints */
   TYPE_CODE (type) = TYPE_CODE_ENUM;
   TYPE_NFIELDS (type) = nsyms;
   TYPE_FIELDS (type) = (struct field *)
@@ -2133,10 +2149,10 @@ coff_read_enum_type (index, length, lastsym)
     }
   /* Is this Modula-2's BOOLEAN type?  Flag it as such if so. */
   if(TYPE_NFIELDS(type) == 2 &&
-     ((!strcmp(TYPE_FIELD_NAME(type,0),"TRUE") &&
-       !strcmp(TYPE_FIELD_NAME(type,1),"FALSE")) ||
-      (!strcmp(TYPE_FIELD_NAME(type,1),"TRUE") &&
-       !strcmp(TYPE_FIELD_NAME(type,0),"FALSE"))))
+     ((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;
   return type;
 }
This page took 0.026434 seconds and 4 git commands to generate.