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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.0/] [gdb/] [ch-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 Chill values for GDB, the GNU debugger.
/* Support for printing Chill values for GDB, the GNU debugger.
   Copyright 1986, 1988, 1989, 1991-1994, 2000
   Copyright 1986, 1988, 1989, 1991-1994, 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 "valprint.h"
#include "valprint.h"
#include "expression.h"
#include "expression.h"
#include "value.h"
#include "value.h"
#include "language.h"
#include "language.h"
#include "demangle.h"
#include "demangle.h"
#include "c-lang.h"             /* For c_val_print */
#include "c-lang.h"             /* For c_val_print */
#include "typeprint.h"
#include "typeprint.h"
#include "ch-lang.h"
#include "ch-lang.h"
#include "annotate.h"
#include "annotate.h"
 
 
static void chill_print_value_fields (struct type *, char *,
static void chill_print_value_fields (struct type *, char *,
                                      struct ui_file *, int, int,
                                      struct ui_file *, int, int,
                                      enum val_prettyprint, struct type **);
                                      enum val_prettyprint, struct type **);
 
 
static void chill_print_type_scalar (struct type *, LONGEST,
static void chill_print_type_scalar (struct type *, LONGEST,
                                     struct ui_file *);
                                     struct ui_file *);
 
 
static void chill_val_print_array_elements (struct type *, char *,
static void chill_val_print_array_elements (struct type *, char *,
                                            CORE_ADDR, struct ui_file *,
                                            CORE_ADDR, struct ui_file *,
                                            int, int, int,
                                            int, int, int,
                                            enum val_prettyprint);
                                            enum val_prettyprint);


 
 
/* Print integral scalar data VAL, of type TYPE, onto stdio stream STREAM.
/* Print integral scalar data VAL, of type TYPE, onto stdio stream STREAM.
   Used to print data from type structures in a specified type.  For example,
   Used to print data from type structures in a specified type.  For example,
   array bounds may be characters or booleans in some languages, and this
   array bounds may be characters or booleans in some languages, and this
   allows the ranges to be printed in their "natural" form rather than as
   allows the ranges to be printed in their "natural" form rather than as
   decimal integer values. */
   decimal integer values. */
 
 
static void
static void
chill_print_type_scalar (type, val, stream)
chill_print_type_scalar (type, val, stream)
     struct type *type;
     struct type *type;
     LONGEST val;
     LONGEST val;
     struct ui_file *stream;
     struct ui_file *stream;
{
{
  switch (TYPE_CODE (type))
  switch (TYPE_CODE (type))
    {
    {
    case TYPE_CODE_RANGE:
    case TYPE_CODE_RANGE:
      if (TYPE_TARGET_TYPE (type))
      if (TYPE_TARGET_TYPE (type))
        {
        {
          chill_print_type_scalar (TYPE_TARGET_TYPE (type), val, stream);
          chill_print_type_scalar (TYPE_TARGET_TYPE (type), val, stream);
          return;
          return;
        }
        }
      break;
      break;
    case TYPE_CODE_UNDEF:
    case TYPE_CODE_UNDEF:
    case TYPE_CODE_PTR:
    case TYPE_CODE_PTR:
    case TYPE_CODE_ARRAY:
    case TYPE_CODE_ARRAY:
    case TYPE_CODE_STRUCT:
    case TYPE_CODE_STRUCT:
    case TYPE_CODE_UNION:
    case TYPE_CODE_UNION:
    case TYPE_CODE_ENUM:
    case TYPE_CODE_ENUM:
    case TYPE_CODE_FUNC:
    case TYPE_CODE_FUNC:
    case TYPE_CODE_INT:
    case TYPE_CODE_INT:
    case TYPE_CODE_FLT:
    case TYPE_CODE_FLT:
    case TYPE_CODE_VOID:
    case TYPE_CODE_VOID:
    case TYPE_CODE_SET:
    case TYPE_CODE_SET:
    case TYPE_CODE_STRING:
    case TYPE_CODE_STRING:
    case TYPE_CODE_BITSTRING:
    case TYPE_CODE_BITSTRING:
    case TYPE_CODE_ERROR:
    case TYPE_CODE_ERROR:
    case TYPE_CODE_MEMBER:
    case TYPE_CODE_MEMBER:
    case TYPE_CODE_METHOD:
    case TYPE_CODE_METHOD:
    case TYPE_CODE_REF:
    case TYPE_CODE_REF:
    case TYPE_CODE_CHAR:
    case TYPE_CODE_CHAR:
    case TYPE_CODE_BOOL:
    case TYPE_CODE_BOOL:
    case TYPE_CODE_COMPLEX:
    case TYPE_CODE_COMPLEX:
    case TYPE_CODE_TYPEDEF:
    case TYPE_CODE_TYPEDEF:
    default:
    default:
      break;
      break;
    }
    }
  print_type_scalar (type, val, stream);
  print_type_scalar (type, val, stream);
}
}


/* Print the elements of an array.
/* Print the elements of an array.
   Similar to val_print_array_elements, but prints
   Similar to val_print_array_elements, but prints
   element indexes (in Chill syntax). */
   element indexes (in Chill syntax). */
 
 
static void
static void
chill_val_print_array_elements (type, valaddr, address, stream,
chill_val_print_array_elements (type, valaddr, address, stream,
                                format, deref_ref, recurse, pretty)
                                format, deref_ref, recurse, pretty)
     struct type *type;
     struct type *type;
     char *valaddr;
     char *valaddr;
     CORE_ADDR address;
     CORE_ADDR address;
     struct ui_file *stream;
     struct ui_file *stream;
     int format;
     int format;
     int deref_ref;
     int deref_ref;
     int recurse;
     int recurse;
     enum val_prettyprint pretty;
     enum val_prettyprint pretty;
{
{
  unsigned int i = 0;
  unsigned int i = 0;
  unsigned int things_printed = 0;
  unsigned int things_printed = 0;
  unsigned len;
  unsigned len;
  struct type *elttype;
  struct type *elttype;
  struct type *range_type = TYPE_FIELD_TYPE (type, 0);
  struct type *range_type = TYPE_FIELD_TYPE (type, 0);
  struct type *index_type = TYPE_TARGET_TYPE (range_type);
  struct type *index_type = TYPE_TARGET_TYPE (range_type);
  unsigned eltlen;
  unsigned eltlen;
  /* Position of the array element we are examining to see
  /* Position of the array element we are examining to see
     whether it is repeated.  */
     whether it is repeated.  */
  unsigned int rep1;
  unsigned int rep1;
  /* Number of repetitions we have detected so far.  */
  /* Number of repetitions we have detected so far.  */
  unsigned int reps;
  unsigned int reps;
  LONGEST low_bound = TYPE_FIELD_BITPOS (range_type, 0);
  LONGEST low_bound = TYPE_FIELD_BITPOS (range_type, 0);
 
 
  elttype = check_typedef (TYPE_TARGET_TYPE (type));
  elttype = check_typedef (TYPE_TARGET_TYPE (type));
  eltlen = TYPE_LENGTH (elttype);
  eltlen = TYPE_LENGTH (elttype);
  len = TYPE_LENGTH (type) / eltlen;
  len = TYPE_LENGTH (type) / eltlen;
 
 
  annotate_array_section_begin (i, elttype);
  annotate_array_section_begin (i, elttype);
 
 
  for (; i < len && things_printed < print_max; i++)
  for (; i < len && things_printed < print_max; i++)
    {
    {
      if (i != 0)
      if (i != 0)
        {
        {
          if (prettyprint_arrays)
          if (prettyprint_arrays)
            {
            {
              fprintf_filtered (stream, ",\n");
              fprintf_filtered (stream, ",\n");
              print_spaces_filtered (2 + 2 * recurse, stream);
              print_spaces_filtered (2 + 2 * recurse, stream);
            }
            }
          else
          else
            {
            {
              fprintf_filtered (stream, ", ");
              fprintf_filtered (stream, ", ");
            }
            }
        }
        }
      wrap_here (n_spaces (2 + 2 * recurse));
      wrap_here (n_spaces (2 + 2 * recurse));
 
 
      rep1 = i + 1;
      rep1 = i + 1;
      reps = 1;
      reps = 1;
      while ((rep1 < len) &&
      while ((rep1 < len) &&
             !memcmp (valaddr + i * eltlen, valaddr + rep1 * eltlen, eltlen))
             !memcmp (valaddr + i * eltlen, valaddr + rep1 * eltlen, eltlen))
        {
        {
          ++reps;
          ++reps;
          ++rep1;
          ++rep1;
        }
        }
 
 
      fputs_filtered ("(", stream);
      fputs_filtered ("(", stream);
      chill_print_type_scalar (index_type, low_bound + i, stream);
      chill_print_type_scalar (index_type, low_bound + i, stream);
      if (reps > 1)
      if (reps > 1)
        {
        {
          fputs_filtered (":", stream);
          fputs_filtered (":", stream);
          chill_print_type_scalar (index_type, low_bound + i + reps - 1,
          chill_print_type_scalar (index_type, low_bound + i + reps - 1,
                                   stream);
                                   stream);
          fputs_filtered ("): ", stream);
          fputs_filtered ("): ", stream);
          val_print (elttype, valaddr + i * eltlen, 0, 0, stream, format,
          val_print (elttype, valaddr + i * eltlen, 0, 0, stream, format,
                     deref_ref, recurse + 1, pretty);
                     deref_ref, recurse + 1, pretty);
 
 
          i = rep1 - 1;
          i = rep1 - 1;
          things_printed += 1;
          things_printed += 1;
        }
        }
      else
      else
        {
        {
          fputs_filtered ("): ", stream);
          fputs_filtered ("): ", stream);
          val_print (elttype, valaddr + i * eltlen, 0, 0, stream, format,
          val_print (elttype, valaddr + i * eltlen, 0, 0, stream, format,
                     deref_ref, recurse + 1, pretty);
                     deref_ref, recurse + 1, pretty);
          annotate_elt ();
          annotate_elt ();
          things_printed++;
          things_printed++;
        }
        }
    }
    }
  annotate_array_section_end ();
  annotate_array_section_end ();
  if (i < len)
  if (i < len)
    {
    {
      fprintf_filtered (stream, "...");
      fprintf_filtered (stream, "...");
    }
    }
}
}
 
 
/* Print data of type TYPE located at VALADDR (within GDB), which came from
/* Print data of type TYPE located at VALADDR (within GDB), which came from
   the inferior at address ADDRESS, onto stdio stream STREAM according to
   the inferior at address ADDRESS, onto stdio stream STREAM according to
   FORMAT (a letter or 0 for natural format).  The data at VALADDR is in
   FORMAT (a letter or 0 for natural format).  The data at VALADDR is in
   target byte order.
   target byte order.
 
 
   If the data are a string pointer, returns the number of string characters
   If the data are a string pointer, returns the number of string characters
   printed.
   printed.
 
 
   If DEREF_REF is nonzero, then dereference references, otherwise just print
   If DEREF_REF is nonzero, then dereference references, otherwise just print
   them like pointers.
   them like pointers.
 
 
   The PRETTY parameter controls prettyprinting.  */
   The PRETTY parameter controls prettyprinting.  */
 
 
int
int
chill_val_print (type, valaddr, embedded_offset, address,
chill_val_print (type, valaddr, embedded_offset, address,
                 stream, format, deref_ref, recurse, pretty)
                 stream, format, deref_ref, recurse, pretty)
     struct type *type;
     struct type *type;
     char *valaddr;
     char *valaddr;
     int embedded_offset;
     int embedded_offset;
     CORE_ADDR address;
     CORE_ADDR address;
     struct ui_file *stream;
     struct ui_file *stream;
     int format;
     int format;
     int deref_ref;
     int deref_ref;
     int recurse;
     int recurse;
     enum val_prettyprint pretty;
     enum val_prettyprint pretty;
{
{
  LONGEST val;
  LONGEST val;
  unsigned int i = 0;            /* Number of characters printed.  */
  unsigned int i = 0;            /* Number of characters printed.  */
  struct type *elttype;
  struct type *elttype;
  CORE_ADDR addr;
  CORE_ADDR addr;
 
 
  CHECK_TYPEDEF (type);
  CHECK_TYPEDEF (type);
 
 
  switch (TYPE_CODE (type))
  switch (TYPE_CODE (type))
    {
    {
    case TYPE_CODE_ARRAY:
    case TYPE_CODE_ARRAY:
      if (TYPE_LENGTH (type) > 0 && TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0)
      if (TYPE_LENGTH (type) > 0 && TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0)
        {
        {
          if (prettyprint_arrays)
          if (prettyprint_arrays)
            {
            {
              print_spaces_filtered (2 + 2 * recurse, stream);
              print_spaces_filtered (2 + 2 * recurse, stream);
            }
            }
          fprintf_filtered (stream, "[");
          fprintf_filtered (stream, "[");
          chill_val_print_array_elements (type, valaddr, address, stream,
          chill_val_print_array_elements (type, valaddr, address, stream,
                                        format, deref_ref, recurse, pretty);
                                        format, deref_ref, recurse, pretty);
          fprintf_filtered (stream, "]");
          fprintf_filtered (stream, "]");
        }
        }
      else
      else
        {
        {
          error ("unimplemented in chill_val_print; unspecified array length");
          error ("unimplemented in chill_val_print; unspecified array length");
        }
        }
      break;
      break;
 
 
    case TYPE_CODE_INT:
    case TYPE_CODE_INT:
      format = format ? format : output_format;
      format = format ? format : output_format;
      if (format)
      if (format)
        {
        {
          print_scalar_formatted (valaddr, type, format, 0, stream);
          print_scalar_formatted (valaddr, type, format, 0, stream);
        }
        }
      else
      else
        {
        {
          val_print_type_code_int (type, valaddr, stream);
          val_print_type_code_int (type, valaddr, stream);
        }
        }
      break;
      break;
 
 
    case TYPE_CODE_CHAR:
    case TYPE_CODE_CHAR:
      format = format ? format : output_format;
      format = format ? format : output_format;
      if (format)
      if (format)
        {
        {
          print_scalar_formatted (valaddr, type, format, 0, stream);
          print_scalar_formatted (valaddr, type, format, 0, stream);
        }
        }
      else
      else
        {
        {
          LA_PRINT_CHAR ((unsigned char) unpack_long (type, valaddr),
          LA_PRINT_CHAR ((unsigned char) unpack_long (type, valaddr),
                         stream);
                         stream);
        }
        }
      break;
      break;
 
 
    case TYPE_CODE_FLT:
    case TYPE_CODE_FLT:
      if (format)
      if (format)
        {
        {
          print_scalar_formatted (valaddr, type, format, 0, stream);
          print_scalar_formatted (valaddr, type, format, 0, stream);
        }
        }
      else
      else
        {
        {
          print_floating (valaddr, type, stream);
          print_floating (valaddr, type, stream);
        }
        }
      break;
      break;
 
 
    case TYPE_CODE_BOOL:
    case TYPE_CODE_BOOL:
      format = format ? format : output_format;
      format = format ? format : output_format;
      if (format)
      if (format)
        {
        {
          print_scalar_formatted (valaddr, type, format, 0, stream);
          print_scalar_formatted (valaddr, type, format, 0, stream);
        }
        }
      else
      else
        {
        {
          /* FIXME: Why is this using builtin_type_chill_bool not type?  */
          /* FIXME: Why is this using builtin_type_chill_bool not type?  */
          val = unpack_long (builtin_type_chill_bool, valaddr);
          val = unpack_long (builtin_type_chill_bool, valaddr);
          fprintf_filtered (stream, val ? "TRUE" : "FALSE");
          fprintf_filtered (stream, val ? "TRUE" : "FALSE");
        }
        }
      break;
      break;
 
 
    case TYPE_CODE_UNDEF:
    case TYPE_CODE_UNDEF:
      /* This happens (without TYPE_FLAG_STUB set) on systems which don't use
      /* This happens (without TYPE_FLAG_STUB set) on systems which don't use
         dbx xrefs (NO_DBX_XREFS in gcc) if a file has a "struct foo *bar"
         dbx xrefs (NO_DBX_XREFS in gcc) if a file has a "struct foo *bar"
         and no complete type for struct foo in that file.  */
         and no complete type for struct foo in that file.  */
      fprintf_filtered (stream, "<incomplete type>");
      fprintf_filtered (stream, "<incomplete type>");
      break;
      break;
 
 
    case TYPE_CODE_PTR:
    case TYPE_CODE_PTR:
      if (format && format != 's')
      if (format && format != 's')
        {
        {
          print_scalar_formatted (valaddr, type, format, 0, stream);
          print_scalar_formatted (valaddr, type, format, 0, stream);
          break;
          break;
        }
        }
      addr = unpack_pointer (type, valaddr);
      addr = unpack_pointer (type, valaddr);
      elttype = check_typedef (TYPE_TARGET_TYPE (type));
      elttype = check_typedef (TYPE_TARGET_TYPE (type));
 
 
      /* We assume a NULL pointer is all zeros ... */
      /* We assume a NULL pointer is all zeros ... */
      if (addr == 0)
      if (addr == 0)
        {
        {
          fputs_filtered ("NULL", stream);
          fputs_filtered ("NULL", stream);
          return 0;
          return 0;
        }
        }
 
 
      if (TYPE_CODE (elttype) == TYPE_CODE_FUNC)
      if (TYPE_CODE (elttype) == TYPE_CODE_FUNC)
        {
        {
          /* Try to print what function it points to.  */
          /* Try to print what function it points to.  */
          print_address_demangle (addr, stream, demangle);
          print_address_demangle (addr, stream, demangle);
          /* Return value is irrelevant except for string pointers.  */
          /* Return value is irrelevant except for string pointers.  */
          return (0);
          return (0);
        }
        }
      if (addressprint && format != 's')
      if (addressprint && format != 's')
        {
        {
          print_address_numeric (addr, 1, stream);
          print_address_numeric (addr, 1, stream);
        }
        }
 
 
      /* For a pointer to char or unsigned char, also print the string
      /* For a pointer to char or unsigned char, also print the string
         pointed to, unless pointer is null.  */
         pointed to, unless pointer is null.  */
      if (TYPE_LENGTH (elttype) == 1
      if (TYPE_LENGTH (elttype) == 1
          && TYPE_CODE (elttype) == TYPE_CODE_CHAR
          && TYPE_CODE (elttype) == TYPE_CODE_CHAR
          && (format == 0 || format == 's')
          && (format == 0 || format == 's')
          && addr != 0
          && addr != 0
          &&                    /* If print_max is UINT_MAX, the alloca below will fail.
          &&                    /* If print_max is UINT_MAX, the alloca below will fail.
                                   In that case don't try to print the string.  */
                                   In that case don't try to print the string.  */
          print_max < UINT_MAX)
          print_max < UINT_MAX)
        i = val_print_string (addr, -1, TYPE_LENGTH (elttype), stream);
        i = val_print_string (addr, -1, TYPE_LENGTH (elttype), stream);
 
 
      /* Return number of characters printed, plus one for the
      /* Return number of characters printed, plus one for the
         terminating null if we have "reached the end".  */
         terminating null if we have "reached the end".  */
      return (i + (print_max && i != print_max));
      return (i + (print_max && i != print_max));
      break;
      break;
 
 
    case TYPE_CODE_STRING:
    case TYPE_CODE_STRING:
      i = TYPE_LENGTH (type);
      i = TYPE_LENGTH (type);
      LA_PRINT_STRING (stream, valaddr, i, 1, 0);
      LA_PRINT_STRING (stream, valaddr, i, 1, 0);
      /* Return number of characters printed, plus one for the terminating
      /* Return number of characters printed, plus one for the terminating
         null if we have "reached the end".  */
         null if we have "reached the end".  */
      return (i + (print_max && i != print_max));
      return (i + (print_max && i != print_max));
      break;
      break;
 
 
    case TYPE_CODE_BITSTRING:
    case TYPE_CODE_BITSTRING:
    case TYPE_CODE_SET:
    case TYPE_CODE_SET:
      elttype = TYPE_INDEX_TYPE (type);
      elttype = TYPE_INDEX_TYPE (type);
      CHECK_TYPEDEF (elttype);
      CHECK_TYPEDEF (elttype);
      if (TYPE_FLAGS (elttype) & TYPE_FLAG_STUB)
      if (TYPE_FLAGS (elttype) & TYPE_FLAG_STUB)
        {
        {
          fprintf_filtered (stream, "<incomplete type>");
          fprintf_filtered (stream, "<incomplete type>");
          gdb_flush (stream);
          gdb_flush (stream);
          break;
          break;
        }
        }
      {
      {
        struct type *range = elttype;
        struct type *range = elttype;
        LONGEST low_bound, high_bound;
        LONGEST low_bound, high_bound;
        int i;
        int i;
        int is_bitstring = TYPE_CODE (type) == TYPE_CODE_BITSTRING;
        int is_bitstring = TYPE_CODE (type) == TYPE_CODE_BITSTRING;
        int need_comma = 0;
        int need_comma = 0;
 
 
        if (is_bitstring)
        if (is_bitstring)
          fputs_filtered ("B'", stream);
          fputs_filtered ("B'", stream);
        else
        else
          fputs_filtered ("[", stream);
          fputs_filtered ("[", stream);
 
 
        i = get_discrete_bounds (range, &low_bound, &high_bound);
        i = get_discrete_bounds (range, &low_bound, &high_bound);
      maybe_bad_bstring:
      maybe_bad_bstring:
        if (i < 0)
        if (i < 0)
          {
          {
            fputs_filtered ("<error value>", stream);
            fputs_filtered ("<error value>", stream);
            goto done;
            goto done;
          }
          }
 
 
        for (i = low_bound; i <= high_bound; i++)
        for (i = low_bound; i <= high_bound; i++)
          {
          {
            int element = value_bit_index (type, valaddr, i);
            int element = value_bit_index (type, valaddr, i);
            if (element < 0)
            if (element < 0)
              {
              {
                i = element;
                i = element;
                goto maybe_bad_bstring;
                goto maybe_bad_bstring;
              }
              }
            if (is_bitstring)
            if (is_bitstring)
              fprintf_filtered (stream, "%d", element);
              fprintf_filtered (stream, "%d", element);
            else if (element)
            else if (element)
              {
              {
                if (need_comma)
                if (need_comma)
                  fputs_filtered (", ", stream);
                  fputs_filtered (", ", stream);
                chill_print_type_scalar (range, (LONGEST) i, stream);
                chill_print_type_scalar (range, (LONGEST) i, stream);
                need_comma = 1;
                need_comma = 1;
 
 
                /* Look for a continuous range of true elements. */
                /* Look for a continuous range of true elements. */
                if (i + 1 <= high_bound && value_bit_index (type, valaddr, ++i))
                if (i + 1 <= high_bound && value_bit_index (type, valaddr, ++i))
                  {
                  {
                    int j = i;  /* j is the upper bound so far of the range */
                    int j = i;  /* j is the upper bound so far of the range */
                    fputs_filtered (":", stream);
                    fputs_filtered (":", stream);
                    while (i + 1 <= high_bound
                    while (i + 1 <= high_bound
                           && value_bit_index (type, valaddr, ++i))
                           && value_bit_index (type, valaddr, ++i))
                      j = i;
                      j = i;
                    chill_print_type_scalar (range, (LONGEST) j, stream);
                    chill_print_type_scalar (range, (LONGEST) j, stream);
                  }
                  }
              }
              }
          }
          }
      done:
      done:
        if (is_bitstring)
        if (is_bitstring)
          fputs_filtered ("'", stream);
          fputs_filtered ("'", stream);
        else
        else
          fputs_filtered ("]", stream);
          fputs_filtered ("]", stream);
      }
      }
      break;
      break;
 
 
    case TYPE_CODE_STRUCT:
    case TYPE_CODE_STRUCT:
      if (chill_varying_type (type))
      if (chill_varying_type (type))
        {
        {
          struct type *inner = check_typedef (TYPE_FIELD_TYPE (type, 1));
          struct type *inner = check_typedef (TYPE_FIELD_TYPE (type, 1));
          long length = unpack_long (TYPE_FIELD_TYPE (type, 0), valaddr);
          long length = unpack_long (TYPE_FIELD_TYPE (type, 0), valaddr);
          char *data_addr = valaddr + TYPE_FIELD_BITPOS (type, 1) / 8;
          char *data_addr = valaddr + TYPE_FIELD_BITPOS (type, 1) / 8;
 
 
          switch (TYPE_CODE (inner))
          switch (TYPE_CODE (inner))
            {
            {
            case TYPE_CODE_STRING:
            case TYPE_CODE_STRING:
              if (length > TYPE_LENGTH (type) - 2)
              if (length > TYPE_LENGTH (type) - 2)
                {
                {
                  fprintf_filtered (stream,
                  fprintf_filtered (stream,
                        "<dynamic length %ld > static length %d> *invalid*",
                        "<dynamic length %ld > static length %d> *invalid*",
                                    length, TYPE_LENGTH (type));
                                    length, TYPE_LENGTH (type));
 
 
                  /* Don't print the string; doing so might produce a
                  /* Don't print the string; doing so might produce a
                     segfault.  */
                     segfault.  */
                  return length;
                  return length;
                }
                }
              LA_PRINT_STRING (stream, data_addr, length, 1, 0);
              LA_PRINT_STRING (stream, data_addr, length, 1, 0);
              return length;
              return length;
            default:
            default:
              break;
              break;
            }
            }
        }
        }
      chill_print_value_fields (type, valaddr, stream, format, recurse, pretty,
      chill_print_value_fields (type, valaddr, stream, format, recurse, pretty,
                                0);
                                0);
      break;
      break;
 
 
    case TYPE_CODE_REF:
    case TYPE_CODE_REF:
      if (addressprint)
      if (addressprint)
        {
        {
          fprintf_filtered (stream, "LOC(");
          fprintf_filtered (stream, "LOC(");
          print_address_numeric
          print_address_numeric
            (extract_address (valaddr, TARGET_PTR_BIT / HOST_CHAR_BIT),
            (extract_address (valaddr, TARGET_PTR_BIT / HOST_CHAR_BIT),
             1,
             1,
             stream);
             stream);
          fprintf_filtered (stream, ")");
          fprintf_filtered (stream, ")");
          if (deref_ref)
          if (deref_ref)
            fputs_filtered (": ", stream);
            fputs_filtered (": ", stream);
        }
        }
      /* De-reference the reference.  */
      /* De-reference the reference.  */
      if (deref_ref)
      if (deref_ref)
        {
        {
          if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_UNDEF)
          if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_UNDEF)
            {
            {
              value_ptr deref_val =
              value_ptr deref_val =
              value_at
              value_at
              (TYPE_TARGET_TYPE (type),
              (TYPE_TARGET_TYPE (type),
               unpack_pointer (lookup_pointer_type (builtin_type_void),
               unpack_pointer (lookup_pointer_type (builtin_type_void),
                               valaddr),
                               valaddr),
               NULL);
               NULL);
              val_print (VALUE_TYPE (deref_val),
              val_print (VALUE_TYPE (deref_val),
                         VALUE_CONTENTS (deref_val),
                         VALUE_CONTENTS (deref_val),
                         0,
                         0,
                         VALUE_ADDRESS (deref_val), stream, format,
                         VALUE_ADDRESS (deref_val), stream, format,
                         deref_ref, recurse + 1, pretty);
                         deref_ref, recurse + 1, pretty);
            }
            }
          else
          else
            fputs_filtered ("???", stream);
            fputs_filtered ("???", stream);
        }
        }
      break;
      break;
 
 
    case TYPE_CODE_ENUM:
    case TYPE_CODE_ENUM:
      c_val_print (type, valaddr, 0, address, stream, format,
      c_val_print (type, valaddr, 0, address, stream, format,
                   deref_ref, recurse, pretty);
                   deref_ref, recurse, pretty);
      break;
      break;
 
 
    case TYPE_CODE_RANGE:
    case TYPE_CODE_RANGE:
      if (TYPE_TARGET_TYPE (type))
      if (TYPE_TARGET_TYPE (type))
        chill_val_print (TYPE_TARGET_TYPE (type), valaddr, 0, address, stream,
        chill_val_print (TYPE_TARGET_TYPE (type), valaddr, 0, address, stream,
                         format, deref_ref, recurse, pretty);
                         format, deref_ref, recurse, pretty);
      break;
      break;
 
 
    case TYPE_CODE_MEMBER:
    case TYPE_CODE_MEMBER:
    case TYPE_CODE_UNION:
    case TYPE_CODE_UNION:
    case TYPE_CODE_FUNC:
    case TYPE_CODE_FUNC:
    case TYPE_CODE_VOID:
    case TYPE_CODE_VOID:
    case TYPE_CODE_ERROR:
    case TYPE_CODE_ERROR:
    default:
    default:
      /* Let's defer printing to the C printer, rather than
      /* Let's defer printing to the C printer, rather than
         print an error message.  FIXME! */
         print an error message.  FIXME! */
      c_val_print (type, valaddr, 0, address, stream, format,
      c_val_print (type, valaddr, 0, address, stream, format,
                   deref_ref, recurse, pretty);
                   deref_ref, recurse, pretty);
    }
    }
  gdb_flush (stream);
  gdb_flush (stream);
  return (0);
  return (0);
}
}
 
 
/* Mutually recursive subroutines of cplus_print_value and c_val_print to
/* Mutually recursive subroutines of cplus_print_value and c_val_print to
   print out a structure's fields: cp_print_value_fields and cplus_print_value.
   print out a structure's fields: cp_print_value_fields and cplus_print_value.
 
 
   TYPE, VALADDR, STREAM, RECURSE, and PRETTY have the
   TYPE, VALADDR, STREAM, RECURSE, and PRETTY have the
   same meanings as in cplus_print_value and c_val_print.
   same meanings as in cplus_print_value and c_val_print.
 
 
   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.  */
 
 
static void
static void
chill_print_value_fields (type, valaddr, stream, format, recurse, pretty,
chill_print_value_fields (type, valaddr, stream, format, recurse, pretty,
                          dont_print)
                          dont_print)
     struct type *type;
     struct type *type;
     char *valaddr;
     char *valaddr;
     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;
     struct type **dont_print;
{
{
  int i, len;
  int i, len;
  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);
  if (len == 0)
  if (len == 0)
    {
    {
      fprintf_filtered (stream, "<No data fields>");
      fprintf_filtered (stream, "<No data fields>");
    }
    }
  else
  else
    {
    {
      for (i = 0; i < len; i++)
      for (i = 0; i < len; i++)
        {
        {
          if (fields_seen)
          if (fields_seen)
            {
            {
              fprintf_filtered (stream, ", ");
              fprintf_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));
            }
            }
          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_chill, DMGL_NO_OPTS);
                                   language_chill, DMGL_NO_OPTS);
          fputs_filtered (": ", stream);
          fputs_filtered (": ", stream);
          if (TYPE_FIELD_PACKED (type, i))
          if (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.  */
              v = value_from_longest (TYPE_FIELD_TYPE (type, i),
              v = value_from_longest (TYPE_FIELD_TYPE (type, i),
                                   unpack_field_as_long (type, valaddr, i));
                                   unpack_field_as_long (type, valaddr, i));
 
 
              chill_val_print (TYPE_FIELD_TYPE (type, i), VALUE_CONTENTS (v), 0, 0,
              chill_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
            {
            {
              chill_val_print (TYPE_FIELD_TYPE (type, i),
              chill_val_print (TYPE_FIELD_TYPE (type, i),
                               valaddr + TYPE_FIELD_BITPOS (type, i) / 8, 0,
                               valaddr + TYPE_FIELD_BITPOS (type, i) / 8, 0,
                               0, stream, format, 0, recurse + 1, pretty);
                               0, stream, format, 0, recurse + 1, pretty);
            }
            }
        }
        }
      if (pretty)
      if (pretty)
        {
        {
          fprintf_filtered (stream, "\n");
          fprintf_filtered (stream, "\n");
          print_spaces_filtered (2 * recurse, stream);
          print_spaces_filtered (2 * recurse, stream);
        }
        }
    }
    }
  fprintf_filtered (stream, "]");
  fprintf_filtered (stream, "]");
}
}


int
int
chill_value_print (val, stream, format, pretty)
chill_value_print (val, stream, format, pretty)
     value_ptr val;
     value_ptr val;
     struct ui_file *stream;
     struct ui_file *stream;
     int format;
     int format;
     enum val_prettyprint pretty;
     enum val_prettyprint pretty;
{
{
  struct type *type = VALUE_TYPE (val);
  struct type *type = VALUE_TYPE (val);
  struct type *real_type = check_typedef (type);
  struct type *real_type = check_typedef (type);
 
 
  /* If it is a pointer, indicate what it points to.
  /* If it is a pointer, indicate what it points to.
 
 
     Print type also if it is a reference. */
     Print type also if it is a reference. */
 
 
  if (TYPE_CODE (real_type) == TYPE_CODE_PTR ||
  if (TYPE_CODE (real_type) == TYPE_CODE_PTR ||
      TYPE_CODE (real_type) == TYPE_CODE_REF)
      TYPE_CODE (real_type) == TYPE_CODE_REF)
    {
    {
      char *valaddr = VALUE_CONTENTS (val);
      char *valaddr = VALUE_CONTENTS (val);
      CORE_ADDR addr = unpack_pointer (type, valaddr);
      CORE_ADDR addr = unpack_pointer (type, valaddr);
      if (TYPE_CODE (type) != TYPE_CODE_PTR || addr != 0)
      if (TYPE_CODE (type) != TYPE_CODE_PTR || addr != 0)
        {
        {
          int i;
          int i;
          char *name = TYPE_NAME (type);
          char *name = TYPE_NAME (type);
          if (name)
          if (name)
            fputs_filtered (name, stream);
            fputs_filtered (name, stream);
          else if (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_VOID)
          else if (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_VOID)
            fputs_filtered ("PTR", stream);
            fputs_filtered ("PTR", stream);
          else
          else
            {
            {
              fprintf_filtered (stream, "(");
              fprintf_filtered (stream, "(");
              type_print (type, "", stream, -1);
              type_print (type, "", stream, -1);
              fprintf_filtered (stream, ")");
              fprintf_filtered (stream, ")");
            }
            }
          fprintf_filtered (stream, "(");
          fprintf_filtered (stream, "(");
          i = val_print (type, valaddr, 0, VALUE_ADDRESS (val),
          i = val_print (type, valaddr, 0, VALUE_ADDRESS (val),
                         stream, format, 1, 0, pretty);
                         stream, format, 1, 0, pretty);
          fprintf_filtered (stream, ")");
          fprintf_filtered (stream, ")");
          return i;
          return i;
        }
        }
    }
    }
  return (val_print (type, VALUE_CONTENTS (val), 0,
  return (val_print (type, VALUE_CONTENTS (val), 0,
                     VALUE_ADDRESS (val), stream, format, 1, 0, pretty));
                     VALUE_ADDRESS (val), stream, format, 1, 0, pretty));
}
}
 
 

powered by: WebSVN 2.1.0

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