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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-stable/] [gdb-7.2/] [gdb/] [m2-valprint.c] - Blame information for rev 861

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 330 jeremybenn
/* Support for printing Modula 2 values for GDB, the GNU debugger.
2
 
3
   Copyright (C) 1986, 1988, 1989, 1991, 1992, 1996, 1998, 2000, 2005, 2006,
4
                 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
5
 
6
   This file is part of GDB.
7
 
8
   This program is free software; you can redistribute it and/or modify
9
   it under the terms of the GNU General Public License as published by
10
   the Free Software Foundation; either version 3 of the License, or
11
   (at your option) any later version.
12
 
13
   This program is distributed in the hope that it will be useful,
14
   but WITHOUT ANY WARRANTY; without even the implied warranty of
15
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
   GNU General Public License for more details.
17
 
18
   You should have received a copy of the GNU General Public License
19
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
20
 
21
#include "defs.h"
22
#include "symtab.h"
23
#include "gdbtypes.h"
24
#include "expression.h"
25
#include "value.h"
26
#include "valprint.h"
27
#include "language.h"
28
#include "typeprint.h"
29
#include "c-lang.h"
30
#include "m2-lang.h"
31
#include "target.h"
32
 
33
static int print_unpacked_pointer (struct type *type,
34
                                   CORE_ADDR address, CORE_ADDR addr,
35
                                   const struct value_print_options *options,
36
                                   struct ui_file *stream);
37
static void
38
m2_print_array_contents (struct type *type, const gdb_byte *valaddr,
39
                         int embedded_offset, CORE_ADDR address,
40
                         struct ui_file *stream, int recurse,
41
                         const struct value *val,
42
                         const struct value_print_options *options,
43
                         int len);
44
 
45
 
46
/* Print function pointer with inferior address ADDRESS onto stdio
47
   stream STREAM.  */
48
 
49
static void
50
print_function_pointer_address (struct gdbarch *gdbarch, CORE_ADDR address,
51
                                struct ui_file *stream, int addressprint)
52
{
53
  CORE_ADDR func_addr = gdbarch_convert_from_func_ptr_addr (gdbarch, address,
54
                                                            &current_target);
55
 
56
  /* If the function pointer is represented by a description, print the
57
     address of the description.  */
58
  if (addressprint && func_addr != address)
59
    {
60
      fputs_filtered ("@", stream);
61
      fputs_filtered (paddress (gdbarch, address), stream);
62
      fputs_filtered (": ", stream);
63
    }
64
  print_address_demangle (gdbarch, func_addr, stream, demangle);
65
}
66
 
67
/* get_long_set_bounds - assigns the bounds of the long set to low and
68
                         high.  */
69
 
70
int
71
get_long_set_bounds (struct type *type, LONGEST *low, LONGEST *high)
72
{
73
  int len, i;
74
 
75
  if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
76
    {
77
      len = TYPE_NFIELDS (type);
78
      i = TYPE_N_BASECLASSES (type);
79
      if (len == 0)
80
        return 0;
81
      *low = TYPE_LOW_BOUND (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, i)));
82
      *high = TYPE_HIGH_BOUND (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type,
83
                                                                 len-1)));
84
      return 1;
85
    }
86
  error (_("expecting long_set"));
87
  return 0;
88
}
89
 
90
static void
91
m2_print_long_set (struct type *type, const gdb_byte *valaddr,
92
                   int embedded_offset, CORE_ADDR address,
93
                   struct ui_file *stream)
94
{
95
  int empty_set        = 1;
96
  int element_seen     = 0;
97
  LONGEST previous_low = 0;
98
  LONGEST previous_high= 0;
99
  LONGEST i, low_bound, high_bound;
100
  LONGEST field_low, field_high;
101
  struct type *range;
102
  int len, field;
103
  struct type *target;
104
  int bitval;
105
 
106
  CHECK_TYPEDEF (type);
107
 
108
  fprintf_filtered (stream, "{");
109
  len = TYPE_NFIELDS (type);
110
  if (get_long_set_bounds (type, &low_bound, &high_bound))
111
    {
112
      field = TYPE_N_BASECLASSES (type);
113
      range = TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, field));
114
    }
115
  else
116
    {
117
      fprintf_filtered (stream, " %s }", _("<unknown bounds of set>"));
118
      return;
119
    }
120
 
121
  target = TYPE_TARGET_TYPE (range);
122
 
123
  if (get_discrete_bounds (range, &field_low, &field_high) >= 0)
124
    {
125
      for (i = low_bound; i <= high_bound; i++)
126
        {
127
          bitval = value_bit_index (TYPE_FIELD_TYPE (type, field),
128
                                    (TYPE_FIELD_BITPOS (type, field) / 8) +
129
                                    valaddr + embedded_offset, i);
130
          if (bitval < 0)
131
            error (_("bit test is out of range"));
132
          else if (bitval > 0)
133
            {
134
              previous_high = i;
135
              if (! element_seen)
136
                {
137
                  if (! empty_set)
138
                    fprintf_filtered (stream, ", ");
139
                  print_type_scalar (target, i, stream);
140
                  empty_set    = 0;
141
                  element_seen = 1;
142
                  previous_low = i;
143
                }
144
            }
145
          else
146
            {
147
              /* bit is not set */
148
              if (element_seen)
149
                {
150
                  if (previous_low+1 < previous_high)
151
                    fprintf_filtered (stream, "..");
152
                  if (previous_low+1 < previous_high)
153
                    print_type_scalar (target, previous_high, stream);
154
                  element_seen = 0;
155
                }
156
            }
157
          if (i == field_high)
158
            {
159
              field++;
160
              if (field == len)
161
                break;
162
              range = TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, field));
163
              if (get_discrete_bounds (range, &field_low, &field_high) < 0)
164
                break;
165
              target = TYPE_TARGET_TYPE (range);
166
            }
167
        }
168
      if (element_seen)
169
        {
170
          if (previous_low+1 < previous_high)
171
            {
172
              fprintf_filtered (stream, "..");
173
              print_type_scalar (target, previous_high, stream);
174
            }
175
          element_seen = 0;
176
        }
177
      fprintf_filtered (stream, "}");
178
    }
179
}
180
 
181
static void
182
m2_print_unbounded_array (struct type *type, const gdb_byte *valaddr,
183
                          int embedded_offset, CORE_ADDR address,
184
                          struct ui_file *stream, int recurse,
185
                          const struct value_print_options *options)
186
{
187
  struct type *content_type;
188
  CORE_ADDR addr;
189
  LONGEST len;
190
  struct value *val;
191
 
192
  CHECK_TYPEDEF (type);
193
  content_type = TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type, 0));
194
 
195
  addr = unpack_pointer (TYPE_FIELD_TYPE (type, 0),
196
                         (TYPE_FIELD_BITPOS (type, 0) / 8) +
197
                         valaddr + embedded_offset);
198
 
199
  val = value_at_lazy (TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type, 0)),
200
                       addr);
201
  len = unpack_field_as_long (type, valaddr + embedded_offset, 1);
202
 
203
  fprintf_filtered (stream, "{");
204
  m2_print_array_contents (value_type (val), value_contents(val),
205
                           value_embedded_offset (val), addr, stream,
206
                           recurse, NULL, options, len);
207
  fprintf_filtered (stream, ", HIGH = %d}", (int) len);
208
}
209
 
210
static int
211
print_unpacked_pointer (struct type *type,
212
                        CORE_ADDR address, CORE_ADDR addr,
213
                        const struct value_print_options *options,
214
                        struct ui_file *stream)
215
{
216
  struct gdbarch *gdbarch = get_type_arch (type);
217
  struct type *elttype = check_typedef (TYPE_TARGET_TYPE (type));
218
 
219
  if (TYPE_CODE (elttype) == TYPE_CODE_FUNC)
220
    {
221
      /* Try to print what function it points to.  */
222
      print_function_pointer_address (gdbarch, addr, stream,
223
                                      options->addressprint);
224
      /* Return value is irrelevant except for string pointers.  */
225
      return 0;
226
    }
227
 
228
  if (options->addressprint && options->format != 's')
229
    fputs_filtered (paddress (gdbarch, address), stream);
230
 
231
  /* For a pointer to char or unsigned char, also print the string
232
     pointed to, unless pointer is null.  */
233
 
234
  if (TYPE_LENGTH (elttype) == 1
235
      && TYPE_CODE (elttype) == TYPE_CODE_INT
236
      && (options->format == 0 || options->format == 's')
237
      && addr != 0)
238
    return val_print_string (TYPE_TARGET_TYPE (type), addr, -1,
239
                             stream, options);
240
 
241
  return 0;
242
}
243
 
244
static void
245
print_variable_at_address (struct type *type,
246
                           const gdb_byte *valaddr,
247
                           struct ui_file *stream,
248
                           int recurse,
249
                           const struct value_print_options *options)
250
{
251
  struct gdbarch *gdbarch = get_type_arch (type);
252
  CORE_ADDR addr = unpack_pointer (type, valaddr);
253
  struct type *elttype = check_typedef (TYPE_TARGET_TYPE (type));
254
 
255
  fprintf_filtered (stream, "[");
256
  fputs_filtered (paddress (gdbarch, addr), stream);
257
  fprintf_filtered (stream, "] : ");
258
 
259
  if (TYPE_CODE (elttype) != TYPE_CODE_UNDEF)
260
    {
261
      struct value *deref_val =
262
        value_at (TYPE_TARGET_TYPE (type), unpack_pointer (type, valaddr));
263
 
264
      common_val_print (deref_val, stream, recurse, options, current_language);
265
    }
266
  else
267
    fputs_filtered ("???", stream);
268
}
269
 
270
 
271
/* m2_print_array_contents - prints out the contents of an
272
                             array up to a max_print values.
273
                             It prints arrays of char as a string
274
                             and all other data types as comma
275
                             separated values.  */
276
 
277
static void
278
m2_print_array_contents (struct type *type, const gdb_byte *valaddr,
279
                         int embedded_offset, CORE_ADDR address,
280
                         struct ui_file *stream, int recurse,
281
                         const struct value *val,
282
                         const struct value_print_options *options,
283
                         int len)
284
{
285
  int eltlen;
286
  CHECK_TYPEDEF (type);
287
 
288
  if (TYPE_LENGTH (type) > 0)
289
    {
290
      eltlen = TYPE_LENGTH (type);
291
      if (options->prettyprint_arrays)
292
        print_spaces_filtered (2 + 2 * recurse, stream);
293
      /* For an array of chars, print with string syntax.  */
294
      if (eltlen == 1 &&
295
          ((TYPE_CODE (type) == TYPE_CODE_INT)
296
           || ((current_language->la_language == language_m2)
297
               && (TYPE_CODE (type) == TYPE_CODE_CHAR)))
298
          && (options->format == 0 || options->format == 's'))
299
        val_print_string (type, address, len+1, stream, options);
300
      else
301
        {
302
          fprintf_filtered (stream, "{");
303
          val_print_array_elements (type, valaddr + embedded_offset,
304
                                    address, stream, recurse, val,
305
                                    options, 0);
306
          fprintf_filtered (stream, "}");
307
        }
308
    }
309
}
310
 
311
 
312
/* Print data of type TYPE located at VALADDR (within GDB), which came from
313
   the inferior at address ADDRESS, onto stdio stream STREAM according to
314
   OPTIONS.  The data at VALADDR is in target byte order.
315
 
316
   If the data are a string pointer, returns the number of string characters
317
   printed.  */
318
 
319
int
320
m2_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
321
              CORE_ADDR address, struct ui_file *stream, int recurse,
322
              const struct value *original_value,
323
              const struct value_print_options *options)
324
{
325
  struct gdbarch *gdbarch = get_type_arch (type);
326
  unsigned int i = 0;    /* Number of characters printed */
327
  unsigned len;
328
  struct type *elttype;
329
  unsigned eltlen;
330
  LONGEST val;
331
  CORE_ADDR addr;
332
 
333
  CHECK_TYPEDEF (type);
334
  switch (TYPE_CODE (type))
335
    {
336
    case TYPE_CODE_ARRAY:
337
      if (TYPE_LENGTH (type) > 0 && TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0)
338
        {
339
          elttype = check_typedef (TYPE_TARGET_TYPE (type));
340
          eltlen = TYPE_LENGTH (elttype);
341
          len = TYPE_LENGTH (type) / eltlen;
342
          if (options->prettyprint_arrays)
343
            print_spaces_filtered (2 + 2 * recurse, stream);
344
          /* For an array of chars, print with string syntax.  */
345
          if (eltlen == 1 &&
346
              ((TYPE_CODE (elttype) == TYPE_CODE_INT)
347
               || ((current_language->la_language == language_m2)
348
                   && (TYPE_CODE (elttype) == TYPE_CODE_CHAR)))
349
              && (options->format == 0 || options->format == 's'))
350
            {
351
              /* If requested, look for the first null char and only print
352
                 elements up to it.  */
353
              if (options->stop_print_at_null)
354
                {
355
                  unsigned int temp_len;
356
 
357
                  /* Look for a NULL char. */
358
                  for (temp_len = 0;
359
                       (valaddr + embedded_offset)[temp_len]
360
                         && temp_len < len && temp_len < options->print_max;
361
                       temp_len++);
362
                  len = temp_len;
363
                }
364
 
365
              LA_PRINT_STRING (stream, TYPE_TARGET_TYPE (type),
366
                               valaddr + embedded_offset, len, NULL,
367
                               0, options);
368
              i = len;
369
            }
370
          else
371
            {
372
              fprintf_filtered (stream, "{");
373
              val_print_array_elements (type, valaddr + embedded_offset,
374
                                        address, stream, recurse, original_value,
375
                                        options, 0);
376
              fprintf_filtered (stream, "}");
377
            }
378
          break;
379
        }
380
      /* Array of unspecified length: treat like pointer to first elt.  */
381
      print_unpacked_pointer (type, address, address, options, stream);
382
      break;
383
 
384
    case TYPE_CODE_PTR:
385
      if (TYPE_CONST (type))
386
        print_variable_at_address (type, valaddr + embedded_offset,
387
                                   stream, recurse, options);
388
      else if (options->format && options->format != 's')
389
        print_scalar_formatted (valaddr + embedded_offset, type,
390
                                options, 0, stream);
391
      else
392
        {
393
          addr = unpack_pointer (type, valaddr + embedded_offset);
394
          print_unpacked_pointer (type, addr, address, options, stream);
395
        }
396
      break;
397
 
398
    case TYPE_CODE_REF:
399
      elttype = check_typedef (TYPE_TARGET_TYPE (type));
400
      if (options->addressprint)
401
        {
402
          CORE_ADDR addr
403
            = extract_typed_address (valaddr + embedded_offset, type);
404
 
405
          fprintf_filtered (stream, "@");
406
          fputs_filtered (paddress (gdbarch, addr), stream);
407
          if (options->deref_ref)
408
            fputs_filtered (": ", stream);
409
        }
410
      /* De-reference the reference.  */
411
      if (options->deref_ref)
412
        {
413
          if (TYPE_CODE (elttype) != TYPE_CODE_UNDEF)
414
            {
415
              struct value *deref_val =
416
                value_at
417
                (TYPE_TARGET_TYPE (type),
418
                 unpack_pointer (type, valaddr + embedded_offset));
419
 
420
              common_val_print (deref_val, stream, recurse, options,
421
                                current_language);
422
            }
423
          else
424
            fputs_filtered ("???", stream);
425
        }
426
      break;
427
 
428
    case TYPE_CODE_UNION:
429
      if (recurse && !options->unionprint)
430
        {
431
          fprintf_filtered (stream, "{...}");
432
          break;
433
        }
434
      /* Fall through.  */
435
    case TYPE_CODE_STRUCT:
436
      if (m2_is_long_set (type))
437
        m2_print_long_set (type, valaddr, embedded_offset, address,
438
                           stream);
439
      else if (m2_is_unbounded_array (type))
440
        m2_print_unbounded_array (type, valaddr, embedded_offset,
441
                                  address, stream, recurse, options);
442
      else
443
        cp_print_value_fields (type, type, valaddr, embedded_offset,
444
                               address, stream, recurse, original_value,
445
                               options, NULL, 0);
446
      break;
447
 
448
    case TYPE_CODE_ENUM:
449
      if (options->format)
450
        {
451
          print_scalar_formatted (valaddr + embedded_offset, type,
452
                                  options, 0, stream);
453
          break;
454
        }
455
      len = TYPE_NFIELDS (type);
456
      val = unpack_long (type, valaddr + embedded_offset);
457
      for (i = 0; i < len; i++)
458
        {
459
          QUIT;
460
          if (val == TYPE_FIELD_BITPOS (type, i))
461
            {
462
              break;
463
            }
464
        }
465
      if (i < len)
466
        {
467
          fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
468
        }
469
      else
470
        {
471
          print_longest (stream, 'd', 0, val);
472
        }
473
      break;
474
 
475
    case TYPE_CODE_FUNC:
476
      if (options->format)
477
        {
478
          print_scalar_formatted (valaddr + embedded_offset, type,
479
                                  options, 0, stream);
480
          break;
481
        }
482
      /* FIXME, we should consider, at least for ANSI C language, eliminating
483
         the distinction made between FUNCs and POINTERs to FUNCs.  */
484
      fprintf_filtered (stream, "{");
485
      type_print (type, "", stream, -1);
486
      fprintf_filtered (stream, "} ");
487
      /* Try to print what function it points to, and its address.  */
488
      print_address_demangle (gdbarch, address, stream, demangle);
489
      break;
490
 
491
    case TYPE_CODE_BOOL:
492
      if (options->format || options->output_format)
493
        {
494
          struct value_print_options opts = *options;
495
 
496
          opts.format = (options->format ? options->format
497
                         : options->output_format);
498
          print_scalar_formatted (valaddr + embedded_offset, type,
499
                                  &opts, 0, stream);
500
        }
501
      else
502
        {
503
          val = unpack_long (type, valaddr + embedded_offset);
504
          if (val == 0)
505
            fputs_filtered ("FALSE", stream);
506
          else if (val == 1)
507
            fputs_filtered ("TRUE", stream);
508
          else
509
            fprintf_filtered (stream, "%ld)", (long int) val);
510
        }
511
      break;
512
 
513
    case TYPE_CODE_RANGE:
514
      if (TYPE_LENGTH (type) == TYPE_LENGTH (TYPE_TARGET_TYPE (type)))
515
        {
516
          m2_val_print (TYPE_TARGET_TYPE (type), valaddr, embedded_offset,
517
                        address, stream, recurse, original_value, options);
518
          break;
519
        }
520
      /* FIXME: create_range_type does not set the unsigned bit in a
521
         range type (I think it probably should copy it from the target
522
         type), so we won't print values which are too large to
523
         fit in a signed integer correctly.  */
524
      /* FIXME: Doesn't handle ranges of enums correctly.  (Can't just
525
         print with the target type, though, because the size of our type
526
         and the target type might differ).  */
527
      /* FALLTHROUGH */
528
 
529
    case TYPE_CODE_INT:
530
      if (options->format || options->output_format)
531
        {
532
          struct value_print_options opts = *options;
533
 
534
          opts.format = (options->format ? options->format
535
                         : options->output_format);
536
          print_scalar_formatted (valaddr + embedded_offset, type,
537
                                  &opts, 0, stream);
538
        }
539
      else
540
        val_print_type_code_int (type, valaddr + embedded_offset, stream);
541
      break;
542
 
543
    case TYPE_CODE_CHAR:
544
      if (options->format || options->output_format)
545
        {
546
          struct value_print_options opts = *options;
547
 
548
          opts.format = (options->format ? options->format
549
                         : options->output_format);
550
          print_scalar_formatted (valaddr + embedded_offset, type,
551
                                  &opts, 0, stream);
552
        }
553
      else
554
        {
555
          val = unpack_long (type, valaddr + embedded_offset);
556
          if (TYPE_UNSIGNED (type))
557
            fprintf_filtered (stream, "%u", (unsigned int) val);
558
          else
559
            fprintf_filtered (stream, "%d", (int) val);
560
          fputs_filtered (" ", stream);
561
          LA_PRINT_CHAR ((unsigned char) val, type, stream);
562
        }
563
      break;
564
 
565
    case TYPE_CODE_FLT:
566
      if (options->format)
567
        print_scalar_formatted (valaddr + embedded_offset, type,
568
                                options, 0, stream);
569
      else
570
        print_floating (valaddr + embedded_offset, type, stream);
571
      break;
572
 
573
    case TYPE_CODE_METHOD:
574
      break;
575
 
576
    case TYPE_CODE_BITSTRING:
577
    case TYPE_CODE_SET:
578
      elttype = TYPE_INDEX_TYPE (type);
579
      CHECK_TYPEDEF (elttype);
580
      if (TYPE_STUB (elttype))
581
        {
582
          fprintf_filtered (stream, _("<incomplete type>"));
583
          gdb_flush (stream);
584
          break;
585
        }
586
      else
587
        {
588
          struct type *range = elttype;
589
          LONGEST low_bound, high_bound;
590
          int i;
591
          int is_bitstring = TYPE_CODE (type) == TYPE_CODE_BITSTRING;
592
          int need_comma = 0;
593
 
594
          if (is_bitstring)
595
            fputs_filtered ("B'", stream);
596
          else
597
            fputs_filtered ("{", stream);
598
 
599
          i = get_discrete_bounds (range, &low_bound, &high_bound);
600
        maybe_bad_bstring:
601
          if (i < 0)
602
            {
603
              fputs_filtered (_("<error value>"), stream);
604
              goto done;
605
            }
606
 
607
          for (i = low_bound; i <= high_bound; i++)
608
            {
609
              int element = value_bit_index (type, valaddr + embedded_offset,
610
                                             i);
611
 
612
              if (element < 0)
613
                {
614
                  i = element;
615
                  goto maybe_bad_bstring;
616
                }
617
              if (is_bitstring)
618
                fprintf_filtered (stream, "%d", element);
619
              else if (element)
620
                {
621
                  if (need_comma)
622
                    fputs_filtered (", ", stream);
623
                  print_type_scalar (range, i, stream);
624
                  need_comma = 1;
625
 
626
                  if (i + 1 <= high_bound
627
                      && value_bit_index (type, valaddr + embedded_offset,
628
                                          ++i))
629
                    {
630
                      int j = i;
631
 
632
                      fputs_filtered ("..", stream);
633
                      while (i + 1 <= high_bound
634
                             && value_bit_index (type,
635
                                                 valaddr + embedded_offset,
636
                                                 ++i))
637
                        j = i;
638
                      print_type_scalar (range, j, stream);
639
                    }
640
                }
641
            }
642
        done:
643
          if (is_bitstring)
644
            fputs_filtered ("'", stream);
645
          else
646
            fputs_filtered ("}", stream);
647
        }
648
      break;
649
 
650
    case TYPE_CODE_VOID:
651
      fprintf_filtered (stream, "void");
652
      break;
653
 
654
    case TYPE_CODE_ERROR:
655
      fprintf_filtered (stream, "%s", TYPE_ERROR_NAME (type));
656
      break;
657
 
658
    case TYPE_CODE_UNDEF:
659
      /* This happens (without TYPE_FLAG_STUB set) on systems which don't use
660
         dbx xrefs (NO_DBX_XREFS in gcc) if a file has a "struct foo *bar"
661
         and no complete type for struct foo in that file.  */
662
      fprintf_filtered (stream, _("<incomplete type>"));
663
      break;
664
 
665
    default:
666
      error (_("Invalid m2 type code %d in symbol table."), TYPE_CODE (type));
667
    }
668
  gdb_flush (stream);
669
  return (0);
670
}

powered by: WebSVN 2.1.0

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