Update copyright year in most headers.
[deliverable/binutils-gdb.git] / gdb / coffread.c
index b767eaff7134c81cc0f38f02f2ee977c7a8b4ae7..eca6618d8e62acdc98e25da66a1baf4eb372b5d4 100644 (file)
@@ -1,7 +1,7 @@
 /* Read coff symbol tables and convert to internal format, for GDB.
    Copyright (C) 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
-   1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007
-   Free Software Foundation, Inc.
+   1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009,
+   2010 Free Software Foundation, Inc.
    Contributed by David D. Johnson, Brown University (ddj@cs.brown.edu).
 
    This file is part of GDB.
@@ -137,19 +137,24 @@ struct coff_symbol
 
 extern void stabsread_clear_cache (void);
 
-static struct type *coff_read_struct_type (int, int, int);
+static struct type *coff_read_struct_type (int, int, int,
+                                          struct objfile *);
 
 static struct type *decode_base_type (struct coff_symbol *,
-                                     unsigned int, union internal_auxent *);
+                                     unsigned int, union internal_auxent *,
+                                     struct objfile *);
 
 static struct type *decode_type (struct coff_symbol *, unsigned int,
-                                union internal_auxent *);
+                                union internal_auxent *,
+                                struct objfile *);
 
 static struct type *decode_function_type (struct coff_symbol *,
                                          unsigned int,
-                                         union internal_auxent *);
+                                         union internal_auxent *,
+                                         struct objfile *);
 
-static struct type *coff_read_enum_type (int, int, int);
+static struct type *coff_read_enum_type (int, int, int,
+                                        struct objfile *);
 
 static struct symbol *process_coff_symbol (struct coff_symbol *,
                                           union internal_auxent *,
@@ -198,7 +203,7 @@ coff_locate_sections (bfd *abfd, asection *sectp, void *csip)
 
   csi = (struct coff_symfile_info *) csip;
   name = bfd_get_section_name (abfd, sectp);
-  if (DEPRECATED_STREQ (name, ".text"))
+  if (strcmp (name, ".text") == 0)
     {
       csi->textaddr = bfd_section_vma (abfd, sectp);
       csi->textsize += bfd_section_size (abfd, sectp);
@@ -207,7 +212,7 @@ coff_locate_sections (bfd *abfd, asection *sectp, void *csip)
     {
       csi->textsize += bfd_section_size (abfd, sectp);
     }
-  else if (DEPRECATED_STREQ (name, ".stabstr"))
+  else if (strcmp (name, ".stabstr") == 0)
     {
       csi->stabstrsect = sectp;
     }
@@ -359,7 +364,7 @@ coff_start_symtab (char *name)
      this pointer into last_source_file and we put it in
      subfiles->name, which end_symtab frees; that's why
      it must be malloc'd.  */
-                savestring (name, strlen (name)),
+                xstrdup (name),
   /* We never know the directory name for COFF.  */
                 NULL,
   /* The start address is irrelevant, since we set
@@ -378,7 +383,7 @@ complete_symtab (char *name, CORE_ADDR start_addr, unsigned int size)
 {
   if (last_source_file != NULL)
     xfree (last_source_file);
-  last_source_file = savestring (name, strlen (name));
+  last_source_file = xstrdup (name);
   current_source_start_addr = start_addr;
   current_source_end_addr = start_addr + size;
 }
@@ -416,7 +421,7 @@ record_minimal_symbol (struct coff_symbol *cs, CORE_ADDR address,
 
   bfd_section = cs_to_bfd_section (cs, objfile);
   return prim_record_minimal_symbol_and_info (cs->c_name, address, type,
-    NULL, section, bfd_section, objfile);
+                                             section, bfd_section, objfile);
 }
 \f
 /* coff_symfile_init ()
@@ -496,7 +501,7 @@ static bfd *symfile_bfd;
 /* Read a symbol file, after initialization by coff_symfile_init.  */
 
 static void
-coff_symfile_read (struct objfile *objfile, int mainline)
+coff_symfile_read (struct objfile *objfile, int symfile_flags)
 {
   struct coff_symfile_info *info;
   struct dbx_symfile_info *dbxinfo;
@@ -602,15 +607,6 @@ coff_symfile_read (struct objfile *objfile, int mainline)
   /* Free the installed minimal symbol data.  */
   do_cleanups (cleanup_minimal_symbols);
 
-  /* If we are reinitializing, or if we have not loaded syms yet,
-     empty the psymtab.  "mainline" is cleared so the *_read_psymtab
-     functions do not all re-initialize it.  */
-  if (mainline)
-    {
-      init_psymbol_list (objfile, 0);
-      mainline = 0;
-    }
-
   bfd_map_over_sections (abfd, coff_locate_sections, (void *) info);
 
   if (info->stabsects)
@@ -629,7 +625,6 @@ coff_symfile_read (struct objfile *objfile, int mainline)
       stabstrsize = bfd_section_size (abfd, info->stabstrsect);
 
       coffstab_build_psymtabs (objfile,
-                              mainline,
                               info->textaddr, info->textsize,
                               info->stabsects,
                               info->stabstrsect->filepos, stabstrsize);
@@ -637,11 +632,26 @@ coff_symfile_read (struct objfile *objfile, int mainline)
   if (dwarf2_has_info (objfile))
     {
       /* DWARF2 sections.  */
-      dwarf2_build_psymtabs (objfile, mainline);
+      dwarf2_build_psymtabs (objfile);
     }
 
   dwarf2_build_frame_info (objfile);
 
+  /* Try to add separate debug file if no symbols table found.   */
+  if (!objfile_has_partial_symbols (objfile))
+    {
+      char *debugfile;
+
+      debugfile = find_separate_debug_file_by_debuglink (objfile);
+
+      if (debugfile)
+       {
+         bfd *abfd = symfile_bfd_open (debugfile);
+         symbol_file_add_separate (abfd, symfile_flags, objfile);
+         xfree (debugfile);
+       }
+    }
+
   do_cleanups (back_to);
 }
 
@@ -665,6 +675,8 @@ coff_symfile_finish (struct objfile *objfile)
 
   /* Let stabs reader clean up */
   stabsread_clear_cache ();
+
+  dwarf2_free_objfile (objfile);
 }
 \f
 
@@ -677,6 +689,7 @@ static void
 coff_symtab_read (long symtab_offset, unsigned int nsyms,
                  struct objfile *objfile)
 {
+  struct gdbarch *gdbarch = get_objfile_arch (objfile);
   struct context_stack *new;
   struct coff_symbol coff_symbol;
   struct coff_symbol *cs = &coff_symbol;
@@ -750,6 +763,11 @@ coff_symtab_read (long symtab_offset, unsigned int nsyms,
            coff_end_symtab (objfile);
 
          coff_start_symtab ("_globals_");
+         /* coff_start_symtab will set the language of this symtab to
+            language_unknown, since such a ``file name'' is not
+            recognized.  Override that with the minimal language to
+            allow printing values in this symtab.  */
+         current_subfile->language = language_minimal;
          complete_symtab ("_globals_", 0, 0);
          /* done with all files, everything from here on out is globals */
        }
@@ -821,7 +839,7 @@ coff_symtab_read (long symtab_offset, unsigned int nsyms,
        case C_THUMBSTATFUNC:
          if (cs->c_name[0] == '.')
            {
-             if (DEPRECATED_STREQ (cs->c_name, ".text"))
+             if (strcmp (cs->c_name, ".text") == 0)
                {
                  /* FIXME:  don't wire in ".text" as section name
                     or symbol name! */
@@ -908,8 +926,7 @@ coff_symtab_read (long symtab_offset, unsigned int nsyms,
                      cs->c_sclass == C_EXT || cs->c_sclass == C_THUMBEXTFUNC
                      || cs->c_sclass == C_THUMBEXT ?
                      mst_text : mst_file_text;
-                   tmpaddr = gdbarch_smash_text_address
-                               (current_gdbarch, tmpaddr);
+                   tmpaddr = gdbarch_smash_text_address (gdbarch, tmpaddr);
                  }
                else if (bfd_section->flags & SEC_ALLOC
                         && bfd_section->flags & SEC_LOAD)
@@ -930,8 +947,7 @@ coff_symtab_read (long symtab_offset, unsigned int nsyms,
 
            msym = record_minimal_symbol (cs, tmpaddr, ms_type, sec, objfile);
            if (msym)
-             gdbarch_coff_make_msymbol_special
-             (current_gdbarch, cs->c_sclass, msym);
+             gdbarch_coff_make_msymbol_special (gdbarch, cs->c_sclass, msym);
 
            if (SDB_TYPE (cs->c_type))
              {
@@ -945,7 +961,7 @@ coff_symtab_read (long symtab_offset, unsigned int nsyms,
          break;
 
        case C_FCN:
-         if (DEPRECATED_STREQ (cs->c_name, ".bf"))
+         if (strcmp (cs->c_name, ".bf") == 0)
            {
              within_function = 1;
 
@@ -967,7 +983,7 @@ coff_symtab_read (long symtab_offset, unsigned int nsyms,
              new->name =
                process_coff_symbol (&fcn_cs_saved, &fcn_aux_saved, objfile);
            }
-         else if (DEPRECATED_STREQ (cs->c_name, ".ef"))
+         else if (strcmp (cs->c_name, ".ef") == 0)
            {
              if (!within_function)
                error (_("Bad coff function information."));
@@ -1013,29 +1029,17 @@ coff_symtab_read (long symtab_offset, unsigned int nsyms,
                 for which we do not have any other statement-line-number. */
              if (fcn_last_line == 1)
                record_line (current_subfile, fcn_first_line,
-                            fcn_first_line_addr);
+                            gdbarch_addr_bits_remove (gdbarch,
+                                                      fcn_first_line_addr));
              else
                enter_linenos (fcn_line_ptr, fcn_first_line, fcn_last_line,
                               objfile);
 
              finish_block (new->name, &local_symbols, new->old_blocks,
                            new->start_addr,
-#if defined (FUNCTION_EPILOGUE_SIZE)
-             /* This macro should be defined only on
-                machines where the
-                fcn_aux_saved.x_sym.x_misc.x_fsize
-                field is always zero.
-                So use the .bf record information that
-                points to the epilogue and add the size
-                of the epilogue.  */
-                           cs->c_value
-                           + FUNCTION_EPILOGUE_SIZE
-                           + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)),
-#else
                            fcn_cs_saved.c_value
                            + fcn_aux_saved.x_sym.x_misc.x_fsize
                            + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)),
-#endif
                            objfile
                );
              within_function = 0;
@@ -1043,13 +1047,13 @@ coff_symtab_read (long symtab_offset, unsigned int nsyms,
          break;
 
        case C_BLOCK:
-         if (DEPRECATED_STREQ (cs->c_name, ".bb"))
+         if (strcmp (cs->c_name, ".bb") == 0)
            {
              tmpaddr = cs->c_value;
              tmpaddr += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
              push_context (++depth, tmpaddr);
            }
-         else if (DEPRECATED_STREQ (cs->c_name, ".eb"))
+         else if (strcmp (cs->c_name, ".eb") == 0)
            {
              if (context_stack_depth <= 0)
                {               /* We attempted to pop an empty context stack */
@@ -1088,7 +1092,7 @@ coff_symtab_read (long symtab_offset, unsigned int nsyms,
 
   if ((nsyms == 0) && (pe_file))
     {
-      /* We've got no debugging symbols, but it's is a portable
+      /* We've got no debugging symbols, but it's a portable
         executable, so try to read the export table */
       read_pe_exported_syms (objfile);
     }
@@ -1116,20 +1120,29 @@ read_one_sym (struct coff_symbol *cs,
              union internal_auxent *aux)
 {
   int i;
+  bfd_size_type bytes;
 
   cs->c_symnum = symnum;
-  bfd_bread (temp_sym, local_symesz, nlist_bfd_global);
+  bytes = bfd_bread (temp_sym, local_symesz, nlist_bfd_global);
+  if (bytes != local_symesz)
+    error ("%s: error reading symbols", current_objfile->name);
   bfd_coff_swap_sym_in (symfile_bfd, temp_sym, (char *) sym);
   cs->c_naux = sym->n_numaux & 0xff;
   if (cs->c_naux >= 1)
     {
-      bfd_bread (temp_aux, local_auxesz, nlist_bfd_global);
+      bytes  = bfd_bread (temp_aux, local_auxesz, nlist_bfd_global);
+      if (bytes != local_auxesz)
+       error ("%s: error reading symbols", current_objfile->name);
       bfd_coff_swap_aux_in (symfile_bfd, temp_aux, sym->n_type, sym->n_sclass,
                            0, cs->c_naux, (char *) aux);
       /* If more than one aux entry, read past it (only the first aux
          is important). */
       for (i = 1; i < cs->c_naux; i++)
-       bfd_bread (temp_aux, local_auxesz, nlist_bfd_global);
+       {
+         bytes = bfd_bread (temp_aux, local_auxesz, nlist_bfd_global);
+         if (bytes != local_auxesz)
+           error ("%s: error reading symbols", current_objfile->name);
+       }
     }
   cs->c_name = getsymname (sym);
   cs->c_value = sym->n_value;
@@ -1343,6 +1356,7 @@ static void
 enter_linenos (long file_offset, int first_line,
               int last_line, struct objfile *objfile)
 {
+  struct gdbarch *gdbarch = get_objfile_arch (objfile);
   char *rawptr;
   struct internal_lineno lptr;
 
@@ -1375,9 +1389,12 @@ enter_linenos (long file_offset, int first_line,
       /* The next function, or the sentinel, will have L_LNNO32 zero;
         we exit. */
       if (L_LNNO32 (&lptr) && L_LNNO32 (&lptr) <= last_line)
-       record_line (current_subfile, first_line + L_LNNO32 (&lptr),
-                    lptr.l_addr.l_paddr
-                    + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)));
+       {
+         CORE_ADDR addr = lptr.l_addr.l_paddr;
+         addr += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
+         record_line (current_subfile, first_line + L_LNNO32 (&lptr),
+                      gdbarch_addr_bits_remove (gdbarch, addr));
+       }
       else
        break;
     }
@@ -1422,20 +1439,20 @@ patch_opaque_types (struct symtab *s)
          Remove syms from the chain when their types are stored,
          but search the whole chain, as there may be several syms
          from different files with the same name.  */
-      if (SYMBOL_CLASS (real_sym) == LOC_TYPEDEF &&
-         SYMBOL_DOMAIN (real_sym) == VAR_DOMAIN &&
-         TYPE_CODE (SYMBOL_TYPE (real_sym)) == TYPE_CODE_PTR &&
-         TYPE_LENGTH (TYPE_TARGET_TYPE (SYMBOL_TYPE (real_sym))) != 0)
+      if (SYMBOL_CLASS (real_sym) == LOC_TYPEDEF
+         && SYMBOL_DOMAIN (real_sym) == VAR_DOMAIN
+         && TYPE_CODE (SYMBOL_TYPE (real_sym)) == TYPE_CODE_PTR
+         && TYPE_LENGTH (TYPE_TARGET_TYPE (SYMBOL_TYPE (real_sym))) != 0)
        {
-         char *name = DEPRECATED_SYMBOL_NAME (real_sym);
+         char *name = SYMBOL_LINKAGE_NAME (real_sym);
          int hash = hashname (name);
          struct symbol *sym, *prev;
 
          prev = 0;
          for (sym = opaque_type_chain[hash]; sym;)
            {
-             if (name[0] == DEPRECATED_SYMBOL_NAME (sym)[0] &&
-                 strcmp (name + 1, DEPRECATED_SYMBOL_NAME (sym) + 1) == 0)
+             if (name[0] == SYMBOL_LINKAGE_NAME (sym)[0]
+                 && strcmp (name + 1, SYMBOL_LINKAGE_NAME (sym) + 1) == 0)
                {
                  if (prev)
                    {
@@ -1467,6 +1484,16 @@ patch_opaque_types (struct symtab *s)
     }
 }
 \f
+static int
+coff_reg_to_regnum (struct symbol *sym, struct gdbarch *gdbarch)
+{
+  return gdbarch_sdb_reg_to_regnum (gdbarch, SYMBOL_VALUE (sym));
+}
+
+static const struct symbol_register_ops coff_register_funcs = {
+  coff_reg_to_regnum
+};
+
 static struct symbol *
 process_coff_symbol (struct coff_symbol *cs,
                     union internal_auxent *aux,
@@ -1480,8 +1507,8 @@ process_coff_symbol (struct coff_symbol *cs,
   memset (sym, 0, sizeof (struct symbol));
   name = cs->c_name;
   name = EXTERNAL_NAME (name, objfile->obfd);
-  SYMBOL_LANGUAGE (sym) = language_auto;
-  SYMBOL_SET_NAMES (sym, name, strlen (name), objfile);
+  SYMBOL_LANGUAGE (sym) = current_subfile->language;
+  SYMBOL_SET_NAMES (sym, name, strlen (name), 1, objfile);
 
   /* default assumptions */
   SYMBOL_VALUE (sym) = cs->c_value;
@@ -1492,7 +1519,7 @@ process_coff_symbol (struct coff_symbol *cs,
     {
       SYMBOL_VALUE (sym) += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
       SYMBOL_TYPE (sym) =
-       lookup_function_type (decode_function_type (cs, cs->c_type, aux));
+       lookup_function_type (decode_function_type (cs, cs->c_type, aux, objfile));
 
       SYMBOL_CLASS (sym) = LOC_BLOCK;
       if (cs->c_sclass == C_STAT || cs->c_sclass == C_THUMBSTAT
@@ -1504,7 +1531,7 @@ process_coff_symbol (struct coff_symbol *cs,
     }
   else
     {
-      SYMBOL_TYPE (sym) = decode_type (cs, cs->c_type, aux);
+      SYMBOL_TYPE (sym) = decode_type (cs, cs->c_type, aux, objfile);
       switch (cs->c_sclass)
        {
        case C_NULL:
@@ -1547,8 +1574,8 @@ process_coff_symbol (struct coff_symbol *cs,
 #endif
        case C_REG:
          SYMBOL_CLASS (sym) = LOC_REGISTER;
-         SYMBOL_VALUE (sym) = gdbarch_sdb_reg_to_regnum
-                                (current_gdbarch, cs->c_value);
+         SYMBOL_REGISTER_OPS (sym) = &coff_register_funcs;
+         SYMBOL_VALUE (sym) = cs->c_value;
          add_symbol_to_list (sym, &local_symbols);
          break;
 
@@ -1558,13 +1585,15 @@ process_coff_symbol (struct coff_symbol *cs,
 
        case C_ARG:
          SYMBOL_CLASS (sym) = LOC_ARG;
+         SYMBOL_IS_ARGUMENT (sym) = 1;
          add_symbol_to_list (sym, &local_symbols);
          break;
 
        case C_REGPARM:
-         SYMBOL_CLASS (sym) = LOC_REGPARM;
-         SYMBOL_VALUE (sym) = gdbarch_sdb_reg_to_regnum
-                                (current_gdbarch, cs->c_value);
+         SYMBOL_CLASS (sym) = LOC_REGISTER;
+         SYMBOL_REGISTER_OPS (sym) = &coff_register_funcs;
+         SYMBOL_IS_ARGUMENT (sym) = 1;
+         SYMBOL_VALUE (sym) = cs->c_value;
          add_symbol_to_list (sym, &local_symbols);
          break;
 
@@ -1600,7 +1629,7 @@ process_coff_symbol (struct coff_symbol *cs,
                }
              else
                TYPE_NAME (SYMBOL_TYPE (sym)) =
-                 concat (DEPRECATED_SYMBOL_NAME (sym), (char *)NULL);
+                 concat (SYMBOL_LINKAGE_NAME (sym), (char *)NULL);
            }
 
          /* Keep track of any type which points to empty structured type,
@@ -1608,12 +1637,12 @@ process_coff_symbol (struct coff_symbol *cs,
             simple forward reference (TYPE_CODE_UNDEF) is not an
             empty structured type, though; the forward references
             work themselves out via the magic of coff_lookup_type.  */
-         if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_PTR &&
-             TYPE_LENGTH (TYPE_TARGET_TYPE (SYMBOL_TYPE (sym))) == 0 &&
-             TYPE_CODE (TYPE_TARGET_TYPE (SYMBOL_TYPE (sym))) !=
-             TYPE_CODE_UNDEF)
+         if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_PTR
+             && TYPE_LENGTH (TYPE_TARGET_TYPE (SYMBOL_TYPE (sym))) == 0
+             && TYPE_CODE (TYPE_TARGET_TYPE (SYMBOL_TYPE (sym)))
+                != TYPE_CODE_UNDEF)
            {
-             int i = hashname (DEPRECATED_SYMBOL_NAME (sym));
+             int i = hashname (SYMBOL_LINKAGE_NAME (sym));
 
              SYMBOL_VALUE_CHAIN (sym) = opaque_type_chain[i];
              opaque_type_chain[i] = sym;
@@ -1631,11 +1660,11 @@ process_coff_symbol (struct coff_symbol *cs,
             names for anonymous enums, structures, and unions, like
             "~0fake" or ".0fake".  Thanks, but no thanks... */
          if (TYPE_TAG_NAME (SYMBOL_TYPE (sym)) == 0)
-           if (DEPRECATED_SYMBOL_NAME (sym) != NULL
-               && *DEPRECATED_SYMBOL_NAME (sym) != '~'
-               && *DEPRECATED_SYMBOL_NAME (sym) != '.')
+           if (SYMBOL_LINKAGE_NAME (sym) != NULL
+               && *SYMBOL_LINKAGE_NAME (sym) != '~'
+               && *SYMBOL_LINKAGE_NAME (sym) != '.')
              TYPE_TAG_NAME (SYMBOL_TYPE (sym)) =
-               concat (DEPRECATED_SYMBOL_NAME (sym), (char *)NULL);
+               concat (SYMBOL_LINKAGE_NAME (sym), (char *)NULL);
 
          add_symbol_to_list (sym, &file_symbols);
          break;
@@ -1651,7 +1680,7 @@ process_coff_symbol (struct coff_symbol *cs,
 
 static struct type *
 decode_type (struct coff_symbol *cs, unsigned int c_type,
-            union internal_auxent *aux)
+            union internal_auxent *aux, struct objfile *objfile)
 {
   struct type *type = 0;
   unsigned int new_c_type;
@@ -1661,12 +1690,12 @@ decode_type (struct coff_symbol *cs, unsigned int c_type,
       new_c_type = DECREF (c_type);
       if (ISPTR (c_type))
        {
-         type = decode_type (cs, new_c_type, aux);
+         type = decode_type (cs, new_c_type, aux, objfile);
          type = lookup_pointer_type (type);
        }
       else if (ISFCN (c_type))
        {
-         type = decode_type (cs, new_c_type, aux);
+         type = decode_type (cs, new_c_type, aux, objfile);
          type = lookup_function_type (type);
        }
       else if (ISARY (c_type))
@@ -1688,8 +1717,8 @@ decode_type (struct coff_symbol *cs, unsigned int c_type,
            *dim = *(dim + 1);
          *dim = 0;
 
-         base_type = decode_type (cs, new_c_type, aux);
-         index_type = lookup_fundamental_type (current_objfile, FT_INTEGER);
+         base_type = decode_type (cs, new_c_type, aux, objfile);
+         index_type = objfile_type (objfile)->builtin_int;
          range_type =
            create_range_type ((struct type *) NULL, index_type, 0, n - 1);
          type =
@@ -1724,7 +1753,7 @@ decode_type (struct coff_symbol *cs, unsigned int c_type,
        }
     }
 
-  return decode_base_type (cs, BTYPE (c_type), aux);
+  return decode_base_type (cs, BTYPE (c_type), aux, objfile);
 }
 
 /* Decode a coff type specifier for function definition;
@@ -1732,59 +1761,60 @@ decode_type (struct coff_symbol *cs, unsigned int c_type,
 
 static struct type *
 decode_function_type (struct coff_symbol *cs, unsigned int c_type,
-                     union internal_auxent *aux)
+                     union internal_auxent *aux, struct objfile *objfile)
 {
   if (aux->x_sym.x_tagndx.l == 0)
     cs->c_naux = 0;            /* auxent refers to function, not base type */
 
-  return decode_type (cs, DECREF (c_type), aux);
+  return decode_type (cs, DECREF (c_type), aux, objfile);
 }
 \f
 /* basic C types */
 
 static struct type *
 decode_base_type (struct coff_symbol *cs, unsigned int c_type,
-                 union internal_auxent *aux)
+                 union internal_auxent *aux, struct objfile *objfile)
 {
+  struct gdbarch *gdbarch = get_objfile_arch (objfile);
   struct type *type;
 
   switch (c_type)
     {
     case T_NULL:
       /* shows up with "void (*foo)();" structure members */
-      return lookup_fundamental_type (current_objfile, FT_VOID);
+      return objfile_type (objfile)->builtin_void;
 
 #ifdef T_VOID
     case T_VOID:
       /* Intel 960 COFF has this symbol and meaning.  */
-      return lookup_fundamental_type (current_objfile, FT_VOID);
+      return objfile_type (objfile)->builtin_void;
 #endif
 
     case T_CHAR:
-      return lookup_fundamental_type (current_objfile, FT_CHAR);
+      return objfile_type (objfile)->builtin_char;
 
     case T_SHORT:
-      return lookup_fundamental_type (current_objfile, FT_SHORT);
+      return objfile_type (objfile)->builtin_short;
 
     case T_INT:
-      return lookup_fundamental_type (current_objfile, FT_INTEGER);
+      return objfile_type (objfile)->builtin_int;
 
     case T_LONG:
       if (cs->c_sclass == C_FIELD
          && aux->x_sym.x_misc.x_lnsz.x_size
-            > gdbarch_long_bit (current_gdbarch))
-       return lookup_fundamental_type (current_objfile, FT_LONG_LONG);
+            > gdbarch_long_bit (gdbarch))
+       return objfile_type (objfile)->builtin_long_long;
       else
-       return lookup_fundamental_type (current_objfile, FT_LONG);
+       return objfile_type (objfile)->builtin_long;
 
     case T_FLOAT:
-      return lookup_fundamental_type (current_objfile, FT_FLOAT);
+      return objfile_type (objfile)->builtin_float;
 
     case T_DOUBLE:
-      return lookup_fundamental_type (current_objfile, FT_DBL_PREC_FLOAT);
+      return objfile_type (objfile)->builtin_double;
 
     case T_LNGDBL:
-      return lookup_fundamental_type (current_objfile, FT_EXT_PREC_FLOAT);
+      return objfile_type (objfile)->builtin_long_double;
 
     case T_STRUCT:
       if (cs->c_naux != 1)
@@ -1806,7 +1836,8 @@ decode_base_type (struct coff_symbol *cs, unsigned int c_type,
        {
          type = coff_read_struct_type (cs->c_symnum,
                                        aux->x_sym.x_misc.x_lnsz.x_size,
-                                     aux->x_sym.x_fcnary.x_fcn.x_endndx.l);
+                                       aux->x_sym.x_fcnary.x_fcn.x_endndx.l,
+                                       objfile);
        }
       return type;
 
@@ -1829,7 +1860,8 @@ decode_base_type (struct coff_symbol *cs, unsigned int c_type,
        {
          type = coff_read_struct_type (cs->c_symnum,
                                        aux->x_sym.x_misc.x_lnsz.x_size,
-                                     aux->x_sym.x_fcnary.x_fcn.x_endndx.l);
+                                       aux->x_sym.x_fcnary.x_fcn.x_endndx.l,
+                                       objfile);
        }
       TYPE_CODE (type) = TYPE_CODE_UNION;
       return type;
@@ -1853,7 +1885,8 @@ decode_base_type (struct coff_symbol *cs, unsigned int c_type,
        {
          type = coff_read_enum_type (cs->c_symnum,
                                      aux->x_sym.x_misc.x_lnsz.x_size,
-                                     aux->x_sym.x_fcnary.x_fcn.x_endndx.l);
+                                     aux->x_sym.x_fcnary.x_fcn.x_endndx.l,
+                                     objfile);
        }
       return type;
 
@@ -1862,24 +1895,24 @@ decode_base_type (struct coff_symbol *cs, unsigned int c_type,
       break;
 
     case T_UCHAR:
-      return lookup_fundamental_type (current_objfile, FT_UNSIGNED_CHAR);
+      return objfile_type (objfile)->builtin_unsigned_char;
 
     case T_USHORT:
-      return lookup_fundamental_type (current_objfile, FT_UNSIGNED_SHORT);
+      return objfile_type (objfile)->builtin_unsigned_short;
 
     case T_UINT:
-      return lookup_fundamental_type (current_objfile, FT_UNSIGNED_INTEGER);
+      return objfile_type (objfile)->builtin_unsigned_int;
 
     case T_ULONG:
       if (cs->c_sclass == C_FIELD
          && aux->x_sym.x_misc.x_lnsz.x_size
-            > gdbarch_long_bit (current_gdbarch))
-       return lookup_fundamental_type (current_objfile, FT_UNSIGNED_LONG_LONG);
+            > gdbarch_long_bit (gdbarch))
+       return objfile_type (objfile)->builtin_unsigned_long_long;
       else
-       return lookup_fundamental_type (current_objfile, FT_UNSIGNED_LONG);
+       return objfile_type (objfile)->builtin_unsigned_long;
     }
   complaint (&symfile_complaints, _("Unexpected type for symbol %s"), cs->c_name);
-  return lookup_fundamental_type (current_objfile, FT_VOID);
+  return objfile_type (objfile)->builtin_void;
 }
 \f
 /* This page contains subroutines of read_type.  */
@@ -1888,7 +1921,8 @@ decode_base_type (struct coff_symbol *cs, unsigned int c_type,
    object describing the type.  */
 
 static struct type *
-coff_read_struct_type (int index, int length, int lastsym)
+coff_read_struct_type (int index, int length, int lastsym,
+                      struct objfile *objfile)
 {
   struct nextfield
     {
@@ -1917,7 +1951,7 @@ coff_read_struct_type (int index, int length, int lastsym)
     {
       read_one_sym (ms, &sub_sym, &sub_aux);
       name = ms->c_name;
-      name = EXTERNAL_NAME (name, current_objfile->obfd);
+      name = EXTERNAL_NAME (name, objfile->obfd);
 
       switch (ms->c_sclass)
        {
@@ -1931,13 +1965,11 @@ coff_read_struct_type (int index, int length, int lastsym)
 
          /* Save the data.  */
          list->field.name =
-           obsavestring (name,
-                         strlen (name),
-                         &current_objfile->objfile_obstack);
-         FIELD_TYPE (list->field) = decode_type (ms, ms->c_type, &sub_aux);
-         FIELD_BITPOS (list->field) = 8 * ms->c_value;
+           obsavestring (name, strlen (name), &objfile->objfile_obstack);
+         FIELD_TYPE (list->field) = decode_type (ms, ms->c_type, &sub_aux,
+                                                 objfile);
+         SET_FIELD_BITPOS (list->field, 8 * ms->c_value);
          FIELD_BITSIZE (list->field) = 0;
-         FIELD_STATIC_KIND (list->field) = 0;
          nfields++;
          break;
 
@@ -1950,13 +1982,11 @@ coff_read_struct_type (int index, int length, int lastsym)
 
          /* Save the data.  */
          list->field.name =
-           obsavestring (name,
-                         strlen (name),
-                         &current_objfile->objfile_obstack);
-         FIELD_TYPE (list->field) = decode_type (ms, ms->c_type, &sub_aux);
-         FIELD_BITPOS (list->field) = ms->c_value;
+           obsavestring (name, strlen (name), &objfile->objfile_obstack);
+         FIELD_TYPE (list->field) = decode_type (ms, ms->c_type, &sub_aux,
+                                                 objfile);
+         SET_FIELD_BITPOS (list->field, ms->c_value);
          FIELD_BITSIZE (list->field) = sub_aux.x_sym.x_misc.x_lnsz.x_size;
-         FIELD_STATIC_KIND (list->field) = 0;
          nfields++;
          break;
 
@@ -1984,8 +2014,10 @@ coff_read_struct_type (int index, int length, int lastsym)
    Also defines the symbols that represent the values of the type.  */
 
 static struct type *
-coff_read_enum_type (int index, int length, int lastsym)
+coff_read_enum_type (int index, int length, int lastsym,
+                    struct objfile *objfile)
 {
+  struct gdbarch *gdbarch = get_objfile_arch (objfile);
   struct symbol *sym;
   struct type *type;
   int nsyms = 0;
@@ -2013,19 +2045,18 @@ coff_read_enum_type (int index, int length, int lastsym)
     {
       read_one_sym (ms, &sub_sym, &sub_aux);
       name = ms->c_name;
-      name = EXTERNAL_NAME (name, current_objfile->obfd);
+      name = EXTERNAL_NAME (name, objfile->obfd);
 
       switch (ms->c_sclass)
        {
        case C_MOE:
          sym = (struct symbol *) obstack_alloc
-           (&current_objfile->objfile_obstack,
-            sizeof (struct symbol));
+           (&objfile->objfile_obstack, sizeof (struct symbol));
          memset (sym, 0, sizeof (struct symbol));
 
-         DEPRECATED_SYMBOL_NAME (sym) =
-           obsavestring (name, strlen (name),
-                         &current_objfile->objfile_obstack);
+         SYMBOL_SET_LINKAGE_NAME (sym,
+                                  obsavestring (name, strlen (name),
+                                                &objfile->objfile_obstack));
          SYMBOL_CLASS (sym) = LOC_CONST;
          SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
          SYMBOL_VALUE (sym) = ms->c_value;
@@ -2047,7 +2078,7 @@ coff_read_enum_type (int index, int length, int lastsym)
   if (length > 0)
     TYPE_LENGTH (type) = length;
   else /* Assume ints.  */
-    TYPE_LENGTH (type) = gdbarch_int_bit (current_gdbarch) / TARGET_CHAR_BIT;
+    TYPE_LENGTH (type) = gdbarch_int_bit (gdbarch) / TARGET_CHAR_BIT;
   TYPE_CODE (type) = TYPE_CODE_ENUM;
   TYPE_NFIELDS (type) = nsyms;
   TYPE_FIELDS (type) = (struct field *)
@@ -2071,19 +2102,18 @@ coff_read_enum_type (int index, int length, int lastsym)
        {
          struct symbol *xsym = syms->symbol[j];
          SYMBOL_TYPE (xsym) = type;
-         TYPE_FIELD_NAME (type, n) = DEPRECATED_SYMBOL_NAME (xsym);
-         TYPE_FIELD_BITPOS (type, n) = SYMBOL_VALUE (xsym);
+         TYPE_FIELD_NAME (type, n) = SYMBOL_LINKAGE_NAME (xsym);
+         SET_FIELD_BITPOS (TYPE_FIELD (type, n), SYMBOL_VALUE (xsym));
          if (SYMBOL_VALUE (xsym) < 0)
            unsigned_enum = 0;
          TYPE_FIELD_BITSIZE (type, n) = 0;
-         TYPE_FIELD_STATIC_KIND (type, n) = 0;
        }
       if (syms == osyms)
        break;
     }
 
   if (unsigned_enum)
-    TYPE_FLAGS (type) |= TYPE_FLAG_UNSIGNED;
+    TYPE_UNSIGNED (type) = 1;
 
   return type;
 }
This page took 0.039519 seconds and 4 git commands to generate.