2007-06-13 Claudio Fontana <claudio.fontana@gmail.com>
[deliverable/binutils-gdb.git] / gdb / mdebugread.c
index 7973865579d2df5eba7b555f4cf26dda0b361bf7..8fade1e025951f8ecf2731534d05c508ed7dc8ad 100644 (file)
@@ -1,8 +1,8 @@
 /* Read a symbol table in ECOFF format (Third-Eye).
 
-   Copyright 1986, 1987, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
-   1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software
-   Foundation, Inc.
+   Copyright (C) 1986, 1987, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
+   1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2007
+   Free Software Foundation, Inc.
 
    Original version contributed by Alessandro Forin (af@cs.cmu.edu) at
    CMU.  Major work by Per Bothner, John Gilmore and Ian Lance Taylor
@@ -22,8 +22,8 @@
 
    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., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
 
 /* This module provides the function mdebug_build_psymtabs.  It reads
    ECOFF debugging information into partial symbol tables.  The
@@ -644,7 +644,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
       if (sh->sc == scRegister)
        {
          class = LOC_REGISTER;
-         svalue = ECOFF_REG_TO_REGNUM (svalue);
+         svalue = gdbarch_ecoff_reg_to_regnum (current_gdbarch, svalue);
        }
       else
        class = LOC_LOCAL;
@@ -682,7 +682,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
        case scRegister:
          /* Pass by value in register.  */
          SYMBOL_CLASS (s) = LOC_REGPARM;
-         svalue = ECOFF_REG_TO_REGNUM (svalue);
+         svalue = gdbarch_ecoff_reg_to_regnum (current_gdbarch, svalue);
          break;
        case scVar:
          /* Pass by reference on stack.  */
@@ -691,7 +691,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
        case scVarRegister:
          /* Pass by reference in register.  */
          SYMBOL_CLASS (s) = LOC_REGPARM_ADDR;
-         svalue = ECOFF_REG_TO_REGNUM (svalue);
+         svalue = gdbarch_ecoff_reg_to_regnum (current_gdbarch, svalue);
          break;
        default:
          /* Pass by value on stack.  */
@@ -1046,7 +1046,8 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
               that too.  */
            if (TYPE_LENGTH (t) == TYPE_NFIELDS (t)
                || TYPE_LENGTH (t) == 0)
-             TYPE_LENGTH (t) = TARGET_INT_BIT / HOST_CHAR_BIT;
+             TYPE_LENGTH (t) = 
+               gdbarch_int_bit (current_gdbarch) / HOST_CHAR_BIT;
            for (ext_tsym = ext_sh + external_sym_size;
                 ;
                 ext_tsym += external_sym_size)
@@ -2162,6 +2163,85 @@ function_outside_compilation_unit_complaint (const char *arg1)
             arg1);
 }
 
+/* Use the STORAGE_CLASS to compute which section the given symbol
+   belongs to, and then records this new minimal symbol.  */
+
+static void
+record_minimal_symbol (const char *name, const CORE_ADDR address,
+                       enum minimal_symbol_type ms_type, int storage_class,
+                       struct objfile *objfile)
+{
+  int section;
+  asection *bfd_section;
+
+  switch (storage_class)
+    {
+      case scText:
+        section = SECT_OFF_TEXT (objfile);
+        bfd_section = bfd_get_section_by_name (cur_bfd, ".text");
+        break;
+      case scData:
+        section = SECT_OFF_DATA (objfile);
+        bfd_section = bfd_get_section_by_name (cur_bfd, ".data");
+        break;
+      case scBss:
+        section = SECT_OFF_BSS (objfile);
+        bfd_section = bfd_get_section_by_name (cur_bfd, ".bss");
+        break;
+      case scSData:
+        section = get_section_index (objfile, ".sdata");
+        bfd_section = bfd_get_section_by_name (cur_bfd, ".sdata");
+        break;
+      case scSBss:
+        section = get_section_index (objfile, ".sbss");
+        bfd_section = bfd_get_section_by_name (cur_bfd, ".sbss");
+        break;
+      case scRData:
+        section = get_section_index (objfile, ".rdata");
+        bfd_section = bfd_get_section_by_name (cur_bfd, ".rdata");
+        break;
+      case scInit:
+        section = get_section_index (objfile, ".init");
+        bfd_section = bfd_get_section_by_name (cur_bfd, ".init");
+        break;
+      case scXData:
+        section = get_section_index (objfile, ".xdata");
+        bfd_section = bfd_get_section_by_name (cur_bfd, ".xdata");
+        break;
+      case scPData:
+        section = get_section_index (objfile, ".pdata");
+        bfd_section = bfd_get_section_by_name (cur_bfd, ".pdata");
+        break;
+      case scFini:
+        section = get_section_index (objfile, ".fini");
+        bfd_section = bfd_get_section_by_name (cur_bfd, ".fini");
+        break;
+      case scRConst:
+        section = get_section_index (objfile, ".rconst");
+        bfd_section = bfd_get_section_by_name (cur_bfd, ".rconst");
+        break;
+#ifdef scTlsData
+      case scTlsData:
+        section = get_section_index (objfile, ".tlsdata");
+        bfd_section = bfd_get_section_by_name (cur_bfd, ".tlsdata");
+        break;
+#endif
+#ifdef scTlsBss
+      case scTlsBss:
+        section = get_section_index (objfile, ".tlsbss");
+        bfd_section = bfd_get_section_by_name (cur_bfd, ".tlsbss");
+        break;
+#endif
+      default:
+        /* This kind of symbol is not associated to a section.  */
+        section = -1;
+        bfd_section = NULL;
+    }
+
+  prim_record_minimal_symbol_and_info (name, address, ms_type, NULL,
+                                       section, bfd_section, objfile);
+}
+
 /* Master parsing procedure for first-pass reading of file symbols
    into a partial_symtab.  */
 
@@ -2476,7 +2556,8 @@ parse_partial_symbols (struct objfile *objfile)
          unknown_ext_complaint (name);
        }
       if (!ECOFF_IN_ELF (cur_bfd))
-       prim_record_minimal_symbol (name, svalue, ms_type, objfile);
+        record_minimal_symbol (name, svalue, ms_type, ext_in->asym.sc,
+                               objfile);
     }
 
   /* Pass 3 over files, over local syms: fill in static symbols */
@@ -2593,13 +2674,9 @@ parse_partial_symbols (struct objfile *objfile)
                      if (sh.st == stStaticProc)
                        {
                          namestring = debug_info->ss + fh->issBase + sh.iss;
-                         prim_record_minimal_symbol_and_info (namestring,
-                                                              sh.value,
-                                                              mst_file_text,
-                                                              NULL,
-                                                              SECT_OFF_TEXT (objfile),
-                                                              NULL,
-                                                              objfile);
+                          record_minimal_symbol (namestring, sh.value,
+                                                 mst_file_text, sh.sc,
+                                                 objfile);
                        }
                      procaddr = sh.value;
 
@@ -2641,13 +2718,9 @@ parse_partial_symbols (struct objfile *objfile)
                        case scXData:
                          namestring = debug_info->ss + fh->issBase + sh.iss;
                          sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
-                         prim_record_minimal_symbol_and_info (namestring,
-                                                              sh.value,
-                                                              mst_file_data,
-                                                              NULL,
-                                                              SECT_OFF_DATA (objfile),
-                                                              NULL,
-                                                              objfile);
+                          record_minimal_symbol (namestring, sh.value,
+                                                 mst_file_data, sh.sc,
+                                                 objfile);
                          break;
 
                        default:
@@ -2655,13 +2728,9 @@ parse_partial_symbols (struct objfile *objfile)
                             then have the default be abs? */
                          namestring = debug_info->ss + fh->issBase + sh.iss;
                          sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS (objfile));
-                         prim_record_minimal_symbol_and_info (namestring,
-                                                              sh.value,
-                                                              mst_file_bss,
-                                                              NULL,
-                                                              SECT_OFF_BSS (objfile),
-                                                              NULL,
-                                                              objfile);
+                          record_minimal_symbol (namestring, sh.value,
+                                                 mst_file_bss, sh.sc,
+                                                 objfile);
                          break;
                        }
                    }
@@ -4772,22 +4841,22 @@ _initialize_mdebugread (void)
               "adr_64", (struct objfile *) NULL);
   TYPE_TARGET_TYPE (mdebug_type_adr_64) = mdebug_type_void;
   mdebug_type_float =
-    init_type (TYPE_CODE_FLT, TARGET_FLOAT_BIT / TARGET_CHAR_BIT,
-              0,
-              "float", (struct objfile *) NULL);
+    init_type (TYPE_CODE_FLT,
+              gdbarch_float_bit (current_gdbarch) / TARGET_CHAR_BIT,
+              0, "float", (struct objfile *) NULL);
   mdebug_type_double =
-    init_type (TYPE_CODE_FLT, TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
-              0,
-              "double", (struct objfile *) NULL);
+    init_type (TYPE_CODE_FLT,
+              gdbarch_double_bit (current_gdbarch) / TARGET_CHAR_BIT,
+              0, "double", (struct objfile *) NULL);
   mdebug_type_complex =
-    init_type (TYPE_CODE_COMPLEX, 2 * TARGET_FLOAT_BIT / TARGET_CHAR_BIT,
-              0,
-              "complex", (struct objfile *) NULL);
+    init_type (TYPE_CODE_COMPLEX,
+              2 * gdbarch_float_bit (current_gdbarch) / TARGET_CHAR_BIT,
+              0, "complex", (struct objfile *) NULL);
   TYPE_TARGET_TYPE (mdebug_type_complex) = mdebug_type_float;
   mdebug_type_double_complex =
-    init_type (TYPE_CODE_COMPLEX, 2 * TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
-              0,
-              "double complex", (struct objfile *) NULL);
+    init_type (TYPE_CODE_COMPLEX,
+              2 * gdbarch_double_bit (current_gdbarch) / TARGET_CHAR_BIT,
+              0, "double complex", (struct objfile *) NULL);
   TYPE_TARGET_TYPE (mdebug_type_double_complex) = mdebug_type_double;
 
   /* Is a "string" the way btString means it the same as TYPE_CODE_STRING?
@@ -4803,13 +4872,13 @@ _initialize_mdebugread (void)
      TYPE_CODE_ERROR print things in hex if it knows the size?  */
   mdebug_type_fixed_dec =
     init_type (TYPE_CODE_INT,
-              TARGET_INT_BIT / TARGET_CHAR_BIT,
+              gdbarch_int_bit (current_gdbarch) / TARGET_CHAR_BIT,
               0, "fixed decimal",
               (struct objfile *) NULL);
 
   mdebug_type_float_dec =
     init_type (TYPE_CODE_ERROR,
-              TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
+              gdbarch_double_bit (current_gdbarch) / TARGET_CHAR_BIT,
               0, "floating decimal",
               (struct objfile *) NULL);
 
@@ -4817,6 +4886,7 @@ _initialize_mdebugread (void)
                                        "<function, no debug info>", NULL);
   TYPE_TARGET_TYPE (nodebug_func_symbol_type) = mdebug_type_int;
   nodebug_var_symbol_type =
-    init_type (TYPE_CODE_INT, TARGET_INT_BIT / HOST_CHAR_BIT, 0,
+    init_type (TYPE_CODE_INT, 
+              gdbarch_int_bit (current_gdbarch) / HOST_CHAR_BIT, 0,
               "<variable, no debug info>", NULL);
 }
This page took 0.029277 seconds and 4 git commands to generate.