* gdbserver/{remote-gutils.c remote-server.c Makefile.in
[deliverable/binutils-gdb.git] / gdb / coffread.c
index 75468f7224e5bbf8e8cb58fd8effb438860dd333..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 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"
@@ -26,13 +27,19 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "symfile.h"
 #include "objfiles.h"
 #include "buildsym.h"
+#include "complaints.h"
 #include <obstack.h>
 
 #include <string.h>
 
+#include "libbfd.h"            /* FIXME secret internal data from BFD */
 #include "coff/internal.h"     /* Internal format of COFF symbols in BFD */
 #include "libcoff.h"           /* FIXME secret internal data from BFD */
 
+/* Translate an external name string into a user-visible name.  */
+#define        EXTERNAL_NAME(string, abfd) \
+       (string[0] == bfd_get_symbol_leading_char(abfd)? string+1: string)
+
 /* To be an sdb debug type, type must have at least a basic or primary
    derived type.  Using this rather than checking against T_NULL is
    said to prevent core dumps if we try to operate on Michael Bloom
@@ -130,9 +137,9 @@ struct coff_pending
 
 struct coff_pending *coff_file_symbols;        /* static at top level, and types */
 
-struct coff_pending *coff_global_symbols;      /* global functions and variables */
+struct coff_pending *coff_global_symbols;  /* global functions and variables */
 
-struct coff_pending *coff_local_symbols;       /* everything local to lexical context */
+struct coff_pending *coff_local_symbols;  /* everything local to lexical context */
 
 /* List of unclosed lexical contexts
    (that will become blocks, eventually).  */
@@ -189,6 +196,9 @@ struct complaint misordered_blocks_complaint =
 struct complaint tagndx_bad_complaint =
   {"Symbol table entry for %s has bad tagndx value", 0, 0};
 
+struct complaint eb_complaint = 
+  {"Mismatched .eb symbol ignored starting at symnum %d", 0, 0};
+
 /* Simplified internal version of coff symbol table information */
 
 struct coff_symbol {
@@ -267,7 +277,7 @@ static void
 coff_new_init PARAMS ((struct objfile *));
 
 static void
-coff_symfile_read PARAMS ((struct objfile *, CORE_ADDR, int));
+coff_symfile_read PARAMS ((struct objfile *, struct section_offsets *, int));
 
 static void
 coff_symfile_finish PARAMS ((struct objfile *));
@@ -318,13 +328,13 @@ 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 **)
        xrealloc ((char *) type_vector,
                  type_vector_length * sizeof (struct type *));
-      bzero (&type_vector[old_vector_length],
+      memset (&type_vector[old_vector_length], 0,
             (type_vector_length - old_vector_length) * sizeof(struct type *));
     }
   return &type_vector[index];
@@ -522,7 +532,7 @@ coff_start_symtab ()
   coff_global_symbols = 0;
   coff_context_stack = 0;
   within_function = 0;
-  last_source_file = 0;
+  last_source_file = NULL;
 
   /* Initialize the source file line number information for this file.  */
 
@@ -591,7 +601,7 @@ coff_end_symtab (objfile)
       free ((PTR)line_vector);
       line_vector = 0;
       line_vector_length = -1;
-      last_source_file = 0;
+      last_source_file = NULL;
       return;
     }
 
@@ -614,8 +624,7 @@ coff_end_symtab (objfile)
 
          if (BLOCK_START(pb->block) < BLOCK_START(pbnext->block)) {
            struct block *tmp = pb->block;
-           complain (&misordered_blocks_complaint,
-                     (char *) BLOCK_START (pb->block));
+           complain (&misordered_blocks_complaint, BLOCK_START (pb->block));
            pb->block = pbnext->block;
            pbnext->block = tmp;
            swapped = 1;
@@ -654,7 +663,7 @@ coff_end_symtab (objfile)
   /* Reinitialize for beginning of new file. */
   line_vector = 0;
   line_vector_length = -1;
-  last_source_file = 0;
+  last_source_file = NULL;
 }
 \f
 static void
@@ -762,9 +771,9 @@ static bfd *symfile_bfd;
 
 /* ARGSUSED */
 static void
-coff_symfile_read (objfile, addr, mainline)
+coff_symfile_read (objfile, section_offsets, mainline)
      struct objfile *objfile;
-     CORE_ADDR addr;
+     struct section_offsets *section_offsets;
      int mainline;
 {
   struct coff_symfile_info *info;
@@ -776,7 +785,6 @@ coff_symfile_read (objfile, addr, mainline)
   int num_symbols;
   int symtab_offset;
   int stringtab_offset;
-  struct symtab *s;
 
   info = (struct coff_symfile_info *) objfile -> sym_private;
   symfile_bfd = abfd;                  /* Kludge for swap routines */
@@ -902,31 +910,46 @@ read_coff_symtab (symtab_offset, nsyms, objfile)
   struct cleanup *old_chain;
   int val;
 
-  stream = fopen (objfile->name, FOPEN_RB);
+  stream = bfd_cache_lookup(objfile->obfd);
   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)
     perror_with_name (objfile->name);
 
-  /* These cleanups will be discarded below if we succeed.  */
+  /* This cleanup will be discarded below if we succeed.  */
   old_chain = make_cleanup (free_objfile, objfile);
-  make_cleanup (fclose, stream);
 
   current_objfile = objfile;
   nlist_stream_global = stream;
   nlist_nsyms_global = nsyms;
-  last_source_file = 0;
-  bzero (opaque_type_chain, sizeof opaque_type_chain);
+  last_source_file = NULL;
+  memset (opaque_type_chain, 0, sizeof opaque_type_chain);
 
   if (type_vector)                     /* Get rid of previous one */
     free ((PTR)type_vector);
   type_vector_length = 160;
   type_vector = (struct type **)
                xmalloc (type_vector_length * sizeof (struct type *));
-  bzero (type_vector, type_vector_length * sizeof (struct type *));
+  memset (type_vector, 0, type_vector_length * sizeof (struct type *));
 
   coff_start_symtab ();
 
@@ -1007,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) {
@@ -1058,11 +1081,11 @@ read_coff_symtab (symtab_offset, nsyms, objfile)
                            break;
                    }
            }
-           (void) process_coff_symbol (cs, &main_aux, objfile);
+           process_coff_symbol (cs, &main_aux, objfile);
            break;
 
          case C_FCN:
-           if (strcmp (cs->c_name, ".bf") == 0)
+           if (STREQ (cs->c_name, ".bf"))
              {
                within_function = 1;
 
@@ -1070,7 +1093,7 @@ read_coff_symtab (symtab_offset, nsyms, objfile)
                /* main_aux.x_sym.x_misc.x_lnsz.x_lnno
                            contains line number of '{' } */
                if (cs->c_naux != 1)
-                 complain (&bf_no_aux_complaint, (char *) cs->c_symnum);
+                 complain (&bf_no_aux_complaint, cs->c_symnum);
                fcn_first_line = main_aux.x_sym.x_misc.x_lnsz.x_lnno;
 
                new = (struct coff_context_stack *)
@@ -1085,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
@@ -1095,12 +1118,12 @@ read_coff_symtab (symtab_offset, nsyms, objfile)
                new = coff_context_stack;
                if (new == 0)
                  {
-                   complain (&ef_complaint, (char *) cs->c_symnum);
+                   complain (&ef_complaint, cs->c_symnum);
                    within_function = 0;
                    break;
                  }
                if (cs->c_naux != 1) {
-                 complain (&ef_no_aux_complaint, (char *) cs->c_symnum);
+                 complain (&ef_no_aux_complaint, cs->c_symnum);
                  fcn_last_line = 0x7FFFFFFF;
                } else {
                  fcn_last_line = main_aux.x_sym.x_misc.x_lnsz.x_lnno;
@@ -1131,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));
@@ -1145,12 +1168,14 @@ 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)
-                 error ("Invalid symbol data: .bb/.eb symbol mismatch at symbol %d.",
-                        symnum);
+                 {
+                   complain (&eb_complaint, (char *)symnum);
+                   break;
+                 }
                if (coff_local_symbols && coff_context_stack->next)
                  {
                    /* Make a block for the local symbols within.  */
@@ -1165,7 +1190,7 @@ read_coff_symtab (symtab_offset, nsyms, objfile)
            break;
 
          default:
-           (void) process_coff_symbol (cs, &main_aux, objfile);
+           process_coff_symbol (cs, &main_aux, objfile);
            break;
        }
     }
@@ -1319,7 +1344,7 @@ init_stringtab (chan, offset)
   if (stringtab == NULL)
     return -1;
 
-  bcopy (&length, stringtab, sizeof length);
+  memcpy (stringtab, &length, sizeof length);
   if (length == sizeof length)         /* Empty table -- just the count */
     return 0;
 
@@ -1358,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;
@@ -1366,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;
@@ -1426,7 +1442,7 @@ init_lineno (chan, offset, size)
     return -1;
 
   /* Terminate it with an all-zero sentinel record */
-  bzero (linetab + size, local_linesz);
+  memset (linetab + size, 0, local_linesz);
 
   make_cleanup (free, linetab);                /* Be sure it gets de-allocated. */
   return 0;
@@ -1447,7 +1463,7 @@ enter_linenos (file_offset, first_line, last_line)
 
   if (file_offset < linetab_offset)
     {
-      complain (&lineno_complaint, (char *) file_offset);
+      complain (&lineno_complaint, file_offset);
       if (file_offset > linetab_size)  /* Too big to be an offset? */
        return;
       file_offset += linetab_offset;  /* Try reading at that linetab offset */
@@ -1482,10 +1498,9 @@ patch_type (type, real_type)
 
   TYPE_LENGTH (target) = TYPE_LENGTH (real_target);
   TYPE_NFIELDS (target) = TYPE_NFIELDS (real_target);
-  TYPE_FIELDS (target) = (struct field *)
-    obstack_alloc (&current_objfile -> type_obstack, field_size);
+  TYPE_FIELDS (target) = (struct field *) TYPE_ALLOC (target, field_size);
 
-  bcopy (TYPE_FIELDS (real_target), TYPE_FIELDS (target), field_size);
+  memcpy (TYPE_FIELDS (target), TYPE_FIELDS (real_target), field_size);
 
   if (TYPE_NAME (real_target))
     {
@@ -1528,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)
                    {
@@ -1567,19 +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;
-#ifdef NAMES_HAVE_UNDERSCORE
-  int offset = 1;
-#else
-  int offset = 0;
-#endif
   struct type *temptype;
 
-  bzero (sym, sizeof (struct symbol));
+  memset (sym, 0, sizeof (struct symbol));
   name = cs->c_name;
-  name = (name[0] == '_' ? name + offset : name);
-  SYMBOL_NAME (sym) = obstack_copy0 (&objfile->symbol_obstack, name, strlen (name));
+  name = EXTERNAL_NAME (name, objfile->obfd);
+  SYMBOL_NAME (sym) = obstack_copy0 (&objfile->symbol_obstack, name,
+                                    strlen (name));
 
   /* default assumptions */
   SYMBOL_VALUE (sym) = cs->c_value;
@@ -1595,8 +1607,8 @@ process_coff_symbol (cs, aux, objfile)
        struct type *new = (struct type *)
                    obstack_alloc (&objfile->symbol_obstack, sizeof (struct type));
        
-       bcopy(lookup_function_type (decode_function_type (cs, cs->c_type, aux)),
-            new, sizeof(struct type));
+       memcpy (new, lookup_function_type (decode_function_type (cs, cs->c_type, aux)),
+                     sizeof(struct type));
        SYMBOL_TYPE (sym) = new;
        in_function_type = SYMBOL_TYPE(sym);
 #else
@@ -1662,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;
@@ -1682,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);
@@ -1775,7 +1789,7 @@ decode_type (cs, c_type, aux)
        {
          int i, n;
          register unsigned short *dim;
-         struct type *base_type;
+         struct type *base_type, *index_type, *range_type;
 
          /* Define an array type.  */
          /* auxent refers to array, not base type */
@@ -1790,17 +1804,12 @@ decode_type (cs, c_type, aux)
            *dim = *(dim + 1);
          *dim = 0;
 
-         type = (struct type *)
-           obstack_alloc (&current_objfile -> type_obstack,
-                          sizeof (struct type));
-         bzero (type, sizeof (struct type));
-         TYPE_OBJFILE (type) = current_objfile;
-
          base_type = decode_type (cs, new_c_type, aux);
-
-         TYPE_CODE (type) = TYPE_CODE_ARRAY;
-         TYPE_TARGET_TYPE (type) = base_type;
-         TYPE_LENGTH (type) = n * TYPE_LENGTH (base_type);
+         index_type = lookup_fundamental_type (current_objfile, FT_INTEGER);
+         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;
     }
@@ -1809,12 +1818,15 @@ decode_type (cs, c_type, aux)
      struct, union, and enum types.  EPI a29k coff
      fakes us out by producing aux entries with a nonzero
      x_tagndx for definitions of structs, unions, and enums, so we
-     have to check the c_sclass field.  */
+     have to check the c_sclass field.  SCO 3.2v4 cc gets confused
+     with pointers to pointers to defined structs, and generates
+     negative x_tagndx fields.  */
   if (cs->c_naux > 0 && aux->x_sym.x_tagndx.l != 0)
     {
-      if  (cs->c_sclass != C_STRTAG
-       && cs->c_sclass != C_UNTAG
-       && cs->c_sclass != C_ENTAG)
+      if (cs->c_sclass != C_STRTAG
+         && cs->c_sclass != C_UNTAG
+         && cs->c_sclass != C_ENTAG
+         && aux->x_sym.x_tagndx.l >= 0)
        {
          type = coff_alloc_type (aux->x_sym.x_tagndx.l);
          return type;
@@ -1982,11 +1994,6 @@ coff_read_struct_type (index, length, lastsym)
   int nfields = 0;
   register int n;
   char *name;
-#ifdef NAMES_HAVE_UNDERSCORE
-  int offset = 1;
-#else
-  int offset = 0;
-#endif
   struct coff_symbol member_sym;
   register struct coff_symbol *ms = &member_sym;
   struct internal_syment sub_sym;
@@ -2002,7 +2009,7 @@ coff_read_struct_type (index, length, lastsym)
     {
       read_one_sym (ms, &sub_sym, &sub_aux);
       name = ms->c_name;
-      name = (name[0] == '_' ? name + offset : name);
+      name = EXTERNAL_NAME (name, current_objfile->obfd);
 
       switch (ms->c_sclass)
        {
@@ -2046,8 +2053,7 @@ coff_read_struct_type (index, length, lastsym)
 
   TYPE_NFIELDS (type) = nfields;
   TYPE_FIELDS (type) = (struct field *)
-    obstack_alloc (&current_objfile -> type_obstack,
-                  sizeof (struct field) * nfields);
+    TYPE_ALLOC (type, sizeof (struct field) * nfields);
 
   /* Copy the saved-up fields into the field vector.  */
 
@@ -2060,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 *
@@ -2081,11 +2086,6 @@ coff_read_enum_type (index, length, lastsym)
   struct coff_pending *osyms, *syms;
   register int n;
   char *name;
-#ifdef NAMES_HAVE_UNDERSCORE
-  int offset = 1;
-#else
-  int offset = 0;
-#endif
 
   type = coff_alloc_type (index);
   if (within_function)
@@ -2098,13 +2098,13 @@ coff_read_enum_type (index, length, lastsym)
     {
       read_one_sym (ms, &sub_sym, &sub_aux);
       name = ms->c_name;
-      name = (name[0] == '_' ? name + offset : name);
+      name = EXTERNAL_NAME (name, current_objfile->obfd);
 
       switch (ms->c_sclass)
        {
          case C_MOE:
            sym = (struct symbol *) xmalloc (sizeof (struct symbol));
-           bzero (sym, sizeof (struct symbol));
+           memset (sym, 0, sizeof (struct symbol));
 
            SYMBOL_NAME (sym) = savestring (name, strlen (name));
            SYMBOL_CLASS (sym) = LOC_CONST;
@@ -2125,12 +2125,14 @@ 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 *)
-    obstack_alloc (&current_objfile -> type_obstack,
-                  sizeof (struct field) * nsyms);
+    TYPE_ALLOC (type, sizeof (struct field) * nsyms);
 
   /* Find the symbols for the values and put them into the type.
      The symbols can be found in the symlist that we put them on
@@ -2147,14 +2149,26 @@ 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;
 }
 
+/* Fake up support for relocating symbol addresses.  FIXME.  */
+
+struct section_offsets coff_symfile_faker = {0};
+
+struct section_offsets *
+coff_symfile_offsets (objfile, addr)
+     struct objfile *objfile;
+     CORE_ADDR addr;
+{
+  return &coff_symfile_faker;
+}
+
 /* Register our ability to parse symbols for coff BFD files */
 
 static struct sym_fns coff_sym_fns =
@@ -2165,6 +2179,7 @@ static struct sym_fns coff_sym_fns =
   coff_symfile_init,   /* sym_init: read initial info, setup for sym_read() */
   coff_symfile_read,   /* sym_read: read a symbol file into symtab */
   coff_symfile_finish, /* sym_finish: finished with file, cleanup */
+  coff_symfile_offsets, /* sym_offsets:  xlate external to internal form */
   NULL                 /* next: pointer to next struct sym_fns */
 };
 
This page took 0.031682 seconds and 4 git commands to generate.