* bsd-kvm.c, bsd-kvm.h: New files.
[deliverable/binutils-gdb.git] / gdb / hpread.c
index daa5d5e45e2b15325f7a82ba0a04bce0330c4703..b3742d07225aa5e85cfa8634e3dc923e80f7e36f 100644 (file)
@@ -1,6 +1,6 @@
 /* Read hp debug symbols and convert to internal format, for GDB.
-   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-   Free Software Foundation, Inc.
+   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
+   2002, 2003, 2004 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -37,6 +37,7 @@
 #include "demangle.h"
 #include "somsolib.h"
 #include "gdb_assert.h"
+#include "hppa-tdep.h"
 
 /* Private information attached to an objfile which we use to find
    and internalize the HP C debug symbols within that objfile.  */
@@ -234,15 +235,12 @@ static void fixup_class_method_type
 
 static void hpread_adjust_bitoffsets (struct type *, int);
 
+static int hpread_adjust_stack_address (CORE_ADDR func_addr);
+
 static dnttpointer hpread_get_next_skip_over_anon_unions
   (int, dnttpointer, union dnttentry **, struct objfile *);
 
 \f
-/* Global to indicate presence of HP-compiled objects,
-   in particular, SOM executable file with SOM debug info 
-   Defined in symtab.c, used in hppa-tdep.c. */
-extern int hp_som_som_object_present;
-
 /* Static used to indicate a class type that requires a
    fix-up of one of its method types */
 static struct type *fixup_class = NULL;
@@ -1680,7 +1678,7 @@ hpread_symfile_init (struct objfile *objfile)
     return;
 
   GNTT (objfile)
-    = obstack_alloc (&objfile->symbol_obstack,
+    = obstack_alloc (&objfile->objfile_obstack,
                     bfd_section_size (objfile->obfd, gntt_section));
 
   bfd_get_section_contents (objfile->obfd, gntt_section, GNTT (objfile),
@@ -1702,7 +1700,7 @@ hpread_symfile_init (struct objfile *objfile)
     return;
 
   LNTT (objfile)
-    = obstack_alloc (&objfile->symbol_obstack,
+    = obstack_alloc (&objfile->objfile_obstack,
                     bfd_section_size (objfile->obfd, lntt_section));
 
   bfd_get_section_contents (objfile->obfd, lntt_section, LNTT (objfile),
@@ -1719,7 +1717,7 @@ hpread_symfile_init (struct objfile *objfile)
     return;
 
   SLT (objfile) =
-    obstack_alloc (&objfile->symbol_obstack,
+    obstack_alloc (&objfile->objfile_obstack,
                   bfd_section_size (objfile->obfd, slt_section));
 
   bfd_get_section_contents (objfile->obfd, slt_section, SLT (objfile),
@@ -1734,7 +1732,7 @@ hpread_symfile_init (struct objfile *objfile)
   VT_SIZE (objfile) = bfd_section_size (objfile->obfd, vt_section);
 
   VT (objfile) =
-    (char *) obstack_alloc (&objfile->symbol_obstack,
+    (char *) obstack_alloc (&objfile->objfile_obstack,
                            VT_SIZE (objfile));
 
   bfd_get_section_contents (objfile->obfd, vt_section, VT (objfile),
@@ -1973,7 +1971,7 @@ hpread_build_psymtabs (struct objfile *objfile, int mainline)
                    if (!have_name)
                      {
                        pst->filename = (char *)
-                         obstack_alloc (&pst->objfile->psymbol_obstack,
+                         obstack_alloc (&pst->objfile->objfile_obstack,
                                         strlen (namestring) + 1);
                        strcpy (pst->filename, namestring);
                        have_name = 1;
@@ -2392,7 +2390,7 @@ hpread_start_psymtab (struct objfile *objfile, char *filename,
 
   result->textlow += offset;
   result->read_symtab_private = (char *)
-    obstack_alloc (&objfile->psymbol_obstack, sizeof (struct symloc));
+    obstack_alloc (&objfile->objfile_obstack, sizeof (struct symloc));
   LDSYMOFF (result) = ldsymoff;
   result->read_symtab = hpread_psymtab_to_symtab;
 
@@ -2453,7 +2451,7 @@ hpread_end_psymtab (struct partial_symtab *pst, char **include_list,
   if (number_dependencies)
     {
       pst->dependencies = (struct partial_symtab **)
-       obstack_alloc (&objfile->psymbol_obstack,
+       obstack_alloc (&objfile->objfile_obstack,
                    number_dependencies * sizeof (struct partial_symtab *));
       memcpy (pst->dependencies, dependency_list,
              number_dependencies * sizeof (struct partial_symtab *));
@@ -2468,7 +2466,7 @@ hpread_end_psymtab (struct partial_symtab *pst, char **include_list,
 
       subpst->section_offsets = pst->section_offsets;
       subpst->read_symtab_private =
-       (char *) obstack_alloc (&objfile->psymbol_obstack,
+       (char *) obstack_alloc (&objfile->objfile_obstack,
                                sizeof (struct symloc));
       LDSYMOFF (subpst) =
        LDSYMLEN (subpst) =
@@ -2478,7 +2476,7 @@ hpread_end_psymtab (struct partial_symtab *pst, char **include_list,
       /* We could save slight bits of space by only making one of these,
          shared by the entire set of include files.  FIXME-someday.  */
       subpst->dependencies = (struct partial_symtab **)
-       obstack_alloc (&objfile->psymbol_obstack,
+       obstack_alloc (&objfile->objfile_obstack,
                       sizeof (struct partial_symtab *));
       subpst->dependencies[0] = pst;
       subpst->number_of_dependencies = 1;
@@ -2875,7 +2873,7 @@ hpread_expand_symtab (struct objfile *objfile, int sym_offset, int sym_size,
     }
 
   current_objfile = NULL;
-  hp_som_som_object_present = 1;       /* Indicate we've processed an HP SOM SOM file */
+  deprecated_hp_som_som_object_present = 1;    /* Indicate we've processed an HP SOM SOM file */
 
   return end_symtab (text_offset + text_size, objfile, SECT_OFF_TEXT (objfile));
 }
@@ -3127,11 +3125,11 @@ hpread_read_enum_type (dnttpointer hp_type, union dnttentry *dn_bufp,
       memp = hpread_get_lntt (mem.dnttp.index, objfile);
 
       name = VT (objfile) + memp->dmember.name;
-      sym = (struct symbol *) obstack_alloc (&objfile->symbol_obstack,
+      sym = (struct symbol *) obstack_alloc (&objfile->objfile_obstack,
                                             sizeof (struct symbol));
       memset (sym, 0, sizeof (struct symbol));
       DEPRECATED_SYMBOL_NAME (sym) = obsavestring (name, strlen (name),
-                                       &objfile->symbol_obstack);
+                                       &objfile->objfile_obstack);
       SYMBOL_CLASS (sym) = LOC_CONST;
       SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
       SYMBOL_VALUE (sym) = memp->dmember.value;
@@ -3145,7 +3143,7 @@ hpread_read_enum_type (dnttpointer hp_type, union dnttentry *dn_bufp,
   TYPE_FLAGS (type) &= ~TYPE_FLAG_STUB;
   TYPE_NFIELDS (type) = nsyms;
   TYPE_FIELDS (type) = (struct field *)
-    obstack_alloc (&objfile->type_obstack, sizeof (struct field) * nsyms);
+    obstack_alloc (&objfile->objfile_obstack, sizeof (struct field) * nsyms);
 
   /* Find the symbols for the members and put them into the type.
      The symbols can be found in the symlist that we put them on
@@ -3235,11 +3233,11 @@ hpread_read_function_type (dnttpointer hp_type, union dnttentry *dn_bufp,
 
       /* Get the name.  */
       name = VT (objfile) + paramp->dfparam.name;
-      sym = (struct symbol *) obstack_alloc (&objfile->symbol_obstack,
+      sym = (struct symbol *) obstack_alloc (&objfile->objfile_obstack,
                                             sizeof (struct symbol));
       (void) memset (sym, 0, sizeof (struct symbol));
       DEPRECATED_SYMBOL_NAME (sym) = obsavestring (name, strlen (name),
-                                       &objfile->symbol_obstack);
+                                       &objfile->objfile_obstack);
 
       /* Figure out where it lives.  */
       if (paramp->dfparam.regparam)
@@ -3252,10 +3250,9 @@ hpread_read_function_type (dnttpointer hp_type, union dnttentry *dn_bufp,
       if (paramp->dfparam.copyparam)
        {
          SYMBOL_VALUE (sym) = paramp->dfparam.location;
-#ifdef HPREAD_ADJUST_STACK_ADDRESS
          SYMBOL_VALUE (sym)
-           += HPREAD_ADJUST_STACK_ADDRESS (CURRENT_FUNCTION_VALUE (objfile));
-#endif
+           += hpread_adjust_stack_address (CURRENT_FUNCTION_VALUE (objfile));
+
          /* This is likely a pass-by-invisible reference parameter,
             Hack on the symbol class to make GDB happy.  */
          /* ??rehrauer: This appears to be broken w/r/t to passing
@@ -3306,7 +3303,7 @@ hpread_read_function_type (dnttpointer hp_type, union dnttentry *dn_bufp,
   /* Note how many parameters we found.  */
   TYPE_NFIELDS (type) = nsyms;
   TYPE_FIELDS (type) = (struct field *)
-    obstack_alloc (&objfile->type_obstack,
+    obstack_alloc (&objfile->objfile_obstack,
                   sizeof (struct field) * nsyms);
 
   /* Find the symbols for the parameters and 
@@ -3415,7 +3412,7 @@ hpread_read_doc_function_type (dnttpointer hp_type, union dnttentry *dn_bufp,
 
       /* Get the name.  */
       name = VT (objfile) + paramp->dfparam.name;
-      sym = (struct symbol *) obstack_alloc (&objfile->symbol_obstack,
+      sym = (struct symbol *) obstack_alloc (&objfile->objfile_obstack,
                                             sizeof (struct symbol));
       (void) memset (sym, 0, sizeof (struct symbol));
       DEPRECATED_SYMBOL_NAME (sym) = name;
@@ -3431,10 +3428,9 @@ hpread_read_doc_function_type (dnttpointer hp_type, union dnttentry *dn_bufp,
       if (paramp->dfparam.copyparam)
        {
          SYMBOL_VALUE (sym) = paramp->dfparam.location;
-#ifdef HPREAD_ADJUST_STACK_ADDRESS
          SYMBOL_VALUE (sym)
-           += HPREAD_ADJUST_STACK_ADDRESS (CURRENT_FUNCTION_VALUE (objfile));
-#endif
+           += hpread_adjust_stack_address(CURRENT_FUNCTION_VALUE (objfile));
+
          /* This is likely a pass-by-invisible reference parameter,
             Hack on the symbol class to make GDB happy.  */
          /* ??rehrauer: This appears to be broken w/r/t to passing
@@ -3485,7 +3481,7 @@ hpread_read_doc_function_type (dnttpointer hp_type, union dnttentry *dn_bufp,
   /* Note how many parameters we found.  */
   TYPE_NFIELDS (type) = nsyms;
   TYPE_FIELDS (type) = (struct field *)
-    obstack_alloc (&objfile->type_obstack,
+    obstack_alloc (&objfile->objfile_obstack,
                   sizeof (struct field) * nsyms);
 
   /* Find the symbols for the parameters and 
@@ -3782,7 +3778,7 @@ hpread_read_struct_type (dnttpointer hp_type, union dnttentry *dn_bufp,
 
   if (n_templ_args > 0)
     TYPE_TEMPLATE_ARGS (type) = (struct template_arg *)
-      obstack_alloc (&objfile->type_obstack, sizeof (struct template_arg) * n_templ_args);
+      obstack_alloc (&objfile->objfile_obstack, sizeof (struct template_arg) * n_templ_args);
   for (n = n_templ_args; t_list; t_list = t_list->next)
     {
       n -= 1;
@@ -3897,7 +3893,7 @@ hpread_read_struct_type (dnttpointer hp_type, union dnttentry *dn_bufp,
              fn_p = fn_list;
              while (fn_p)
                {
-                 if (STREQ (fn_p->field.name, method_name))
+                 if (DEPRECATED_STREQ (fn_p->field.name, method_name))
                    break;
                  fn_p = fn_p->next;
                }
@@ -4160,16 +4156,19 @@ hpread_read_struct_type (dnttpointer hp_type, union dnttentry *dn_bufp,
          list->field.name = VT (objfile) + fieldp->dfield.name;
 
 
-         /* A FIELD by itself (without a GENFIELD) can also be a static member */
-         FIELD_STATIC_KIND (list->field) = 0;
+         /* A FIELD by itself (without a GENFIELD) can also be a static
+            member.  Mark it as static with a physname of NULL.
+            fix_static_member_physnames will assign the physname later. */
          if (fieldp->dfield.staticmem)
            {
-             FIELD_BITPOS (list->field) = -1;
+             SET_FIELD_PHYSNAME (list->field, NULL);
+             FIELD_BITPOS (list->field) = 0;
              FIELD_BITSIZE (list->field) = 0;
            }
          else
            /* Non-static data member */
            {
+             FIELD_STATIC_KIND (list->field) = 0;
              FIELD_BITPOS (list->field) = fieldp->dfield.bitoffset;
              if (fieldp->dfield.bitlength % 8)
                FIELD_BITSIZE (list->field) = fieldp->dfield.bitlength;
@@ -4252,7 +4251,7 @@ hpread_read_struct_type (dnttpointer hp_type, union dnttentry *dn_bufp,
   TYPE_NINSTANTIATIONS (type) = ninstantiations;
   if (ninstantiations > 0)
     TYPE_INSTANTIATIONS (type) = (struct type **)
-      obstack_alloc (&objfile->type_obstack, sizeof (struct type *) * ninstantiations);
+      obstack_alloc (&objfile->objfile_obstack, sizeof (struct type *) * ninstantiations);
   for (n = ninstantiations; i_list; i_list = i_list->next)
     {
       n -= 1;
@@ -4264,7 +4263,7 @@ hpread_read_struct_type (dnttpointer hp_type, union dnttentry *dn_bufp,
   TYPE_NFIELDS (type) = nfields;
   TYPE_N_BASECLASSES (type) = n_base_classes;
   TYPE_FIELDS (type) = (struct field *)
-    obstack_alloc (&objfile->type_obstack, sizeof (struct field) * nfields);
+    obstack_alloc (&objfile->objfile_obstack, sizeof (struct field) * nfields);
   /* Copy the saved-up fields into the field vector.  */
   for (n = nfields, tmp_list = list; tmp_list; tmp_list = tmp_list->next)
     {
@@ -4278,7 +4277,7 @@ hpread_read_struct_type (dnttpointer hp_type, union dnttentry *dn_bufp,
   TYPE_NFN_FIELDS (type) = n_fn_fields;
   TYPE_NFN_FIELDS_TOTAL (type) = n_fn_fields_total;
   TYPE_FN_FIELDLISTS (type) = (struct fn_fieldlist *)
-    obstack_alloc (&objfile->type_obstack, sizeof (struct fn_fieldlist) * n_fn_fields);
+    obstack_alloc (&objfile->objfile_obstack, sizeof (struct fn_fieldlist) * n_fn_fields);
   for (n = n_fn_fields; fn_list; fn_list = fn_list->next)
     {
       n -= 1;
@@ -4396,7 +4395,7 @@ fix_static_member_physnames (struct type *type, char *class_name,
          return;               /* physnames are already set */
 
        SET_FIELD_PHYSNAME (TYPE_FIELDS (type)[i],
-                           obstack_alloc (&objfile->type_obstack,
+                           obstack_alloc (&objfile->objfile_obstack,
             strlen (class_name) + strlen (TYPE_FIELD_NAME (type, i)) + 3));
        strcpy (TYPE_FIELD_STATIC_PHYSNAME (type, i), class_name);
        strcat (TYPE_FIELD_STATIC_PHYSNAME (type, i), "::");
@@ -4559,7 +4558,7 @@ hpread_read_array_type (dnttpointer hp_type, union dnttentry *dn_bufp,
    */
   TYPE_NFIELDS (type) = 1;
   TYPE_FIELDS (type) = (struct field *)
-    obstack_alloc (&objfile->type_obstack, sizeof (struct field));
+    obstack_alloc (&objfile->objfile_obstack, sizeof (struct field));
   TYPE_FIELD_TYPE (type, 0) = hpread_type_lookup (dn_bufp->darray.indextype,
                                                  objfile);
   return type;
@@ -4582,7 +4581,7 @@ hpread_read_subrange_type (dnttpointer hp_type, union dnttentry *dn_bufp,
   TYPE_LENGTH (type) = dn_bufp->dsubr.bitlength / 8;
   TYPE_NFIELDS (type) = 2;
   TYPE_FIELDS (type)
-    = (struct field *) obstack_alloc (&objfile->type_obstack,
+    = (struct field *) obstack_alloc (&objfile->objfile_obstack,
                                      2 * sizeof (struct field));
 
   if (dn_bufp->dsubr.dyn_low)
@@ -4800,7 +4799,7 @@ hpread_type_lookup (dnttpointer hp_type, struct objfile *objfile)
 
        /* Build the correct name.  */
        TYPE_NAME (structtype)
-         = (char *) obstack_alloc (&objfile->type_obstack,
+         = (char *) obstack_alloc (&objfile->objfile_obstack,
                                    strlen (prefix) + strlen (suffix) + 1);
        TYPE_NAME (structtype) = strcpy (TYPE_NAME (structtype), prefix);
        TYPE_NAME (structtype) = strcat (TYPE_NAME (structtype), suffix);
@@ -5095,10 +5094,10 @@ hpread_process_one_debug_symbol (union dnttentry *dn_bufp, char *name,
   char *class_scope_name;
 
   /* Allocate one GDB debug symbol and fill in some default values. */
-  sym = (struct symbol *) obstack_alloc (&objfile->symbol_obstack,
+  sym = (struct symbol *) obstack_alloc (&objfile->objfile_obstack,
                                         sizeof (struct symbol));
   memset (sym, 0, sizeof (struct symbol));
-  DEPRECATED_SYMBOL_NAME (sym) = obsavestring (name, strlen (name), &objfile->symbol_obstack);
+  DEPRECATED_SYMBOL_NAME (sym) = obsavestring (name, strlen (name), &objfile->objfile_obstack);
   SYMBOL_LANGUAGE (sym) = language_auto;
   SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
   SYMBOL_LINE (sym) = 0;
@@ -5301,7 +5300,7 @@ hpread_process_one_debug_symbol (union dnttentry *dn_bufp, char *name,
           * some things broke, so I'm leaving it in here, and
           * working around the issue in stack.c. - RT
           */
-         SYMBOL_INIT_DEMANGLED_NAME (sym, &objfile->symbol_obstack);
+         SYMBOL_INIT_DEMANGLED_NAME (sym, &objfile->objfile_obstack);
          if ((DEPRECATED_SYMBOL_NAME (sym) == VT (objfile) + dn_bufp->dfunc.alias) &&
              (!SYMBOL_CPLUS_DEMANGLED_NAME (sym)))
            {
@@ -5417,7 +5416,7 @@ hpread_process_one_debug_symbol (union dnttentry *dn_bufp, char *name,
           * some things broke, so I'm leaving it in here, and
           * working around the issue in stack.c. - RT 
           */
-         SYMBOL_INIT_DEMANGLED_NAME (sym, &objfile->symbol_obstack);
+         SYMBOL_INIT_DEMANGLED_NAME (sym, &objfile->objfile_obstack);
 
          if ((DEPRECATED_SYMBOL_NAME (sym) == VT (objfile) + dn_bufp->ddocfunc.alias) &&
              (!SYMBOL_CPLUS_DEMANGLED_NAME (sym)))
@@ -5699,10 +5698,8 @@ hpread_process_one_debug_symbol (union dnttentry *dn_bufp, char *name,
       if (dn_bufp->dfparam.copyparam)
        {
          SYMBOL_VALUE (sym) = dn_bufp->dfparam.location;
-#ifdef HPREAD_ADJUST_STACK_ADDRESS
          SYMBOL_VALUE (sym)
-           += HPREAD_ADJUST_STACK_ADDRESS (CURRENT_FUNCTION_VALUE (objfile));
-#endif
+           += hpread_adjust_stack_address (CURRENT_FUNCTION_VALUE (objfile));
        }
       else
        SYMBOL_VALUE (sym) = dn_bufp->dfparam.location;
@@ -5744,7 +5741,7 @@ hpread_process_one_debug_symbol (union dnttentry *dn_bufp, char *name,
          /* Thread-local variable.
           */
          SYMBOL_CLASS (sym) = LOC_HP_THREAD_LOCAL_STATIC;
-         SYMBOL_BASEREG (sym) = CR27_REGNUM;
+         SYMBOL_BASEREG (sym) = HPPA_CR27_REGNUM;
 
          if (objfile->flags & OBJF_SHARED)
            {
@@ -5756,11 +5753,14 @@ hpread_process_one_debug_symbol (union dnttentry *dn_bufp, char *name,
               * to "somsolib.c".  But C lets us point to one.
               */
              struct so_list *so;
+              struct hppa_objfile_private *priv;
 
-             if (objfile->obj_private == NULL)
+              priv = (struct hppa_objfile_private *)
+               objfile_data (objfile, hppa_objfile_priv_data);
+             if (priv == NULL)
                error ("Internal error in reading shared library information.");
 
-             so = ((obj_private_data_t *) (objfile->obj_private))->so_info;
+             so = ((struct hppa_objfile_private *) priv)->so_info;
              if (so == NULL)
                error ("Internal error in reading shared library information.");
 
@@ -5783,10 +5783,8 @@ hpread_process_one_debug_symbol (union dnttentry *dn_bufp, char *name,
        SYMBOL_CLASS (sym) = LOC_LOCAL;
 
       SYMBOL_VALUE (sym) = dn_bufp->ddvar.location;
-#ifdef HPREAD_ADJUST_STACK_ADDRESS
       SYMBOL_VALUE (sym)
-       += HPREAD_ADJUST_STACK_ADDRESS (CURRENT_FUNCTION_VALUE (objfile));
-#endif
+       += hpread_adjust_stack_address (CURRENT_FUNCTION_VALUE (objfile));
       SYMBOL_TYPE (sym) = hpread_type_lookup (dn_bufp->ddvar.type, objfile);
       if (dn_bufp->ddvar.global)
        add_symbol_to_list (sym, &global_symbols);
@@ -5883,7 +5881,7 @@ hpread_process_one_debug_symbol (union dnttentry *dn_bufp, char *name,
          {
            struct symbol *newsym;
 
-           newsym = (struct symbol *) obstack_alloc (&objfile->symbol_obstack,
+           newsym = (struct symbol *) obstack_alloc (&objfile->objfile_obstack,
                                                    sizeof (struct symbol));
            memset (newsym, 0, sizeof (struct symbol));
            DEPRECATED_SYMBOL_NAME (newsym) = name;
@@ -6266,6 +6264,24 @@ hpread_adjust_bitoffsets (struct type *type, int bits)
     TYPE_FIELD_BITPOS (type, i) -= bits;
 }
 
+/* Return the adjustment necessary to make for addresses on the stack
+   as presented by hpread.c.
+
+   This is necessary because of the stack direction on the PA and the
+   bizarre way in which someone (?) decided they wanted to handle
+   frame pointerless code in GDB.  */
+int
+hpread_adjust_stack_address (CORE_ADDR func_addr)
+{
+  struct unwind_table_entry *u;
+
+  u = find_unwind_entry (func_addr);
+  if (!u)
+    return 0;
+  else
+    return u->Total_frame_size << 3;
+}
+
 /* Because of quirks in HP compilers' treatment of anonymous unions inside
    classes, we have to chase through a chain of threaded FIELD entries.
    If we encounter an anonymous union in the chain, we must recursively skip over
@@ -6303,7 +6319,7 @@ hpread_get_next_skip_over_anon_unions (int skip_fields, dnttpointer field,
       /* Do we have another anonymous union? If so, adjust the bitoffsets
          of its members and skip over its members. */
       if ((TYPE_CODE (anon_type) == TYPE_CODE_UNION) &&
-         (!name || STREQ (name, "")))
+         (!name || DEPRECATED_STREQ (name, "")))
        {
          hpread_adjust_bitoffsets (anon_type, bitoffset);
          field = hpread_get_next_skip_over_anon_unions (TYPE_NFIELDS (anon_type), field, fieldp, objfile);
This page took 0.030578 seconds and 4 git commands to generate.