OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.0/] [gdb/] [cp-valprint.c] - Diff between revs 105 and 1765

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 105 Rev 1765
/* Support for printing C++ values for GDB, the GNU debugger.
/* Support for printing C++ values for GDB, the GNU debugger.
   Copyright 1986, 1988, 1989, 1991, 1994-1996, 2000
   Copyright 1986, 1988, 1989, 1991, 1994-1996, 2000
   Free Software Foundation, Inc.
   Free Software Foundation, Inc.
 
 
   This file is part of GDB.
   This file is part of GDB.
 
 
   This program is free software; you can redistribute it and/or modify
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.
   (at your option) any later version.
 
 
   This program is distributed in the hope that it will be useful,
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   GNU General Public License for more details.
 
 
   You should have received a copy of the GNU General Public License
   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place - Suite 330,
   Foundation, Inc., 59 Temple Place - Suite 330,
   Boston, MA 02111-1307, USA.  */
   Boston, MA 02111-1307, USA.  */
 
 
#include "defs.h"
#include "defs.h"
#include "obstack.h"
#include "obstack.h"
#include "symtab.h"
#include "symtab.h"
#include "gdbtypes.h"
#include "gdbtypes.h"
#include "expression.h"
#include "expression.h"
#include "value.h"
#include "value.h"
#include "command.h"
#include "command.h"
#include "gdbcmd.h"
#include "gdbcmd.h"
#include "demangle.h"
#include "demangle.h"
#include "annotate.h"
#include "annotate.h"
#include "gdb_string.h"
#include "gdb_string.h"
#include "c-lang.h"
#include "c-lang.h"
#include "target.h"
#include "target.h"
 
 
/* Indication of presence of HP-compiled object files */
/* Indication of presence of HP-compiled object files */
extern int hp_som_som_object_present;   /* defined in symtab.c */
extern int hp_som_som_object_present;   /* defined in symtab.c */
 
 
 
 
int vtblprint;                  /* Controls printing of vtbl's */
int vtblprint;                  /* Controls printing of vtbl's */
int objectprint;                /* Controls looking up an object's derived type
int objectprint;                /* Controls looking up an object's derived type
                                   using what we find in its vtables.  */
                                   using what we find in its vtables.  */
int static_field_print;         /* Controls printing of static fields. */
int static_field_print;         /* Controls printing of static fields. */
 
 
static struct obstack dont_print_vb_obstack;
static struct obstack dont_print_vb_obstack;
static struct obstack dont_print_statmem_obstack;
static struct obstack dont_print_statmem_obstack;
 
 
extern void _initialize_cp_valprint PARAMS ((void));
extern void _initialize_cp_valprint PARAMS ((void));
 
 
static void cp_print_static_field (struct type *, value_ptr,
static void cp_print_static_field (struct type *, value_ptr,
                                   struct ui_file *, int, int,
                                   struct ui_file *, int, int,
                                   enum val_prettyprint);
                                   enum val_prettyprint);
 
 
static void cp_print_value (struct type *, struct type *, char *, int,
static void cp_print_value (struct type *, struct type *, char *, int,
                            CORE_ADDR, struct ui_file *, int, int,
                            CORE_ADDR, struct ui_file *, int, int,
                            enum val_prettyprint, struct type **);
                            enum val_prettyprint, struct type **);
 
 
static void cp_print_hpacc_virtual_table_entries (struct type *, int *,
static void cp_print_hpacc_virtual_table_entries (struct type *, int *,
                                                  value_ptr,
                                                  value_ptr,
                                                  struct ui_file *, int,
                                                  struct ui_file *, int,
                                                  int,
                                                  int,
                                                  enum val_prettyprint);
                                                  enum val_prettyprint);
 
 
 
 
void
void
cp_print_class_method (valaddr, type, stream)
cp_print_class_method (valaddr, type, stream)
     char *valaddr;
     char *valaddr;
     struct type *type;
     struct type *type;
     struct ui_file *stream;
     struct ui_file *stream;
{
{
  struct type *domain;
  struct type *domain;
  struct fn_field *f = NULL;
  struct fn_field *f = NULL;
  int j = 0;
  int j = 0;
  int len2;
  int len2;
  int offset;
  int offset;
  char *kind = "";
  char *kind = "";
  CORE_ADDR addr;
  CORE_ADDR addr;
  struct symbol *sym;
  struct symbol *sym;
  unsigned len;
  unsigned len;
  unsigned int i;
  unsigned int i;
  struct type *target_type = check_typedef (TYPE_TARGET_TYPE (type));
  struct type *target_type = check_typedef (TYPE_TARGET_TYPE (type));
 
 
  domain = TYPE_DOMAIN_TYPE (target_type);
  domain = TYPE_DOMAIN_TYPE (target_type);
  if (domain == (struct type *) NULL)
  if (domain == (struct type *) NULL)
    {
    {
      fprintf_filtered (stream, "<unknown>");
      fprintf_filtered (stream, "<unknown>");
      return;
      return;
    }
    }
  addr = unpack_pointer (lookup_pointer_type (builtin_type_void), valaddr);
  addr = unpack_pointer (lookup_pointer_type (builtin_type_void), valaddr);
  if (METHOD_PTR_IS_VIRTUAL (addr))
  if (METHOD_PTR_IS_VIRTUAL (addr))
    {
    {
      offset = METHOD_PTR_TO_VOFFSET (addr);
      offset = METHOD_PTR_TO_VOFFSET (addr);
      len = TYPE_NFN_FIELDS (domain);
      len = TYPE_NFN_FIELDS (domain);
      for (i = 0; i < len; i++)
      for (i = 0; i < len; i++)
        {
        {
          f = TYPE_FN_FIELDLIST1 (domain, i);
          f = TYPE_FN_FIELDLIST1 (domain, i);
          len2 = TYPE_FN_FIELDLIST_LENGTH (domain, i);
          len2 = TYPE_FN_FIELDLIST_LENGTH (domain, i);
 
 
          for (j = 0; j < len2; j++)
          for (j = 0; j < len2; j++)
            {
            {
              QUIT;
              QUIT;
              if (TYPE_FN_FIELD_VOFFSET (f, j) == offset)
              if (TYPE_FN_FIELD_VOFFSET (f, j) == offset)
                {
                {
                  if (TYPE_FN_FIELD_STUB (f, j))
                  if (TYPE_FN_FIELD_STUB (f, j))
                    check_stub_method (domain, i, j);
                    check_stub_method (domain, i, j);
                  kind = "virtual ";
                  kind = "virtual ";
                  goto common;
                  goto common;
                }
                }
            }
            }
        }
        }
    }
    }
  else
  else
    {
    {
      sym = find_pc_function (addr);
      sym = find_pc_function (addr);
      if (sym == 0)
      if (sym == 0)
        {
        {
          /* 1997-08-01 Currently unsupported with HP aCC */
          /* 1997-08-01 Currently unsupported with HP aCC */
          if (hp_som_som_object_present)
          if (hp_som_som_object_present)
            {
            {
              fputs_filtered ("?? <not supported with HP aCC>", stream);
              fputs_filtered ("?? <not supported with HP aCC>", stream);
              return;
              return;
            }
            }
          error ("invalid pointer to member function");
          error ("invalid pointer to member function");
        }
        }
      len = TYPE_NFN_FIELDS (domain);
      len = TYPE_NFN_FIELDS (domain);
      for (i = 0; i < len; i++)
      for (i = 0; i < len; i++)
        {
        {
          f = TYPE_FN_FIELDLIST1 (domain, i);
          f = TYPE_FN_FIELDLIST1 (domain, i);
          len2 = TYPE_FN_FIELDLIST_LENGTH (domain, i);
          len2 = TYPE_FN_FIELDLIST_LENGTH (domain, i);
 
 
          for (j = 0; j < len2; j++)
          for (j = 0; j < len2; j++)
            {
            {
              QUIT;
              QUIT;
              if (TYPE_FN_FIELD_STUB (f, j))
              if (TYPE_FN_FIELD_STUB (f, j))
                check_stub_method (domain, i, j);
                check_stub_method (domain, i, j);
              if (STREQ (SYMBOL_NAME (sym), TYPE_FN_FIELD_PHYSNAME (f, j)))
              if (STREQ (SYMBOL_NAME (sym), TYPE_FN_FIELD_PHYSNAME (f, j)))
                {
                {
                  goto common;
                  goto common;
                }
                }
            }
            }
        }
        }
    }
    }
common:
common:
  if (i < len)
  if (i < len)
    {
    {
      char *demangled_name;
      char *demangled_name;
 
 
      fprintf_filtered (stream, "&");
      fprintf_filtered (stream, "&");
      fprintf_filtered (stream, kind);
      fprintf_filtered (stream, kind);
      demangled_name = cplus_demangle (TYPE_FN_FIELD_PHYSNAME (f, j),
      demangled_name = cplus_demangle (TYPE_FN_FIELD_PHYSNAME (f, j),
                                       DMGL_ANSI | DMGL_PARAMS);
                                       DMGL_ANSI | DMGL_PARAMS);
      if (demangled_name == NULL)
      if (demangled_name == NULL)
        fprintf_filtered (stream, "<badly mangled name %s>",
        fprintf_filtered (stream, "<badly mangled name %s>",
                          TYPE_FN_FIELD_PHYSNAME (f, j));
                          TYPE_FN_FIELD_PHYSNAME (f, j));
      else
      else
        {
        {
          fputs_filtered (demangled_name, stream);
          fputs_filtered (demangled_name, stream);
          free (demangled_name);
          free (demangled_name);
        }
        }
    }
    }
  else
  else
    {
    {
      fprintf_filtered (stream, "(");
      fprintf_filtered (stream, "(");
      type_print (type, "", stream, -1);
      type_print (type, "", stream, -1);
      fprintf_filtered (stream, ") %d", (int) addr >> 3);
      fprintf_filtered (stream, ") %d", (int) addr >> 3);
    }
    }
}
}
 
 
/* This was what it was for gcc 2.4.5 and earlier.  */
/* This was what it was for gcc 2.4.5 and earlier.  */
static const char vtbl_ptr_name_old[] =
static const char vtbl_ptr_name_old[] =
{CPLUS_MARKER, 'v', 't', 'b', 'l', '_', 'p', 't', 'r', '_', 't', 'y', 'p', 'e', 0};
{CPLUS_MARKER, 'v', 't', 'b', 'l', '_', 'p', 't', 'r', '_', 't', 'y', 'p', 'e', 0};
/* It was changed to this after 2.4.5.  */
/* It was changed to this after 2.4.5.  */
const char vtbl_ptr_name[] =
const char vtbl_ptr_name[] =
{'_', '_', 'v', 't', 'b', 'l', '_', 'p', 't', 'r', '_', 't', 'y', 'p', 'e', 0};
{'_', '_', 'v', 't', 'b', 'l', '_', 'p', 't', 'r', '_', 't', 'y', 'p', 'e', 0};
 
 
/* HP aCC uses different names */
/* HP aCC uses different names */
const char hpacc_vtbl_ptr_name[] =
const char hpacc_vtbl_ptr_name[] =
{'_', '_', 'v', 'f', 'p', 0};
{'_', '_', 'v', 'f', 'p', 0};
const char hpacc_vtbl_ptr_type_name[] =
const char hpacc_vtbl_ptr_type_name[] =
{'_', '_', 'v', 'f', 't', 'y', 'p', 0};
{'_', '_', 'v', 'f', 't', 'y', 'p', 0};
 
 
 
 
/* Return truth value for assertion that TYPE is of the type
/* Return truth value for assertion that TYPE is of the type
   "pointer to virtual function".  */
   "pointer to virtual function".  */
 
 
int
int
cp_is_vtbl_ptr_type (type)
cp_is_vtbl_ptr_type (type)
     struct type *type;
     struct type *type;
{
{
  char *typename = type_name_no_tag (type);
  char *typename = type_name_no_tag (type);
 
 
  return (typename != NULL
  return (typename != NULL
          && (STREQ (typename, vtbl_ptr_name)
          && (STREQ (typename, vtbl_ptr_name)
              || STREQ (typename, vtbl_ptr_name_old)));
              || STREQ (typename, vtbl_ptr_name_old)));
}
}
 
 
/* Return truth value for the assertion that TYPE is of the type
/* Return truth value for the assertion that TYPE is of the type
   "pointer to virtual function table".  */
   "pointer to virtual function table".  */
 
 
int
int
cp_is_vtbl_member (type)
cp_is_vtbl_member (type)
     struct type *type;
     struct type *type;
{
{
  if (TYPE_CODE (type) == TYPE_CODE_PTR)
  if (TYPE_CODE (type) == TYPE_CODE_PTR)
    {
    {
      type = TYPE_TARGET_TYPE (type);
      type = TYPE_TARGET_TYPE (type);
      if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
      if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
        {
        {
          type = TYPE_TARGET_TYPE (type);
          type = TYPE_TARGET_TYPE (type);
          if (TYPE_CODE (type) == TYPE_CODE_STRUCT      /* if not using thunks */
          if (TYPE_CODE (type) == TYPE_CODE_STRUCT      /* if not using thunks */
              || TYPE_CODE (type) == TYPE_CODE_PTR)     /* if using thunks */
              || TYPE_CODE (type) == TYPE_CODE_PTR)     /* if using thunks */
            {
            {
              /* Virtual functions tables are full of pointers
              /* Virtual functions tables are full of pointers
                 to virtual functions. */
                 to virtual functions. */
              return cp_is_vtbl_ptr_type (type);
              return cp_is_vtbl_ptr_type (type);
            }
            }
        }
        }
    }
    }
  return 0;
  return 0;
}
}
 
 
/* Mutually recursive subroutines of cp_print_value and c_val_print to
/* Mutually recursive subroutines of cp_print_value and c_val_print to
   print out a structure's fields: cp_print_value_fields and cp_print_value.
   print out a structure's fields: cp_print_value_fields and cp_print_value.
 
 
   TYPE, VALADDR, ADDRESS, STREAM, RECURSE, and PRETTY have the
   TYPE, VALADDR, ADDRESS, STREAM, RECURSE, and PRETTY have the
   same meanings as in cp_print_value and c_val_print.
   same meanings as in cp_print_value and c_val_print.
 
 
   2nd argument REAL_TYPE is used to carry over the type of the derived
   2nd argument REAL_TYPE is used to carry over the type of the derived
   class across the recursion to base classes.
   class across the recursion to base classes.
 
 
   DONT_PRINT is an array of baseclass types that we
   DONT_PRINT is an array of baseclass types that we
   should not print, or zero if called from top level.  */
   should not print, or zero if called from top level.  */
 
 
void
void
cp_print_value_fields (type, real_type, valaddr, offset, address, stream, format, recurse, pretty,
cp_print_value_fields (type, real_type, valaddr, offset, address, stream, format, recurse, pretty,
                       dont_print_vb, dont_print_statmem)
                       dont_print_vb, dont_print_statmem)
     struct type *type;
     struct type *type;
     struct type *real_type;
     struct type *real_type;
     char *valaddr;
     char *valaddr;
     int offset;
     int offset;
     CORE_ADDR address;
     CORE_ADDR address;
     struct ui_file *stream;
     struct ui_file *stream;
     int format;
     int format;
     int recurse;
     int recurse;
     enum val_prettyprint pretty;
     enum val_prettyprint pretty;
     struct type **dont_print_vb;
     struct type **dont_print_vb;
     int dont_print_statmem;
     int dont_print_statmem;
{
{
  int i, len, n_baseclasses;
  int i, len, n_baseclasses;
  struct obstack tmp_obstack;
  struct obstack tmp_obstack;
  char *last_dont_print = obstack_next_free (&dont_print_statmem_obstack);
  char *last_dont_print = obstack_next_free (&dont_print_statmem_obstack);
  int fields_seen = 0;
  int fields_seen = 0;
 
 
  CHECK_TYPEDEF (type);
  CHECK_TYPEDEF (type);
 
 
  fprintf_filtered (stream, "{");
  fprintf_filtered (stream, "{");
  len = TYPE_NFIELDS (type);
  len = TYPE_NFIELDS (type);
  n_baseclasses = TYPE_N_BASECLASSES (type);
  n_baseclasses = TYPE_N_BASECLASSES (type);
 
 
  /* First, print out baseclasses such that we don't print
  /* First, print out baseclasses such that we don't print
     duplicates of virtual baseclasses.  */
     duplicates of virtual baseclasses.  */
 
 
  if (n_baseclasses > 0)
  if (n_baseclasses > 0)
    cp_print_value (type, real_type, valaddr, offset, address, stream,
    cp_print_value (type, real_type, valaddr, offset, address, stream,
                    format, recurse + 1, pretty, dont_print_vb);
                    format, recurse + 1, pretty, dont_print_vb);
 
 
  /* Second, print out data fields */
  /* Second, print out data fields */
 
 
  /* If there are no data fields, or if the only field is the
  /* If there are no data fields, or if the only field is the
   * vtbl pointer, skip this part */
   * vtbl pointer, skip this part */
  if ((len == n_baseclasses) ||
  if ((len == n_baseclasses) ||
      ((len - n_baseclasses == 1) &&
      ((len - n_baseclasses == 1) &&
       TYPE_HAS_VTABLE (type) &&
       TYPE_HAS_VTABLE (type) &&
  STREQN (TYPE_FIELD_NAME (type, n_baseclasses), hpacc_vtbl_ptr_name, 5)) ||
  STREQN (TYPE_FIELD_NAME (type, n_baseclasses), hpacc_vtbl_ptr_name, 5)) ||
      !len)
      !len)
    fprintf_filtered (stream, "<No data fields>");
    fprintf_filtered (stream, "<No data fields>");
  else
  else
    {
    {
      extern int inspect_it;
      extern int inspect_it;
 
 
      if (dont_print_statmem == 0)
      if (dont_print_statmem == 0)
        {
        {
          /* If we're at top level, carve out a completely fresh
          /* If we're at top level, carve out a completely fresh
             chunk of the obstack and use that until this particular
             chunk of the obstack and use that until this particular
             invocation returns.  */
             invocation returns.  */
          tmp_obstack = dont_print_statmem_obstack;
          tmp_obstack = dont_print_statmem_obstack;
          obstack_finish (&dont_print_statmem_obstack);
          obstack_finish (&dont_print_statmem_obstack);
        }
        }
 
 
      for (i = n_baseclasses; i < len; i++)
      for (i = n_baseclasses; i < len; i++)
        {
        {
          /* If requested, skip printing of static fields.  */
          /* If requested, skip printing of static fields.  */
          if (!static_field_print && TYPE_FIELD_STATIC (type, i))
          if (!static_field_print && TYPE_FIELD_STATIC (type, i))
            continue;
            continue;
 
 
          /* If a vtable pointer appears, we'll print it out later */
          /* If a vtable pointer appears, we'll print it out later */
          if (TYPE_HAS_VTABLE (type) && STREQN (TYPE_FIELD_NAME (type, i), hpacc_vtbl_ptr_name, 5))
          if (TYPE_HAS_VTABLE (type) && STREQN (TYPE_FIELD_NAME (type, i), hpacc_vtbl_ptr_name, 5))
            continue;
            continue;
 
 
          if (fields_seen)
          if (fields_seen)
            fprintf_filtered (stream, ", ");
            fprintf_filtered (stream, ", ");
          else if (n_baseclasses > 0)
          else if (n_baseclasses > 0)
            {
            {
              if (pretty)
              if (pretty)
                {
                {
                  fprintf_filtered (stream, "\n");
                  fprintf_filtered (stream, "\n");
                  print_spaces_filtered (2 + 2 * recurse, stream);
                  print_spaces_filtered (2 + 2 * recurse, stream);
                  fputs_filtered ("members of ", stream);
                  fputs_filtered ("members of ", stream);
                  fputs_filtered (type_name_no_tag (type), stream);
                  fputs_filtered (type_name_no_tag (type), stream);
                  fputs_filtered (": ", stream);
                  fputs_filtered (": ", stream);
                }
                }
            }
            }
          fields_seen = 1;
          fields_seen = 1;
 
 
          if (pretty)
          if (pretty)
            {
            {
              fprintf_filtered (stream, "\n");
              fprintf_filtered (stream, "\n");
              print_spaces_filtered (2 + 2 * recurse, stream);
              print_spaces_filtered (2 + 2 * recurse, stream);
            }
            }
          else
          else
            {
            {
              wrap_here (n_spaces (2 + 2 * recurse));
              wrap_here (n_spaces (2 + 2 * recurse));
            }
            }
          if (inspect_it)
          if (inspect_it)
            {
            {
              if (TYPE_CODE (TYPE_FIELD_TYPE (type, i)) == TYPE_CODE_PTR)
              if (TYPE_CODE (TYPE_FIELD_TYPE (type, i)) == TYPE_CODE_PTR)
                fputs_filtered ("\"( ptr \"", stream);
                fputs_filtered ("\"( ptr \"", stream);
              else
              else
                fputs_filtered ("\"( nodef \"", stream);
                fputs_filtered ("\"( nodef \"", stream);
              if (TYPE_FIELD_STATIC (type, i))
              if (TYPE_FIELD_STATIC (type, i))
                fputs_filtered ("static ", stream);
                fputs_filtered ("static ", stream);
              fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
              fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
                                       language_cplus,
                                       language_cplus,
                                       DMGL_PARAMS | DMGL_ANSI);
                                       DMGL_PARAMS | DMGL_ANSI);
              fputs_filtered ("\" \"", stream);
              fputs_filtered ("\" \"", stream);
              fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
              fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
                                       language_cplus,
                                       language_cplus,
                                       DMGL_PARAMS | DMGL_ANSI);
                                       DMGL_PARAMS | DMGL_ANSI);
              fputs_filtered ("\") \"", stream);
              fputs_filtered ("\") \"", stream);
            }
            }
          else
          else
            {
            {
              annotate_field_begin (TYPE_FIELD_TYPE (type, i));
              annotate_field_begin (TYPE_FIELD_TYPE (type, i));
 
 
              if (TYPE_FIELD_STATIC (type, i))
              if (TYPE_FIELD_STATIC (type, i))
                fputs_filtered ("static ", stream);
                fputs_filtered ("static ", stream);
              fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
              fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
                                       language_cplus,
                                       language_cplus,
                                       DMGL_PARAMS | DMGL_ANSI);
                                       DMGL_PARAMS | DMGL_ANSI);
              annotate_field_name_end ();
              annotate_field_name_end ();
              /* do not print leading '=' in case of anonymous unions */
              /* do not print leading '=' in case of anonymous unions */
              if (strcmp (TYPE_FIELD_NAME (type, i), ""))
              if (strcmp (TYPE_FIELD_NAME (type, i), ""))
                fputs_filtered (" = ", stream);
                fputs_filtered (" = ", stream);
              annotate_field_value ();
              annotate_field_value ();
            }
            }
 
 
          if (!TYPE_FIELD_STATIC (type, i) && TYPE_FIELD_PACKED (type, i))
          if (!TYPE_FIELD_STATIC (type, i) && TYPE_FIELD_PACKED (type, i))
            {
            {
              value_ptr v;
              value_ptr v;
 
 
              /* Bitfields require special handling, especially due to byte
              /* Bitfields require special handling, especially due to byte
                 order problems.  */
                 order problems.  */
              if (TYPE_FIELD_IGNORE (type, i))
              if (TYPE_FIELD_IGNORE (type, i))
                {
                {
                  fputs_filtered ("<optimized out or zero length>", stream);
                  fputs_filtered ("<optimized out or zero length>", stream);
                }
                }
              else
              else
                {
                {
                  v = value_from_longest (TYPE_FIELD_TYPE (type, i),
                  v = value_from_longest (TYPE_FIELD_TYPE (type, i),
                          unpack_field_as_long (type, valaddr + offset, i));
                          unpack_field_as_long (type, valaddr + offset, i));
 
 
                  val_print (TYPE_FIELD_TYPE (type, i), VALUE_CONTENTS (v), 0, 0,
                  val_print (TYPE_FIELD_TYPE (type, i), VALUE_CONTENTS (v), 0, 0,
                             stream, format, 0, recurse + 1, pretty);
                             stream, format, 0, recurse + 1, pretty);
                }
                }
            }
            }
          else
          else
            {
            {
              if (TYPE_FIELD_IGNORE (type, i))
              if (TYPE_FIELD_IGNORE (type, i))
                {
                {
                  fputs_filtered ("<optimized out or zero length>", stream);
                  fputs_filtered ("<optimized out or zero length>", stream);
                }
                }
              else if (TYPE_FIELD_STATIC (type, i))
              else if (TYPE_FIELD_STATIC (type, i))
                {
                {
                  value_ptr v = value_static_field (type, i);
                  value_ptr v = value_static_field (type, i);
                  if (v == NULL)
                  if (v == NULL)
                    fputs_filtered ("<optimized out>", stream);
                    fputs_filtered ("<optimized out>", stream);
                  else
                  else
                    cp_print_static_field (TYPE_FIELD_TYPE (type, i), v,
                    cp_print_static_field (TYPE_FIELD_TYPE (type, i), v,
                                           stream, format, recurse + 1,
                                           stream, format, recurse + 1,
                                           pretty);
                                           pretty);
                }
                }
              else
              else
                {
                {
                  val_print (TYPE_FIELD_TYPE (type, i),
                  val_print (TYPE_FIELD_TYPE (type, i),
                          valaddr, offset + TYPE_FIELD_BITPOS (type, i) / 8,
                          valaddr, offset + TYPE_FIELD_BITPOS (type, i) / 8,
                             address + TYPE_FIELD_BITPOS (type, i) / 8,
                             address + TYPE_FIELD_BITPOS (type, i) / 8,
                             stream, format, 0, recurse + 1, pretty);
                             stream, format, 0, recurse + 1, pretty);
                }
                }
            }
            }
          annotate_field_end ();
          annotate_field_end ();
        }
        }
 
 
      if (dont_print_statmem == 0)
      if (dont_print_statmem == 0)
        {
        {
          /* Free the space used to deal with the printing
          /* Free the space used to deal with the printing
             of the members from top level.  */
             of the members from top level.  */
          obstack_free (&dont_print_statmem_obstack, last_dont_print);
          obstack_free (&dont_print_statmem_obstack, last_dont_print);
          dont_print_statmem_obstack = tmp_obstack;
          dont_print_statmem_obstack = tmp_obstack;
        }
        }
 
 
      if (pretty)
      if (pretty)
        {
        {
          fprintf_filtered (stream, "\n");
          fprintf_filtered (stream, "\n");
          print_spaces_filtered (2 * recurse, stream);
          print_spaces_filtered (2 * recurse, stream);
        }
        }
    }                           /* if there are data fields */
    }                           /* if there are data fields */
  /* Now print out the virtual table pointer if there is one */
  /* Now print out the virtual table pointer if there is one */
  if (TYPE_HAS_VTABLE (type) && STREQN (TYPE_FIELD_NAME (type, n_baseclasses), hpacc_vtbl_ptr_name, 5))
  if (TYPE_HAS_VTABLE (type) && STREQN (TYPE_FIELD_NAME (type, n_baseclasses), hpacc_vtbl_ptr_name, 5))
    {
    {
      value_ptr v;
      value_ptr v;
      /* First get the virtual table pointer and print it out */
      /* First get the virtual table pointer and print it out */
 
 
#if 0
#if 0
      fputs_filtered ("__vfp = ", stream);
      fputs_filtered ("__vfp = ", stream);
#endif
#endif
 
 
      fputs_filtered (", Virtual table at ", stream);
      fputs_filtered (", Virtual table at ", stream);
 
 
      /* pai: FIXME 32x64 problem? */
      /* pai: FIXME 32x64 problem? */
      /* Not sure what the best notation is in the case where there is no
      /* Not sure what the best notation is in the case where there is no
         baseclass name.  */
         baseclass name.  */
      v = value_from_longest (lookup_pointer_type (builtin_type_unsigned_long),
      v = value_from_longest (lookup_pointer_type (builtin_type_unsigned_long),
                              *(unsigned long *) (valaddr + offset));
                              *(unsigned long *) (valaddr + offset));
 
 
      val_print (VALUE_TYPE (v), VALUE_CONTENTS (v), 0, 0,
      val_print (VALUE_TYPE (v), VALUE_CONTENTS (v), 0, 0,
                 stream, format, 0, recurse + 1, pretty);
                 stream, format, 0, recurse + 1, pretty);
      fields_seen = 1;
      fields_seen = 1;
 
 
      if (vtblprint)
      if (vtblprint)
        {
        {
          /* Print out function pointers in vtable. */
          /* Print out function pointers in vtable. */
 
 
          /* FIXME: then-clause is for non-RRBC layout of virtual
          /* FIXME: then-clause is for non-RRBC layout of virtual
           * table.  The RRBC case in the else-clause is yet to be
           * table.  The RRBC case in the else-clause is yet to be
           * implemented.  The if (1) below should be changed to a
           * implemented.  The if (1) below should be changed to a
           * test for whether the executable we have was compiled
           * test for whether the executable we have was compiled
           * with a version of HP aCC that doesn't have RRBC
           * with a version of HP aCC that doesn't have RRBC
           * support. */
           * support. */
 
 
          if (1)
          if (1)
            {
            {
              /* no RRBC support; function pointers embedded directly in vtable */
              /* no RRBC support; function pointers embedded directly in vtable */
 
 
              int vfuncs = count_virtual_fns (real_type);
              int vfuncs = count_virtual_fns (real_type);
 
 
              fputs_filtered (" {", stream);
              fputs_filtered (" {", stream);
 
 
              /* FIXME : doesn't work at present */
              /* FIXME : doesn't work at present */
#if 0
#if 0
              fprintf_filtered (stream, "%d entr%s: ", vfuncs, vfuncs == 1 ? "y" : "ies");
              fprintf_filtered (stream, "%d entr%s: ", vfuncs, vfuncs == 1 ? "y" : "ies");
#else
#else
              fputs_filtered ("not implemented", stream);
              fputs_filtered ("not implemented", stream);
 
 
 
 
#endif
#endif
 
 
              /* recursive function that prints all virtual function entries */
              /* recursive function that prints all virtual function entries */
#if 0
#if 0
              cp_print_hpacc_virtual_table_entries (real_type, &vfuncs, v, stream, format, recurse, pretty);
              cp_print_hpacc_virtual_table_entries (real_type, &vfuncs, v, stream, format, recurse, pretty);
#endif
#endif
              fputs_filtered ("}", stream);
              fputs_filtered ("}", stream);
            }                   /* non-RRBC case */
            }                   /* non-RRBC case */
          else
          else
            {
            {
              /* FIXME -- seem comments above */
              /* FIXME -- seem comments above */
              /* RRBC support present; function pointers are found
              /* RRBC support present; function pointers are found
               * by indirection through the class segment entries. */
               * by indirection through the class segment entries. */
 
 
 
 
            }                   /* RRBC case */
            }                   /* RRBC case */
        }                       /* if vtblprint */
        }                       /* if vtblprint */
 
 
      if (pretty)
      if (pretty)
        {
        {
          fprintf_filtered (stream, "\n");
          fprintf_filtered (stream, "\n");
          print_spaces_filtered (2 * recurse, stream);
          print_spaces_filtered (2 * recurse, stream);
        }
        }
 
 
    }                           /* if vtable exists */
    }                           /* if vtable exists */
 
 
  fprintf_filtered (stream, "}");
  fprintf_filtered (stream, "}");
}
}
 
 
/* Special val_print routine to avoid printing multiple copies of virtual
/* Special val_print routine to avoid printing multiple copies of virtual
   baseclasses.  */
   baseclasses.  */
 
 
static void
static void
cp_print_value (type, real_type, valaddr, offset, address, stream, format, recurse, pretty,
cp_print_value (type, real_type, valaddr, offset, address, stream, format, recurse, pretty,
                dont_print_vb)
                dont_print_vb)
     struct type *type;
     struct type *type;
     struct type *real_type;
     struct type *real_type;
     char *valaddr;
     char *valaddr;
     int offset;
     int offset;
     CORE_ADDR address;
     CORE_ADDR address;
     struct ui_file *stream;
     struct ui_file *stream;
     int format;
     int format;
     int recurse;
     int recurse;
     enum val_prettyprint pretty;
     enum val_prettyprint pretty;
     struct type **dont_print_vb;
     struct type **dont_print_vb;
{
{
  struct obstack tmp_obstack;
  struct obstack tmp_obstack;
  struct type **last_dont_print
  struct type **last_dont_print
  = (struct type **) obstack_next_free (&dont_print_vb_obstack);
  = (struct type **) obstack_next_free (&dont_print_vb_obstack);
  int i, n_baseclasses = TYPE_N_BASECLASSES (type);
  int i, n_baseclasses = TYPE_N_BASECLASSES (type);
 
 
  if (dont_print_vb == 0)
  if (dont_print_vb == 0)
    {
    {
      /* If we're at top level, carve out a completely fresh
      /* If we're at top level, carve out a completely fresh
         chunk of the obstack and use that until this particular
         chunk of the obstack and use that until this particular
         invocation returns.  */
         invocation returns.  */
      tmp_obstack = dont_print_vb_obstack;
      tmp_obstack = dont_print_vb_obstack;
      /* Bump up the high-water mark.  Now alpha is omega.  */
      /* Bump up the high-water mark.  Now alpha is omega.  */
      obstack_finish (&dont_print_vb_obstack);
      obstack_finish (&dont_print_vb_obstack);
    }
    }
 
 
  for (i = 0; i < n_baseclasses; i++)
  for (i = 0; i < n_baseclasses; i++)
    {
    {
      int boffset;
      int boffset;
      int skip;
      int skip;
      struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i));
      struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i));
      char *basename = TYPE_NAME (baseclass);
      char *basename = TYPE_NAME (baseclass);
      char *base_valaddr;
      char *base_valaddr;
 
 
      if (BASETYPE_VIA_VIRTUAL (type, i))
      if (BASETYPE_VIA_VIRTUAL (type, i))
        {
        {
          struct type **first_dont_print
          struct type **first_dont_print
          = (struct type **) obstack_base (&dont_print_vb_obstack);
          = (struct type **) obstack_base (&dont_print_vb_obstack);
 
 
          int j = (struct type **) obstack_next_free (&dont_print_vb_obstack)
          int j = (struct type **) obstack_next_free (&dont_print_vb_obstack)
          - first_dont_print;
          - first_dont_print;
 
 
          while (--j >= 0)
          while (--j >= 0)
            if (baseclass == first_dont_print[j])
            if (baseclass == first_dont_print[j])
              goto flush_it;
              goto flush_it;
 
 
          obstack_ptr_grow (&dont_print_vb_obstack, baseclass);
          obstack_ptr_grow (&dont_print_vb_obstack, baseclass);
        }
        }
 
 
      if (TYPE_HAS_VTABLE (type) && BASETYPE_VIA_VIRTUAL (type, i))
      if (TYPE_HAS_VTABLE (type) && BASETYPE_VIA_VIRTUAL (type, i))
        {
        {
          /* Assume HP/Taligent runtime convention */
          /* Assume HP/Taligent runtime convention */
          find_rt_vbase_offset (type, TYPE_BASECLASS (type, i),
          find_rt_vbase_offset (type, TYPE_BASECLASS (type, i),
                                valaddr, offset, &boffset, &skip);
                                valaddr, offset, &boffset, &skip);
          if (skip >= 0)
          if (skip >= 0)
            error ("Virtual base class offset not found from vtable while printing");
            error ("Virtual base class offset not found from vtable while printing");
          base_valaddr = valaddr;
          base_valaddr = valaddr;
        }
        }
      else
      else
        {
        {
          boffset = baseclass_offset (type, i, valaddr + offset, address + offset);
          boffset = baseclass_offset (type, i, valaddr + offset, address + offset);
          skip = ((boffset == -1) || (boffset + offset) < 0) ? 1 : -1;
          skip = ((boffset == -1) || (boffset + offset) < 0) ? 1 : -1;
 
 
          if (BASETYPE_VIA_VIRTUAL (type, i))
          if (BASETYPE_VIA_VIRTUAL (type, i))
            {
            {
              /* The virtual base class pointer might have been clobbered by the
              /* The virtual base class pointer might have been clobbered by the
                 user program. Make sure that it still points to a valid memory
                 user program. Make sure that it still points to a valid memory
                 location.  */
                 location.  */
 
 
              if (boffset != -1 && ((boffset + offset) < 0 || (boffset + offset) >= TYPE_LENGTH (type)))
              if (boffset != -1 && ((boffset + offset) < 0 || (boffset + offset) >= TYPE_LENGTH (type)))
                {
                {
                  base_valaddr = (char *) alloca (TYPE_LENGTH (baseclass));
                  base_valaddr = (char *) alloca (TYPE_LENGTH (baseclass));
                  if (target_read_memory (address + boffset, base_valaddr,
                  if (target_read_memory (address + boffset, base_valaddr,
                                          TYPE_LENGTH (baseclass)) != 0)
                                          TYPE_LENGTH (baseclass)) != 0)
                    skip = 1;
                    skip = 1;
                }
                }
              else
              else
                base_valaddr = valaddr;
                base_valaddr = valaddr;
            }
            }
          else
          else
            base_valaddr = valaddr;
            base_valaddr = valaddr;
        }
        }
 
 
      /* now do the printing */
      /* now do the printing */
      if (pretty)
      if (pretty)
        {
        {
          fprintf_filtered (stream, "\n");
          fprintf_filtered (stream, "\n");
          print_spaces_filtered (2 * recurse, stream);
          print_spaces_filtered (2 * recurse, stream);
        }
        }
      fputs_filtered ("<", stream);
      fputs_filtered ("<", stream);
      /* Not sure what the best notation is in the case where there is no
      /* Not sure what the best notation is in the case where there is no
         baseclass name.  */
         baseclass name.  */
      fputs_filtered (basename ? basename : "", stream);
      fputs_filtered (basename ? basename : "", stream);
      fputs_filtered ("> = ", stream);
      fputs_filtered ("> = ", stream);
 
 
 
 
      if (skip >= 1)
      if (skip >= 1)
        fprintf_filtered (stream, "<invalid address>");
        fprintf_filtered (stream, "<invalid address>");
      else
      else
        cp_print_value_fields (baseclass, real_type, base_valaddr, offset + boffset, address,
        cp_print_value_fields (baseclass, real_type, base_valaddr, offset + boffset, address,
                               stream, format, recurse, pretty,
                               stream, format, recurse, pretty,
                     (struct type **) obstack_base (&dont_print_vb_obstack),
                     (struct type **) obstack_base (&dont_print_vb_obstack),
                               0);
                               0);
      fputs_filtered (", ", stream);
      fputs_filtered (", ", stream);
 
 
    flush_it:
    flush_it:
      ;
      ;
    }
    }
 
 
  if (dont_print_vb == 0)
  if (dont_print_vb == 0)
    {
    {
      /* Free the space used to deal with the printing
      /* Free the space used to deal with the printing
         of this type from top level.  */
         of this type from top level.  */
      obstack_free (&dont_print_vb_obstack, last_dont_print);
      obstack_free (&dont_print_vb_obstack, last_dont_print);
      /* Reset watermark so that we can continue protecting
      /* Reset watermark so that we can continue protecting
         ourselves from whatever we were protecting ourselves.  */
         ourselves from whatever we were protecting ourselves.  */
      dont_print_vb_obstack = tmp_obstack;
      dont_print_vb_obstack = tmp_obstack;
    }
    }
}
}
 
 
/* Print value of a static member.
/* Print value of a static member.
   To avoid infinite recursion when printing a class that contains
   To avoid infinite recursion when printing a class that contains
   a static instance of the class, we keep the addresses of all printed
   a static instance of the class, we keep the addresses of all printed
   static member classes in an obstack and refuse to print them more
   static member classes in an obstack and refuse to print them more
   than once.
   than once.
 
 
   VAL contains the value to print, TYPE, STREAM, RECURSE, and PRETTY
   VAL contains the value to print, TYPE, STREAM, RECURSE, and PRETTY
   have the same meanings as in c_val_print.  */
   have the same meanings as in c_val_print.  */
 
 
static void
static void
cp_print_static_field (type, val, stream, format, recurse, pretty)
cp_print_static_field (type, val, stream, format, recurse, pretty)
     struct type *type;
     struct type *type;
     value_ptr val;
     value_ptr val;
     struct ui_file *stream;
     struct ui_file *stream;
     int format;
     int format;
     int recurse;
     int recurse;
     enum val_prettyprint pretty;
     enum val_prettyprint pretty;
{
{
  if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
  if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
    {
    {
      CORE_ADDR *first_dont_print;
      CORE_ADDR *first_dont_print;
      int i;
      int i;
 
 
      first_dont_print
      first_dont_print
        = (CORE_ADDR *) obstack_base (&dont_print_statmem_obstack);
        = (CORE_ADDR *) obstack_base (&dont_print_statmem_obstack);
      i = (CORE_ADDR *) obstack_next_free (&dont_print_statmem_obstack)
      i = (CORE_ADDR *) obstack_next_free (&dont_print_statmem_obstack)
        - first_dont_print;
        - first_dont_print;
 
 
      while (--i >= 0)
      while (--i >= 0)
        {
        {
          if (VALUE_ADDRESS (val) == first_dont_print[i])
          if (VALUE_ADDRESS (val) == first_dont_print[i])
            {
            {
              fputs_filtered ("<same as static member of an already seen type>",
              fputs_filtered ("<same as static member of an already seen type>",
                              stream);
                              stream);
              return;
              return;
            }
            }
        }
        }
 
 
      obstack_grow (&dont_print_statmem_obstack, (char *) &VALUE_ADDRESS (val),
      obstack_grow (&dont_print_statmem_obstack, (char *) &VALUE_ADDRESS (val),
                    sizeof (CORE_ADDR));
                    sizeof (CORE_ADDR));
 
 
      CHECK_TYPEDEF (type);
      CHECK_TYPEDEF (type);
      cp_print_value_fields (type, type, VALUE_CONTENTS_ALL (val), VALUE_EMBEDDED_OFFSET (val), VALUE_ADDRESS (val),
      cp_print_value_fields (type, type, VALUE_CONTENTS_ALL (val), VALUE_EMBEDDED_OFFSET (val), VALUE_ADDRESS (val),
                             stream, format, recurse, pretty, NULL, 1);
                             stream, format, recurse, pretty, NULL, 1);
      return;
      return;
    }
    }
  val_print (type, VALUE_CONTENTS_ALL (val), VALUE_EMBEDDED_OFFSET (val), VALUE_ADDRESS (val),
  val_print (type, VALUE_CONTENTS_ALL (val), VALUE_EMBEDDED_OFFSET (val), VALUE_ADDRESS (val),
             stream, format, 0, recurse, pretty);
             stream, format, 0, recurse, pretty);
}
}
 
 
void
void
cp_print_class_member (valaddr, domain, stream, prefix)
cp_print_class_member (valaddr, domain, stream, prefix)
     char *valaddr;
     char *valaddr;
     struct type *domain;
     struct type *domain;
     struct ui_file *stream;
     struct ui_file *stream;
     char *prefix;
     char *prefix;
{
{
 
 
  /* VAL is a byte offset into the structure type DOMAIN.
  /* VAL is a byte offset into the structure type DOMAIN.
     Find the name of the field for that offset and
     Find the name of the field for that offset and
     print it.  */
     print it.  */
  int extra = 0;
  int extra = 0;
  int bits = 0;
  int bits = 0;
  register unsigned int i;
  register unsigned int i;
  unsigned len = TYPE_NFIELDS (domain);
  unsigned len = TYPE_NFIELDS (domain);
 
 
  /* @@ Make VAL into bit offset */
  /* @@ Make VAL into bit offset */
 
 
  /* Note: HP aCC generates offsets that are the real byte offsets added
  /* Note: HP aCC generates offsets that are the real byte offsets added
     to a constant bias 0x20000000 (1 << 29).  This constant bias gets
     to a constant bias 0x20000000 (1 << 29).  This constant bias gets
     shifted out in the code below -- joyous happenstance! */
     shifted out in the code below -- joyous happenstance! */
 
 
  /* Note: HP cfront uses a constant bias of 1; if we support this
  /* Note: HP cfront uses a constant bias of 1; if we support this
     compiler ever, we will have to adjust the computation below */
     compiler ever, we will have to adjust the computation below */
 
 
  LONGEST val = unpack_long (builtin_type_int, valaddr) << 3;
  LONGEST val = unpack_long (builtin_type_int, valaddr) << 3;
  for (i = TYPE_N_BASECLASSES (domain); i < len; i++)
  for (i = TYPE_N_BASECLASSES (domain); i < len; i++)
    {
    {
      int bitpos = TYPE_FIELD_BITPOS (domain, i);
      int bitpos = TYPE_FIELD_BITPOS (domain, i);
      QUIT;
      QUIT;
      if (val == bitpos)
      if (val == bitpos)
        break;
        break;
      if (val < bitpos && i != 0)
      if (val < bitpos && i != 0)
        {
        {
          /* Somehow pointing into a field.  */
          /* Somehow pointing into a field.  */
          i -= 1;
          i -= 1;
          extra = (val - TYPE_FIELD_BITPOS (domain, i));
          extra = (val - TYPE_FIELD_BITPOS (domain, i));
          if (extra & 0x7)
          if (extra & 0x7)
            bits = 1;
            bits = 1;
          else
          else
            extra >>= 3;
            extra >>= 3;
          break;
          break;
        }
        }
    }
    }
  if (i < len)
  if (i < len)
    {
    {
      char *name;
      char *name;
      fprintf_filtered (stream, prefix);
      fprintf_filtered (stream, prefix);
      name = type_name_no_tag (domain);
      name = type_name_no_tag (domain);
      if (name)
      if (name)
        fputs_filtered (name, stream);
        fputs_filtered (name, stream);
      else
      else
        c_type_print_base (domain, stream, 0, 0);
        c_type_print_base (domain, stream, 0, 0);
      fprintf_filtered (stream, "::");
      fprintf_filtered (stream, "::");
      fputs_filtered (TYPE_FIELD_NAME (domain, i), stream);
      fputs_filtered (TYPE_FIELD_NAME (domain, i), stream);
      if (extra)
      if (extra)
        fprintf_filtered (stream, " + %d bytes", extra);
        fprintf_filtered (stream, " + %d bytes", extra);
      if (bits)
      if (bits)
        fprintf_filtered (stream, " (offset in bits)");
        fprintf_filtered (stream, " (offset in bits)");
    }
    }
  else
  else
    fprintf_filtered (stream, "%ld", (long) (val >> 3));
    fprintf_filtered (stream, "%ld", (long) (val >> 3));
}
}
 
 
 
 
/* This function prints out virtual table entries for a class; it
/* This function prints out virtual table entries for a class; it
 * recurses on the base classes to find all virtual functions
 * recurses on the base classes to find all virtual functions
 * available in a class.
 * available in a class.
 *
 *
 * pai/1997-05-21 Note: As the name suggests, it's currently
 * pai/1997-05-21 Note: As the name suggests, it's currently
 * implemented for HP aCC runtime only. g++ objects are handled
 * implemented for HP aCC runtime only. g++ objects are handled
 * differently and I have made no attempt to fold that logic in
 * differently and I have made no attempt to fold that logic in
 * here. The runtime layout is different for the two cases.  Also,
 * here. The runtime layout is different for the two cases.  Also,
 * this currently has only the code for non-RRBC layouts generated by
 * this currently has only the code for non-RRBC layouts generated by
 * the HP aCC compiler; RRBC code is stubbed out and will have to be
 * the HP aCC compiler; RRBC code is stubbed out and will have to be
 * added later. */
 * added later. */
 
 
 
 
static void
static void
cp_print_hpacc_virtual_table_entries (type, vfuncs, v, stream, format, recurse, pretty)
cp_print_hpacc_virtual_table_entries (type, vfuncs, v, stream, format, recurse, pretty)
     struct type *type;
     struct type *type;
     int *vfuncs;
     int *vfuncs;
     value_ptr v;
     value_ptr v;
     struct ui_file *stream;
     struct ui_file *stream;
     int format;
     int format;
     int recurse;
     int recurse;
     enum val_prettyprint pretty;
     enum val_prettyprint pretty;
{
{
  int fn, oi;
  int fn, oi;
 
 
  /* pai: FIXME this function doesn't work. It should handle a given
  /* pai: FIXME this function doesn't work. It should handle a given
   * virtual function only once (latest redefinition in class hierarchy)
   * virtual function only once (latest redefinition in class hierarchy)
   */
   */
 
 
  /* Recursion on other classes that can share the same vtable */
  /* Recursion on other classes that can share the same vtable */
  struct type *pbc = primary_base_class (type);
  struct type *pbc = primary_base_class (type);
  if (pbc)
  if (pbc)
    cp_print_hpacc_virtual_table_entries (pbc, vfuncs, v, stream, format, recurse, pretty);
    cp_print_hpacc_virtual_table_entries (pbc, vfuncs, v, stream, format, recurse, pretty);
 
 
  /* Now deal with vfuncs declared in this class */
  /* Now deal with vfuncs declared in this class */
  for (fn = 0; fn < TYPE_NFN_FIELDS (type); fn++)
  for (fn = 0; fn < TYPE_NFN_FIELDS (type); fn++)
    for (oi = 0; oi < TYPE_FN_FIELDLIST_LENGTH (type, fn); oi++)
    for (oi = 0; oi < TYPE_FN_FIELDLIST_LENGTH (type, fn); oi++)
      if (TYPE_FN_FIELD_VIRTUAL_P (TYPE_FN_FIELDLIST1 (type, fn), oi))
      if (TYPE_FN_FIELD_VIRTUAL_P (TYPE_FN_FIELDLIST1 (type, fn), oi))
        {
        {
          char *vf_name;
          char *vf_name;
 
 
          /* virtual function offset */
          /* virtual function offset */
          int vx = TYPE_FN_FIELD_VOFFSET (TYPE_FN_FIELDLIST1 (type, fn), oi) - 1;
          int vx = TYPE_FN_FIELD_VOFFSET (TYPE_FN_FIELDLIST1 (type, fn), oi) - 1;
 
 
          /* Get the address of the vfunction entry */
          /* Get the address of the vfunction entry */
          value_ptr vf = value_copy (v);
          value_ptr vf = value_copy (v);
          if (VALUE_LAZY (vf))
          if (VALUE_LAZY (vf))
            (void) value_fetch_lazy (vf);
            (void) value_fetch_lazy (vf);
          vf->aligner.contents[0] += 4 * (HP_ACC_VFUNC_START + vx);      /* adjust by offset */
          vf->aligner.contents[0] += 4 * (HP_ACC_VFUNC_START + vx);      /* adjust by offset */
          vf = value_ind (vf);  /* get the entry */
          vf = value_ind (vf);  /* get the entry */
          VALUE_TYPE (vf) = VALUE_TYPE (v);     /* make it a pointer */
          VALUE_TYPE (vf) = VALUE_TYPE (v);     /* make it a pointer */
 
 
          /* print out the entry */
          /* print out the entry */
          val_print (VALUE_TYPE (vf), VALUE_CONTENTS (vf), 0, 0,
          val_print (VALUE_TYPE (vf), VALUE_CONTENTS (vf), 0, 0,
                     stream, format, 0, recurse + 1, pretty);
                     stream, format, 0, recurse + 1, pretty);
          vf_name = cplus_demangle (TYPE_FN_FIELD_PHYSNAME (TYPE_FN_FIELDLIST1 (type, fn), oi),
          vf_name = cplus_demangle (TYPE_FN_FIELD_PHYSNAME (TYPE_FN_FIELDLIST1 (type, fn), oi),
                                    DMGL_ARM);  /* pai: (temp) FIXME Maybe this should be DMGL_ANSI */
                                    DMGL_ARM);  /* pai: (temp) FIXME Maybe this should be DMGL_ANSI */
          fprintf_filtered (stream, " %s", vf_name);
          fprintf_filtered (stream, " %s", vf_name);
          if (--(*vfuncs) > 0)
          if (--(*vfuncs) > 0)
            fputs_filtered (", ", stream);
            fputs_filtered (", ", stream);
        }
        }
}
}
 
 
 
 
 
 
void
void
_initialize_cp_valprint ()
_initialize_cp_valprint ()
{
{
  add_show_from_set
  add_show_from_set
    (add_set_cmd ("static-members", class_support, var_boolean,
    (add_set_cmd ("static-members", class_support, var_boolean,
                  (char *) &static_field_print,
                  (char *) &static_field_print,
                  "Set printing of C++ static members.",
                  "Set printing of C++ static members.",
                  &setprintlist),
                  &setprintlist),
     &showprintlist);
     &showprintlist);
  /* Turn on printing of static fields.  */
  /* Turn on printing of static fields.  */
  static_field_print = 1;
  static_field_print = 1;
 
 
  add_show_from_set
  add_show_from_set
    (add_set_cmd ("vtbl", class_support, var_boolean, (char *) &vtblprint,
    (add_set_cmd ("vtbl", class_support, var_boolean, (char *) &vtblprint,
                  "Set printing of C++ virtual function tables.",
                  "Set printing of C++ virtual function tables.",
                  &setprintlist),
                  &setprintlist),
     &showprintlist);
     &showprintlist);
 
 
  add_show_from_set
  add_show_from_set
    (add_set_cmd ("object", class_support, var_boolean, (char *) &objectprint,
    (add_set_cmd ("object", class_support, var_boolean, (char *) &objectprint,
              "Set printing of object's derived type based on vtable info.",
              "Set printing of object's derived type based on vtable info.",
                  &setprintlist),
                  &setprintlist),
     &showprintlist);
     &showprintlist);
 
 
  /* Give people the defaults which they are used to.  */
  /* Give people the defaults which they are used to.  */
  objectprint = 0;
  objectprint = 0;
  vtblprint = 0;
  vtblprint = 0;
  obstack_begin (&dont_print_vb_obstack, 32 * sizeof (struct type *));
  obstack_begin (&dont_print_vb_obstack, 32 * sizeof (struct type *));
  obstack_specify_allocation (&dont_print_statmem_obstack,
  obstack_specify_allocation (&dont_print_statmem_obstack,
                              32 * sizeof (CORE_ADDR), sizeof (CORE_ADDR),
                              32 * sizeof (CORE_ADDR), sizeof (CORE_ADDR),
                              xmalloc, free);
                              xmalloc, free);
}
}
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.