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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gdb-6.8/] [gdb/] [m2-typeprint.c] - Blame information for rev 853

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

Line No. Rev Author Line
1 24 jeremybenn
/* Support for printing Modula 2 types for GDB, the GNU debugger.
2
   Copyright (C) 1986, 1988, 1989, 1991, 1992, 1995, 2000, 2001, 2002, 2003,
3
                 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
4
 
5
   This file is part of GDB.
6
 
7
   This program is free software; you can redistribute it and/or modify
8
   it under the terms of the GNU General Public License as published by
9
   the Free Software Foundation; either version 3 of the License, or
10
   (at your option) any later version.
11
 
12
   This program is distributed in the hope that it will be useful,
13
   but WITHOUT ANY WARRANTY; without even the implied warranty of
14
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
   GNU General Public License for more details.
16
 
17
   You should have received a copy of the GNU General Public License
18
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19
 
20
#include "defs.h"
21
#include "gdb_obstack.h"
22
#include "bfd.h"                /* Binary File Description */
23
#include "symtab.h"
24
#include "gdbtypes.h"
25
#include "expression.h"
26
#include "value.h"
27
#include "gdbcore.h"
28
#include "m2-lang.h"
29
#include "target.h"
30
#include "language.h"
31
#include "demangle.h"
32
#include "c-lang.h"
33
#include "typeprint.h"
34
#include "cp-abi.h"
35
 
36
#include "gdb_string.h"
37
#include <errno.h>
38
 
39
static void m2_print_bounds (struct type *type,
40
                             struct ui_file *stream, int show, int level,
41
                             int print_high);
42
 
43
static void m2_typedef (struct type *, struct ui_file *, int, int);
44
static void m2_array (struct type *, struct ui_file *, int, int);
45
static void m2_pointer (struct type *, struct ui_file *, int, int);
46
static void m2_ref (struct type *, struct ui_file *, int, int);
47
static void m2_procedure (struct type *, struct ui_file *, int, int);
48
static void m2_union (struct type *, struct ui_file *);
49
static void m2_enum (struct type *, struct ui_file *, int, int);
50
static void m2_range (struct type *, struct ui_file *, int, int);
51
static void m2_type_name (struct type *type, struct ui_file *stream);
52
static void m2_short_set (struct type *type, struct ui_file *stream,
53
                          int show, int level);
54
static int m2_long_set (struct type *type, struct ui_file *stream,
55
                        int show, int level);
56
static int m2_unbounded_array (struct type *type, struct ui_file *stream,
57
                               int show, int level);
58
static void m2_record_fields (struct type *type, struct ui_file *stream,
59
                              int show, int level);
60
static void m2_unknown (const char *s, struct type *type,
61
                        struct ui_file *stream, int show, int level);
62
 
63
int m2_is_long_set (struct type *type);
64
int m2_is_long_set_of_type (struct type *type, struct type **of_type);
65
int m2_is_unbounded_array (struct type *type);
66
 
67
 
68
void
69
m2_print_type (struct type *type, char *varstring, struct ui_file *stream,
70
               int show, int level)
71
{
72
  enum type_code code;
73
  int demangled_args;
74
 
75
  CHECK_TYPEDEF (type);
76
 
77
  QUIT;
78
 
79
  wrap_here ("    ");
80
  if (type == NULL)
81
    {
82
      fputs_filtered (_("<type unknown>"), stream);
83
      return;
84
    }
85
 
86
  code = TYPE_CODE (type);
87
  switch (TYPE_CODE (type))
88
    {
89
    case TYPE_CODE_SET:
90
      m2_short_set(type, stream, show, level);
91
      break;
92
 
93
    case TYPE_CODE_STRUCT:
94
      if (m2_long_set (type, stream, show, level)
95
          || m2_unbounded_array (type, stream, show, level))
96
        break;
97
      m2_record_fields (type, stream, show, level);
98
      break;
99
 
100
    case TYPE_CODE_TYPEDEF:
101
      m2_typedef (type, stream, show, level);
102
      break;
103
 
104
    case TYPE_CODE_ARRAY:
105
      m2_array (type, stream, show, level);
106
      break;
107
 
108
    case TYPE_CODE_PTR:
109
      m2_pointer (type, stream, show, level);
110
      break;
111
 
112
    case TYPE_CODE_REF:
113
      m2_ref (type, stream, show, level);
114
      break;
115
 
116
    case TYPE_CODE_METHOD:
117
      m2_unknown (_("method"), type, stream, show, level);
118
      break;
119
 
120
    case TYPE_CODE_FUNC:
121
      m2_procedure (type, stream, show, level);
122
      break;
123
 
124
    case TYPE_CODE_UNION:
125
      m2_union (type, stream);
126
      break;
127
 
128
    case TYPE_CODE_ENUM:
129
      m2_enum (type, stream, show, level);
130
      break;
131
 
132
    case TYPE_CODE_VOID:
133
      break;
134
 
135
    case TYPE_CODE_UNDEF:
136
      /* i18n: Do not translate the "struct" part! */
137
      m2_unknown (_("undef"), type, stream, show, level);
138
      break;
139
 
140
    case TYPE_CODE_ERROR:
141
      m2_unknown (_("error"), type, stream, show, level);
142
      break;
143
 
144
    case TYPE_CODE_RANGE:
145
      m2_range (type, stream, show, level);
146
      break;
147
 
148
    case TYPE_CODE_TEMPLATE:
149
      break;
150
 
151
    default:
152
      m2_type_name (type, stream);
153
      break;
154
    }
155
}
156
 
157
/* m2_type_name - if a, type, has a name then print it.  */
158
 
159
void
160
m2_type_name (struct type *type, struct ui_file *stream)
161
{
162
  if (TYPE_NAME (type) != NULL)
163
    fputs_filtered (TYPE_NAME (type), stream);
164
}
165
 
166
/* m2_range - displays a Modula-2 subrange type.  */
167
 
168
void
169
m2_range (struct type *type, struct ui_file *stream, int show,
170
          int level)
171
{
172
  if (TYPE_HIGH_BOUND (type) == TYPE_LOW_BOUND (type))
173
    m2_print_type (TYPE_DOMAIN_TYPE (type), "", stream, show, level);
174
  else
175
    {
176
      struct type *target = TYPE_TARGET_TYPE (type);
177
 
178
      fprintf_filtered (stream, "[");
179
      print_type_scalar (target, TYPE_LOW_BOUND (type), stream);
180
      fprintf_filtered (stream, "..");
181
      print_type_scalar (target, TYPE_HIGH_BOUND (type), stream);
182
      fprintf_filtered (stream, "]");
183
    }
184
}
185
 
186
static void
187
m2_typedef (struct type *type, struct ui_file *stream, int show,
188
            int level)
189
{
190
  if (TYPE_NAME (type) != NULL)
191
    {
192
      fputs_filtered (TYPE_NAME (type), stream);
193
      fputs_filtered (" = ", stream);
194
    }
195
  m2_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level);
196
}
197
 
198
/* m2_array - prints out a Modula-2 ARRAY ... OF type.  */
199
 
200
static void m2_array (struct type *type, struct ui_file *stream,
201
                      int show, int level)
202
{
203
  fprintf_filtered (stream, "ARRAY [");
204
  if (TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0
205
      && TYPE_ARRAY_UPPER_BOUND_TYPE (type) != BOUND_CANNOT_BE_DETERMINED)
206
    {
207
      if (TYPE_INDEX_TYPE (type) != 0)
208
        {
209
          m2_print_bounds (TYPE_INDEX_TYPE (type), stream, show, -1, 0);
210
          fprintf_filtered (stream, "..");
211
          m2_print_bounds (TYPE_INDEX_TYPE (type), stream, show, -1, 1);
212
        }
213
      else
214
        fprintf_filtered (stream, "%d",
215
                          (TYPE_LENGTH (type)
216
                           / TYPE_LENGTH (TYPE_TARGET_TYPE (type))));
217
    }
218
  fprintf_filtered (stream, "] OF ");
219
  m2_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level);
220
}
221
 
222
static void
223
m2_pointer (struct type *type, struct ui_file *stream, int show,
224
            int level)
225
{
226
  if (TYPE_CONST (type))
227
    fprintf_filtered (stream, "[...] : ");
228
  else
229
    fprintf_filtered (stream, "POINTER TO ");
230
 
231
  m2_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level);
232
}
233
 
234
static void
235
m2_ref (struct type *type, struct ui_file *stream, int show,
236
        int level)
237
{
238
  fprintf_filtered (stream, "VAR");
239
  m2_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level);
240
}
241
 
242
static void
243
m2_unknown (const char *s, struct type *type, struct ui_file *stream,
244
            int show, int level)
245
{
246
  fprintf_filtered (stream, "%s %s", s, _("is unknown"));
247
}
248
 
249
static void m2_union (struct type *type, struct ui_file *stream)
250
{
251
  fprintf_filtered (stream, "union");
252
}
253
 
254
static void
255
m2_procedure (struct type *type, struct ui_file *stream,
256
              int show, int level)
257
{
258
  fprintf_filtered (stream, "PROCEDURE ");
259
  m2_type_name (type, stream);
260
  if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_VOID)
261
    {
262
      int i, len = TYPE_NFIELDS (type);
263
 
264
      fprintf_filtered (stream, " (");
265
      for (i = 0; i < len; i++)
266
        {
267
          if (i > 0)
268
            {
269
              fputs_filtered (", ", stream);
270
              wrap_here ("    ");
271
            }
272
          m2_print_type (TYPE_FIELD_TYPE (type, i), "", stream, -1, 0);
273
        }
274
      if (TYPE_TARGET_TYPE (type) != NULL)
275
        {
276
          fprintf_filtered (stream, " : ");
277
          m2_print_type (TYPE_TARGET_TYPE (type), "", stream, 0, 0);
278
        }
279
    }
280
}
281
 
282
static void
283
m2_print_bounds (struct type *type,
284
                 struct ui_file *stream, int show, int level,
285
                 int print_high)
286
{
287
  struct type *target = TYPE_TARGET_TYPE (type);
288
 
289
  if (target == NULL)
290
    target = builtin_type_int;
291
 
292
  if (TYPE_NFIELDS(type) == 0)
293
    return;
294
 
295
  if (print_high)
296
    print_type_scalar (target, TYPE_HIGH_BOUND (type), stream);
297
  else
298
    print_type_scalar (target, TYPE_LOW_BOUND (type), stream);
299
}
300
 
301
static void
302
m2_short_set (struct type *type, struct ui_file *stream, int show, int level)
303
{
304
  fprintf_filtered(stream, "SET [");
305
  m2_print_bounds (TYPE_INDEX_TYPE (type), stream,
306
                   show - 1, level, 0);
307
 
308
  fprintf_filtered(stream, "..");
309
  m2_print_bounds (TYPE_INDEX_TYPE (type), stream,
310
                   show - 1, level, 1);
311
  fprintf_filtered(stream, "]");
312
}
313
 
314
int
315
m2_is_long_set (struct type *type)
316
{
317
  LONGEST previous_high = 0;  /* unnecessary initialization
318
                                 keeps gcc -Wall happy */
319
  int len, i;
320
  struct type *range;
321
 
322
  if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
323
    {
324
 
325
      /* check if all fields of the RECORD are consecutive sets.  */
326
 
327
      len = TYPE_NFIELDS (type);
328
      for (i = TYPE_N_BASECLASSES (type); i < len; i++)
329
        {
330
          if (TYPE_FIELD_TYPE (type, i) == NULL)
331
            return 0;
332
          if (TYPE_CODE (TYPE_FIELD_TYPE (type, i)) != TYPE_CODE_SET)
333
            return 0;
334
          if (TYPE_FIELD_NAME (type, i) != NULL
335
              && (strcmp (TYPE_FIELD_NAME (type, i), "") != 0))
336
            return 0;
337
          range = TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, i));
338
          if ((i > TYPE_N_BASECLASSES (type))
339
              && previous_high + 1 != TYPE_LOW_BOUND (range))
340
            return 0;
341
          previous_high = TYPE_HIGH_BOUND (range);
342
        }
343
      return len>0;
344
    }
345
  return 0;
346
}
347
 
348
/* m2_get_discrete_bounds - a wrapper for get_discrete_bounds which
349
                            understands that CHARs might be signed.
350
                            This should be integrated into gdbtypes.c
351
                            inside get_discrete_bounds.  */
352
 
353
int
354
m2_get_discrete_bounds (struct type *type, LONGEST *lowp, LONGEST *highp)
355
{
356
  CHECK_TYPEDEF (type);
357
  switch (TYPE_CODE (type))
358
    {
359
    case TYPE_CODE_CHAR:
360
      if (TYPE_LENGTH (type) < sizeof (LONGEST))
361
        {
362
          if (!TYPE_UNSIGNED (type))
363
            {
364
              *lowp = -(1 << (TYPE_LENGTH (type) * TARGET_CHAR_BIT - 1));
365
              *highp = -*lowp - 1;
366
              return 0;
367
            }
368
        }
369
      /* fall through */
370
    default:
371
      return get_discrete_bounds (type, lowp, highp);
372
    }
373
}
374
 
375
/* m2_is_long_set_of_type - returns TRUE if the long set was declared as
376
                            SET OF <oftype> of_type is assigned to the
377
                            subtype.  */
378
 
379
int
380
m2_is_long_set_of_type (struct type *type, struct type **of_type)
381
{
382
  int len, i;
383
  struct type *range;
384
  struct type *target;
385
  LONGEST l1, l2;
386
  LONGEST h1, h2;
387
 
388
  if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
389
    {
390
      len = TYPE_NFIELDS (type);
391
      i = TYPE_N_BASECLASSES (type);
392
      if (len == 0)
393
        return 0;
394
      range = TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, i));
395
      target = TYPE_TARGET_TYPE (range);
396
      if (target == NULL)
397
        target = builtin_type_int;
398
 
399
      l1 = TYPE_LOW_BOUND (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, i)));
400
      h1 = TYPE_HIGH_BOUND (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, len-1)));
401
      *of_type = target;
402
      if (m2_get_discrete_bounds (target, &l2, &h2) >= 0)
403
        return (l1 == l2 && h1 == h2);
404
      error (_("long_set failed to find discrete bounds for its subtype"));
405
      return 0;
406
    }
407
  error (_("expecting long_set"));
408
  return 0;
409
}
410
 
411
static int
412
m2_long_set (struct type *type, struct ui_file *stream, int show, int level)
413
{
414
  struct type *index_type;
415
  struct type *range_type;
416
  struct type *of_type;
417
  int i;
418
  int len = TYPE_NFIELDS (type);
419
  LONGEST low;
420
  LONGEST high;
421
 
422
  if (m2_is_long_set (type))
423
    {
424
      if (TYPE_TAG_NAME (type) != NULL)
425
        {
426
          fputs_filtered (TYPE_TAG_NAME (type), stream);
427
          if (show == 0)
428
            return 1;
429
        }
430
      else if (TYPE_NAME (type) != NULL)
431
        {
432
          fputs_filtered (TYPE_NAME (type), stream);
433
          if (show == 0)
434
            return 1;
435
        }
436
 
437
      if (TYPE_TAG_NAME (type) != NULL || TYPE_NAME (type) != NULL)
438
        fputs_filtered (" = ", stream);
439
 
440
      if (get_long_set_bounds (type, &low, &high))
441
        {
442
          fprintf_filtered(stream, "SET OF ");
443
          i = TYPE_N_BASECLASSES (type);
444
          if (m2_is_long_set_of_type (type, &of_type))
445
            m2_print_type (of_type, "", stream, show - 1, level);
446
          else
447
            {
448
              fprintf_filtered(stream, "[");
449
              m2_print_bounds (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, i)),
450
                               stream, show - 1, level, 0);
451
 
452
              fprintf_filtered(stream, "..");
453
 
454
              m2_print_bounds (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, len-1)),
455
                               stream, show - 1, level, 1);
456
              fprintf_filtered(stream, "]");
457
            }
458
        }
459
      else
460
        /* i18n: Do not translate the "SET OF" part! */
461
        fprintf_filtered(stream, _("SET OF <unknown>"));
462
 
463
      return 1;
464
    }
465
  return 0;
466
}
467
 
468
/* m2_is_unbounded_array - returns TRUE if, type, should be regarded
469
                           as a Modula-2 unbounded ARRAY type.  */
470
 
471
int
472
m2_is_unbounded_array (struct type *type)
473
{
474
  if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
475
    {
476
      /*
477
       *  check if we have a structure with exactly two fields named
478
       *  _m2_contents and _m2_high.  It also checks to see if the
479
       *  type of _m2_contents is a pointer.  The TYPE_TARGET_TYPE
480
       *  of the pointer determines the unbounded ARRAY OF type.
481
       */
482
      if (TYPE_NFIELDS (type) != 2)
483
        return 0;
484
      if (strcmp (TYPE_FIELD_NAME (type, 0), "_m2_contents") != 0)
485
        return 0;
486
      if (strcmp (TYPE_FIELD_NAME (type, 1), "_m2_high") != 0)
487
        return 0;
488
      if (TYPE_CODE (TYPE_FIELD_TYPE (type, 0)) != TYPE_CODE_PTR)
489
        return 0;
490
      return 1;
491
    }
492
  return 0;
493
}
494
 
495
/* m2_unbounded_array - if the struct type matches a Modula-2 unbounded
496
                        parameter type then display the type as an
497
                        ARRAY OF type.  Returns TRUE if an unbounded
498
                        array type was detected.  */
499
 
500
static int
501
m2_unbounded_array (struct type *type, struct ui_file *stream, int show,
502
                    int level)
503
{
504
  if (m2_is_unbounded_array (type))
505
    {
506
      if (show > 0)
507
        {
508
          fputs_filtered ("ARRAY OF ", stream);
509
          m2_print_type (TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type, 0)),
510
                         "", stream, 0, level);
511
        }
512
      return 1;
513
    }
514
  return 0;
515
}
516
 
517
void
518
m2_record_fields (struct type *type, struct ui_file *stream, int show,
519
                  int level)
520
{
521
  /* Print the tag if it exists.  */
522
  if (TYPE_TAG_NAME (type) != NULL)
523
    {
524
      if (strncmp (TYPE_TAG_NAME (type), "$$", 2) != 0)
525
        {
526
          fputs_filtered (TYPE_TAG_NAME (type), stream);
527
          if (show > 0)
528
            fprintf_filtered (stream, " = ");
529
        }
530
    }
531
  wrap_here ("    ");
532
  if (show < 0)
533
    {
534
      if (TYPE_CODE (type) == DECLARED_TYPE_STRUCT)
535
        fprintf_filtered (stream, "RECORD ... END ");
536
      else if (TYPE_DECLARED_TYPE (type) == DECLARED_TYPE_UNION)
537
        fprintf_filtered (stream, "CASE ... END ");
538
    }
539
  else if (show > 0)
540
    {
541
      int i;
542
      int len = TYPE_NFIELDS (type);
543
 
544
      if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
545
        fprintf_filtered (stream, "RECORD\n");
546
      else if (TYPE_CODE (type) == TYPE_CODE_UNION)
547
        /* i18n: Do not translate "CASE" and "OF" */
548
        fprintf_filtered (stream, _("CASE <variant> OF\n"));
549
 
550
      for (i = TYPE_N_BASECLASSES (type); i < len; i++)
551
        {
552
          QUIT;
553
 
554
          print_spaces_filtered (level + 4, stream);
555
          fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
556
          fputs_filtered (" : ", stream);
557
          m2_print_type (TYPE_FIELD_TYPE (type, i),
558
                         "",
559
                         stream, 0, level + 4);
560
          if (TYPE_FIELD_PACKED (type, i))
561
            {
562
              /* It is a bitfield.  This code does not attempt
563
                 to look at the bitpos and reconstruct filler,
564
                 unnamed fields.  This would lead to misleading
565
                 results if the compiler does not put out fields
566
                 for such things (I don't know what it does).  */
567
              fprintf_filtered (stream, " : %d",
568
                                TYPE_FIELD_BITSIZE (type, i));
569
            }
570
          fprintf_filtered (stream, ";\n");
571
        }
572
 
573
      fprintfi_filtered (level, stream, "END ");
574
    }
575
}
576
 
577
void
578
m2_enum (struct type *type, struct ui_file *stream, int show, int level)
579
{
580
  int lastval, i, len;
581
 
582
  if (show < 0)
583
    {
584
      /* If we just printed a tag name, no need to print anything else.  */
585
      if (TYPE_TAG_NAME (type) == NULL)
586
        fprintf_filtered (stream, "(...)");
587
    }
588
  else if (show > 0 || TYPE_TAG_NAME (type) == NULL)
589
    {
590
      fprintf_filtered (stream, "(");
591
      len = TYPE_NFIELDS (type);
592
      lastval = 0;
593
      for (i = 0; i < len; i++)
594
        {
595
          QUIT;
596
          if (i > 0)
597
            fprintf_filtered (stream, ", ");
598
          wrap_here ("    ");
599
          fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
600
          if (lastval != TYPE_FIELD_BITPOS (type, i))
601
            {
602
              fprintf_filtered (stream, " = %d", TYPE_FIELD_BITPOS (type, i));
603
              lastval = TYPE_FIELD_BITPOS (type, i);
604
            }
605
          lastval++;
606
        }
607
      fprintf_filtered (stream, ")");
608
    }
609
}

powered by: WebSVN 2.1.0

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