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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.3/] [gdb/] [c-typeprint.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1181 sfurman
/* Support for printing C and C++ types for GDB, the GNU debugger.
2
   Copyright 1986, 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1998,
3
   1999, 2000, 2001, 2002
4
   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 2 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, write to the Free Software
20
   Foundation, Inc., 59 Temple Place - Suite 330,
21
   Boston, MA 02111-1307, USA.  */
22
 
23
#include "defs.h"
24
#include "gdb_obstack.h"
25
#include "bfd.h"                /* Binary File Description */
26
#include "symtab.h"
27
#include "gdbtypes.h"
28
#include "expression.h"
29
#include "value.h"
30
#include "gdbcore.h"
31
#include "target.h"
32
#include "language.h"
33
#include "demangle.h"
34
#include "c-lang.h"
35
#include "typeprint.h"
36
#include "cp-abi.h"
37
 
38
#include "gdb_string.h"
39
#include <errno.h>
40
 
41
/* Flag indicating target was compiled by HP compiler */
42
extern int hp_som_som_object_present;
43
 
44
static void cp_type_print_method_args (struct type *mtype, char *prefix,
45
                                       char *varstring, int staticp,
46
                                       struct ui_file *stream);
47
 
48
static void c_type_print_args (struct type *, struct ui_file *);
49
 
50
static void cp_type_print_derivation_info (struct ui_file *, struct type *);
51
 
52
void c_type_print_varspec_prefix (struct type *, struct ui_file *, int,
53
                                  int);
54
 
55
/* Print "const", "volatile", or address space modifiers. */
56
static void c_type_print_modifier (struct type *, struct ui_file *,
57
                                   int, int);
58
 
59
 
60
 
61
 
62
/* LEVEL is the depth to indent lines by.  */
63
 
64
void
65
c_print_type (struct type *type, char *varstring, struct ui_file *stream,
66
              int show, int level)
67
{
68
  register enum type_code code;
69
  int demangled_args;
70
 
71
  if (show > 0)
72
    CHECK_TYPEDEF (type);
73
 
74
  c_type_print_base (type, stream, show, level);
75
  code = TYPE_CODE (type);
76
  if ((varstring != NULL && *varstring != '\0')
77
      ||
78
  /* Need a space if going to print stars or brackets;
79
     but not if we will print just a type name.  */
80
      ((show > 0 || TYPE_NAME (type) == 0)
81
       &&
82
       (code == TYPE_CODE_PTR || code == TYPE_CODE_FUNC
83
        || code == TYPE_CODE_METHOD
84
        || code == TYPE_CODE_ARRAY
85
        || code == TYPE_CODE_MEMBER
86
        || code == TYPE_CODE_REF)))
87
    fputs_filtered (" ", stream);
88
  c_type_print_varspec_prefix (type, stream, show, 0);
89
 
90
  if (varstring != NULL)
91
    {
92
      fputs_filtered (varstring, stream);
93
 
94
      /* For demangled function names, we have the arglist as part of the name,
95
         so don't print an additional pair of ()'s */
96
 
97
      demangled_args = strchr (varstring, '(') != NULL;
98
      c_type_print_varspec_suffix (type, stream, show, 0, demangled_args);
99
    }
100
}
101
 
102
/* If TYPE is a derived type, then print out derivation information.
103
   Print only the actual base classes of this type, not the base classes
104
   of the base classes.  I.E.  for the derivation hierarchy:
105
 
106
   class A { int a; };
107
   class B : public A {int b; };
108
   class C : public B {int c; };
109
 
110
   Print the type of class C as:
111
 
112
   class C : public B {
113
   int c;
114
   }
115
 
116
   Not as the following (like gdb used to), which is not legal C++ syntax for
117
   derived types and may be confused with the multiple inheritance form:
118
 
119
   class C : public B : public A {
120
   int c;
121
   }
122
 
123
   In general, gdb should try to print the types as closely as possible to
124
   the form that they appear in the source code.
125
   Note that in case of protected derivation gcc will not say 'protected'
126
   but 'private'. The HP's aCC compiler emits specific information for
127
   derivation via protected inheritance, so gdb can print it out */
128
 
129
static void
130
cp_type_print_derivation_info (struct ui_file *stream, struct type *type)
131
{
132
  char *name;
133
  int i;
134
 
135
  for (i = 0; i < TYPE_N_BASECLASSES (type); i++)
136
    {
137
      fputs_filtered (i == 0 ? ": " : ", ", stream);
138
      fprintf_filtered (stream, "%s%s ",
139
                        BASETYPE_VIA_PUBLIC (type, i) ? "public"
140
               : (TYPE_FIELD_PROTECTED (type, i) ? "protected" : "private"),
141
                        BASETYPE_VIA_VIRTUAL (type, i) ? " virtual" : "");
142
      name = type_name_no_tag (TYPE_BASECLASS (type, i));
143
      fprintf_filtered (stream, "%s", name ? name : "(null)");
144
    }
145
  if (i > 0)
146
    {
147
      fputs_filtered (" ", stream);
148
    }
149
}
150
 
151
/* Print the C++ method arguments ARGS to the file STREAM.  */
152
 
153
static void
154
cp_type_print_method_args (struct type *mtype, char *prefix, char *varstring,
155
                           int staticp, struct ui_file *stream)
156
{
157
  struct field *args = TYPE_FIELDS (mtype);
158
  int nargs = TYPE_NFIELDS (mtype);
159
  int varargs = TYPE_VARARGS (mtype);
160
  int i;
161
 
162
  fprintf_symbol_filtered (stream, prefix, language_cplus, DMGL_ANSI);
163
  fprintf_symbol_filtered (stream, varstring, language_cplus, DMGL_ANSI);
164
  fputs_filtered ("(", stream);
165
 
166
  /* Skip the class variable.  */
167
  i = staticp ? 0 : 1;
168
  if (nargs > i)
169
    {
170
      while (i < nargs)
171
        {
172
          type_print (args[i++].type, "", stream, 0);
173
 
174
          if (i == nargs && varargs)
175
            fprintf_filtered (stream, ", ...");
176
          else if (i < nargs)
177
            fprintf_filtered (stream, ", ");
178
        }
179
    }
180
  else if (varargs)
181
    fprintf_filtered (stream, "...");
182
  else if (current_language->la_language == language_cplus)
183
    fprintf_filtered (stream, "void");
184
 
185
  fprintf_filtered (stream, ")");
186
}
187
 
188
 
189
/* Print any asterisks or open-parentheses needed before the
190
   variable name (to describe its type).
191
 
192
   On outermost call, pass 0 for PASSED_A_PTR.
193
   On outermost call, SHOW > 0 means should ignore
194
   any typename for TYPE and show its details.
195
   SHOW is always zero on recursive calls.  */
196
 
197
void
198
c_type_print_varspec_prefix (struct type *type, struct ui_file *stream,
199
                             int show, int passed_a_ptr)
200
{
201
  char *name;
202
  if (type == 0)
203
    return;
204
 
205
  if (TYPE_NAME (type) && show <= 0)
206
    return;
207
 
208
  QUIT;
209
 
210
  switch (TYPE_CODE (type))
211
    {
212
    case TYPE_CODE_PTR:
213
      c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 1);
214
      fprintf_filtered (stream, "*");
215
      c_type_print_modifier (type, stream, 1, 0);
216
      break;
217
 
218
    case TYPE_CODE_MEMBER:
219
      if (passed_a_ptr)
220
        fprintf_filtered (stream, "(");
221
      c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 0);
222
      fprintf_filtered (stream, " ");
223
      name = type_name_no_tag (TYPE_DOMAIN_TYPE (type));
224
      if (name)
225
        fputs_filtered (name, stream);
226
      else
227
        c_type_print_base (TYPE_DOMAIN_TYPE (type), stream, 0, passed_a_ptr);
228
      fprintf_filtered (stream, "::");
229
      break;
230
 
231
    case TYPE_CODE_METHOD:
232
      if (passed_a_ptr)
233
        fprintf_filtered (stream, "(");
234
      c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 0);
235
      if (passed_a_ptr)
236
        {
237
          fprintf_filtered (stream, " ");
238
          c_type_print_base (TYPE_DOMAIN_TYPE (type), stream, 0, passed_a_ptr);
239
          fprintf_filtered (stream, "::");
240
        }
241
      break;
242
 
243
    case TYPE_CODE_REF:
244
      c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 1);
245
      fprintf_filtered (stream, "&");
246
      c_type_print_modifier (type, stream, 1, 0);
247
      break;
248
 
249
    case TYPE_CODE_FUNC:
250
      c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 0);
251
      if (passed_a_ptr)
252
        fprintf_filtered (stream, "(");
253
      break;
254
 
255
    case TYPE_CODE_ARRAY:
256
      c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 0);
257
      if (passed_a_ptr)
258
        fprintf_filtered (stream, "(");
259
      break;
260
 
261
    case TYPE_CODE_UNDEF:
262
    case TYPE_CODE_STRUCT:
263
    case TYPE_CODE_UNION:
264
    case TYPE_CODE_ENUM:
265
    case TYPE_CODE_INT:
266
    case TYPE_CODE_FLT:
267
    case TYPE_CODE_VOID:
268
    case TYPE_CODE_ERROR:
269
    case TYPE_CODE_CHAR:
270
    case TYPE_CODE_BOOL:
271
    case TYPE_CODE_SET:
272
    case TYPE_CODE_RANGE:
273
    case TYPE_CODE_STRING:
274
    case TYPE_CODE_BITSTRING:
275
    case TYPE_CODE_COMPLEX:
276
    case TYPE_CODE_TYPEDEF:
277
    case TYPE_CODE_TEMPLATE:
278
      /* These types need no prefix.  They are listed here so that
279
         gcc -Wall will reveal any types that haven't been handled.  */
280
      break;
281
    default:
282
      error ("type not handled in c_type_print_varspec_prefix()");
283
      break;
284
    }
285
}
286
 
287
/* Print out "const" and "volatile" attributes.
288
   TYPE is a pointer to the type being printed out.
289
   STREAM is the output destination.
290
   NEED_SPACE = 1 indicates an initial white space is needed */
291
 
292
static void
293
c_type_print_modifier (struct type *type, struct ui_file *stream,
294
                       int need_pre_space, int need_post_space)
295
{
296
  int did_print_modifier = 0;
297
  char *address_space_id;
298
 
299
  /* We don't print `const' qualifiers for references --- since all
300
     operators affect the thing referenced, not the reference itself,
301
     every reference is `const'.  */
302
  if (TYPE_CONST (type)
303
      && TYPE_CODE (type) != TYPE_CODE_REF)
304
    {
305
      if (need_pre_space)
306
        fprintf_filtered (stream, " ");
307
      fprintf_filtered (stream, "const");
308
      did_print_modifier = 1;
309
    }
310
 
311
  if (TYPE_VOLATILE (type))
312
    {
313
      if (did_print_modifier || need_pre_space)
314
        fprintf_filtered (stream, " ");
315
      fprintf_filtered (stream, "volatile");
316
      did_print_modifier = 1;
317
    }
318
 
319
  address_space_id = address_space_int_to_name (TYPE_INSTANCE_FLAGS (type));
320
  if (address_space_id)
321
    {
322
      if (did_print_modifier || need_pre_space)
323
        fprintf_filtered (stream, " ");
324
      fprintf_filtered (stream, "@%s", address_space_id);
325
      did_print_modifier = 1;
326
    }
327
 
328
  if (did_print_modifier && need_post_space)
329
    fprintf_filtered (stream, " ");
330
}
331
 
332
 
333
 
334
 
335
static void
336
c_type_print_args (struct type *type, struct ui_file *stream)
337
{
338
  int i;
339
  struct field *args;
340
 
341
  fprintf_filtered (stream, "(");
342
  args = TYPE_FIELDS (type);
343
  if (args != NULL)
344
    {
345
      int i;
346
 
347
      /* FIXME drow/2002-05-31: Always skips the first argument,
348
         should we be checking for static members?  */
349
 
350
      for (i = 1; i < TYPE_NFIELDS (type); i++)
351
        {
352
          c_print_type (args[i].type, "", stream, -1, 0);
353
          if (i != TYPE_NFIELDS (type))
354
            {
355
              fprintf_filtered (stream, ",");
356
              wrap_here ("    ");
357
            }
358
        }
359
      if (TYPE_VARARGS (type))
360
        fprintf_filtered (stream, "...");
361
      else if (i == 1
362
               && (current_language->la_language == language_cplus))
363
        fprintf_filtered (stream, "void");
364
    }
365
  else if (current_language->la_language == language_cplus)
366
    {
367
      fprintf_filtered (stream, "void");
368
    }
369
 
370
  fprintf_filtered (stream, ")");
371
}
372
 
373
 
374
/* Return true iff the j'th overloading of the i'th method of TYPE
375
   is a type conversion operator, like `operator int () { ... }'.
376
   When listing a class's methods, we don't print the return type of
377
   such operators.  */
378
static int
379
is_type_conversion_operator (struct type *type, int i, int j)
380
{
381
  /* I think the whole idea of recognizing type conversion operators
382
     by their name is pretty terrible.  But I don't think our present
383
     data structure gives us any other way to tell.  If you know of
384
     some other way, feel free to rewrite this function.  */
385
  char *name = TYPE_FN_FIELDLIST_NAME (type, i);
386
 
387
  if (strncmp (name, "operator", 8) != 0)
388
    return 0;
389
 
390
  name += 8;
391
  if (! strchr (" \t\f\n\r", *name))
392
    return 0;
393
 
394
  while (strchr (" \t\f\n\r", *name))
395
    name++;
396
 
397
  if (!('a' <= *name && *name <= 'z')
398
      && !('A' <= *name && *name <= 'Z')
399
      && *name != '_')
400
    /* If this doesn't look like the start of an identifier, then it
401
       isn't a type conversion operator.  */
402
    return 0;
403
  else if (strncmp (name, "new", 3) == 0)
404
    name += 3;
405
  else if (strncmp (name, "delete", 6) == 0)
406
    name += 6;
407
  else
408
    /* If it doesn't look like new or delete, it's a type conversion
409
       operator.  */
410
    return 1;
411
 
412
  /* Is that really the end of the name?  */
413
  if (('a' <= *name && *name <= 'z')
414
      || ('A' <= *name && *name <= 'Z')
415
      || ('0' <= *name && *name <= '9')
416
      || *name == '_')
417
    /* No, so the identifier following "operator" must be a type name,
418
       and this is a type conversion operator.  */
419
    return 1;
420
 
421
  /* That was indeed the end of the name, so it was `operator new' or
422
     `operator delete', neither of which are type conversion operators.  */
423
  return 0;
424
}
425
 
426
 
427
/* Given a C++ qualified identifier QID, strip off the qualifiers,
428
   yielding the unqualified name.  The return value is a pointer into
429
   the original string.
430
 
431
   It's a pity we don't have this information in some more structured
432
   form.  Even the author of this function feels that writing little
433
   parsers like this everywhere is stupid.  */
434
static char *
435
remove_qualifiers (char *qid)
436
{
437
  int quoted = 0;                /* zero if we're not in quotes;
438
                                   '"' if we're in a double-quoted string;
439
                                   '\'' if we're in a single-quoted string.  */
440
  int depth = 0;         /* number of unclosed parens we've seen */
441
  char *parenstack = (char *) alloca (strlen (qid));
442
  char *scan;
443
  char *last = 0;                /* The character after the rightmost
444
                                   `::' token we've seen so far.  */
445
 
446
  for (scan = qid; *scan; scan++)
447
    {
448
      if (quoted)
449
        {
450
          if (*scan == quoted)
451
            quoted = 0;
452
          else if (*scan == '\\' && *(scan + 1))
453
            scan++;
454
        }
455
      else if (scan[0] == ':' && scan[1] == ':')
456
        {
457
          /* If we're inside parenthesis (i.e., an argument list) or
458
             angle brackets (i.e., a list of template arguments), then
459
             we don't record the position of this :: token, since it's
460
             not relevant to the top-level structure we're trying
461
             to operate on.  */
462
          if (depth == 0)
463
            {
464
              last = scan + 2;
465
              scan++;
466
            }
467
        }
468
      else if (*scan == '"' || *scan == '\'')
469
        quoted = *scan;
470
      else if (*scan == '(')
471
        parenstack[depth++] = ')';
472
      else if (*scan == '[')
473
        parenstack[depth++] = ']';
474
      /* We're going to treat <> as a pair of matching characters,
475
         since we're more likely to see those in template id's than
476
         real less-than characters.  What a crock.  */
477
      else if (*scan == '<')
478
        parenstack[depth++] = '>';
479
      else if (*scan == ')' || *scan == ']' || *scan == '>')
480
        {
481
          if (depth > 0 && parenstack[depth - 1] == *scan)
482
            depth--;
483
          else
484
            {
485
              /* We're going to do a little error recovery here.  If we
486
                 don't find a match for *scan on the paren stack, but
487
                 there is something lower on the stack that does match, we
488
                 pop the stack to that point.  */
489
              int i;
490
 
491
              for (i = depth - 1; i >= 0; i--)
492
                if (parenstack[i] == *scan)
493
                  {
494
                    depth = i;
495
                    break;
496
                  }
497
            }
498
        }
499
    }
500
 
501
  if (last)
502
    return last;
503
  else
504
    /* We didn't find any :: tokens at the top level, so declare the
505
       whole thing an unqualified identifier.  */
506
    return qid;
507
}
508
 
509
 
510
/* Print any array sizes, function arguments or close parentheses
511
   needed after the variable name (to describe its type).
512
   Args work like c_type_print_varspec_prefix.  */
513
 
514
void
515
c_type_print_varspec_suffix (struct type *type, struct ui_file *stream,
516
                             int show, int passed_a_ptr, int demangled_args)
517
{
518
  if (type == 0)
519
    return;
520
 
521
  if (TYPE_NAME (type) && show <= 0)
522
    return;
523
 
524
  QUIT;
525
 
526
  switch (TYPE_CODE (type))
527
    {
528
    case TYPE_CODE_ARRAY:
529
      if (passed_a_ptr)
530
        fprintf_filtered (stream, ")");
531
 
532
      fprintf_filtered (stream, "[");
533
      if (TYPE_LENGTH (type) >= 0 && TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0
534
        && TYPE_ARRAY_UPPER_BOUND_TYPE (type) != BOUND_CANNOT_BE_DETERMINED)
535
        fprintf_filtered (stream, "%d",
536
                          (TYPE_LENGTH (type)
537
                           / TYPE_LENGTH (TYPE_TARGET_TYPE (type))));
538
      fprintf_filtered (stream, "]");
539
 
540
      c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 0, 0);
541
      break;
542
 
543
    case TYPE_CODE_MEMBER:
544
      if (passed_a_ptr)
545
        fprintf_filtered (stream, ")");
546
      c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 0, 0);
547
      break;
548
 
549
    case TYPE_CODE_METHOD:
550
      if (passed_a_ptr)
551
        fprintf_filtered (stream, ")");
552
      c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 0, 0);
553
      if (passed_a_ptr)
554
        {
555
          c_type_print_args (type, stream);
556
        }
557
      break;
558
 
559
    case TYPE_CODE_PTR:
560
    case TYPE_CODE_REF:
561
      c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 1, 0);
562
      break;
563
 
564
    case TYPE_CODE_FUNC:
565
      if (passed_a_ptr)
566
        fprintf_filtered (stream, ")");
567
      if (!demangled_args)
568
        {
569
          int i, len = TYPE_NFIELDS (type);
570
          fprintf_filtered (stream, "(");
571
          if (len == 0
572
              && (TYPE_PROTOTYPED (type)
573
                  || current_language->la_language == language_cplus))
574
            {
575
              fprintf_filtered (stream, "void");
576
            }
577
          else
578
            for (i = 0; i < len; i++)
579
              {
580
                if (i > 0)
581
                  {
582
                    fputs_filtered (", ", stream);
583
                    wrap_here ("    ");
584
                  }
585
                c_print_type (TYPE_FIELD_TYPE (type, i), "", stream, -1, 0);
586
              }
587
          fprintf_filtered (stream, ")");
588
        }
589
      c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0,
590
                                   passed_a_ptr, 0);
591
      break;
592
 
593
    case TYPE_CODE_UNDEF:
594
    case TYPE_CODE_STRUCT:
595
    case TYPE_CODE_UNION:
596
    case TYPE_CODE_ENUM:
597
    case TYPE_CODE_INT:
598
    case TYPE_CODE_FLT:
599
    case TYPE_CODE_VOID:
600
    case TYPE_CODE_ERROR:
601
    case TYPE_CODE_CHAR:
602
    case TYPE_CODE_BOOL:
603
    case TYPE_CODE_SET:
604
    case TYPE_CODE_RANGE:
605
    case TYPE_CODE_STRING:
606
    case TYPE_CODE_BITSTRING:
607
    case TYPE_CODE_COMPLEX:
608
    case TYPE_CODE_TYPEDEF:
609
    case TYPE_CODE_TEMPLATE:
610
      /* These types do not need a suffix.  They are listed so that
611
         gcc -Wall will report types that may not have been considered.  */
612
      break;
613
    default:
614
      error ("type not handled in c_type_print_varspec_suffix()");
615
      break;
616
    }
617
}
618
 
619
/* Print the name of the type (or the ultimate pointer target,
620
   function value or array element), or the description of a
621
   structure or union.
622
 
623
   SHOW positive means print details about the type (e.g. enum values),
624
   and print structure elements passing SHOW - 1 for show.
625
   SHOW negative means just print the type name or struct tag if there is one.
626
   If there is no name, print something sensible but concise like
627
   "struct {...}".
628
   SHOW zero means just print the type name or struct tag if there is one.
629
   If there is no name, print something sensible but not as concise like
630
   "struct {int x; int y;}".
631
 
632
   LEVEL is the number of spaces to indent by.
633
   We increase it for some recursive calls.  */
634
 
635
void
636
c_type_print_base (struct type *type, struct ui_file *stream, int show,
637
                   int level)
638
{
639
  int i;
640
  int len, real_len;
641
  int lastval;
642
  char *mangled_name;
643
  char *demangled_name;
644
  char *demangled_no_static;
645
  enum
646
    {
647
      s_none, s_public, s_private, s_protected
648
    }
649
  section_type;
650
  int need_access_label = 0;
651
  int j, len2;
652
 
653
  QUIT;
654
 
655
  wrap_here ("    ");
656
  if (type == NULL)
657
    {
658
      fputs_filtered ("<type unknown>", stream);
659
      return;
660
    }
661
 
662
  /* When SHOW is zero or less, and there is a valid type name, then always
663
     just print the type name directly from the type.  */
664
  /* If we have "typedef struct foo {. . .} bar;" do we want to print it
665
     as "struct foo" or as "bar"?  Pick the latter, because C++ folk tend
666
     to expect things like "class5 *foo" rather than "struct class5 *foo".  */
667
 
668
  if (show <= 0
669
      && TYPE_NAME (type) != NULL)
670
    {
671
      c_type_print_modifier (type, stream, 0, 1);
672
      fputs_filtered (TYPE_NAME (type), stream);
673
      return;
674
    }
675
 
676
  CHECK_TYPEDEF (type);
677
 
678
  switch (TYPE_CODE (type))
679
    {
680
    case TYPE_CODE_TYPEDEF:
681
    case TYPE_CODE_ARRAY:
682
    case TYPE_CODE_PTR:
683
    case TYPE_CODE_MEMBER:
684
    case TYPE_CODE_REF:
685
    case TYPE_CODE_FUNC:
686
    case TYPE_CODE_METHOD:
687
      c_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level);
688
      break;
689
 
690
    case TYPE_CODE_STRUCT:
691
      c_type_print_modifier (type, stream, 0, 1);
692
      /* Note TYPE_CODE_STRUCT and TYPE_CODE_CLASS have the same value,
693
       * so we use another means for distinguishing them.
694
       */
695
      if (HAVE_CPLUS_STRUCT (type))
696
        {
697
          switch (TYPE_DECLARED_TYPE (type))
698
            {
699
            case DECLARED_TYPE_CLASS:
700
              fprintf_filtered (stream, "class ");
701
              break;
702
            case DECLARED_TYPE_UNION:
703
              fprintf_filtered (stream, "union ");
704
              break;
705
            case DECLARED_TYPE_STRUCT:
706
              fprintf_filtered (stream, "struct ");
707
              break;
708
            default:
709
              /* If there is a CPLUS_STRUCT, assume class if not
710
               * otherwise specified in the declared_type field.
711
               */
712
              fprintf_filtered (stream, "class ");
713
              break;
714
            }                   /* switch */
715
        }
716
      else
717
        {
718
          /* If not CPLUS_STRUCT, then assume it's a C struct */
719
          fprintf_filtered (stream, "struct ");
720
        }
721
      goto struct_union;
722
 
723
    case TYPE_CODE_UNION:
724
      c_type_print_modifier (type, stream, 0, 1);
725
      fprintf_filtered (stream, "union ");
726
 
727
    struct_union:
728
 
729
      /* Print the tag if it exists.
730
       * The HP aCC compiler emits
731
       * a spurious "{unnamed struct}"/"{unnamed union}"/"{unnamed enum}"
732
       * tag  for unnamed struct/union/enum's, which we don't
733
       * want to print.
734
       */
735
      if (TYPE_TAG_NAME (type) != NULL &&
736
          strncmp (TYPE_TAG_NAME (type), "{unnamed", 8))
737
        {
738
          fputs_filtered (TYPE_TAG_NAME (type), stream);
739
          if (show > 0)
740
            fputs_filtered (" ", stream);
741
        }
742
      wrap_here ("    ");
743
      if (show < 0)
744
        {
745
          /* If we just printed a tag name, no need to print anything else.  */
746
          if (TYPE_TAG_NAME (type) == NULL)
747
            fprintf_filtered (stream, "{...}");
748
        }
749
      else if (show > 0 || TYPE_TAG_NAME (type) == NULL)
750
        {
751
          cp_type_print_derivation_info (stream, type);
752
 
753
          fprintf_filtered (stream, "{\n");
754
          if ((TYPE_NFIELDS (type) == 0) && (TYPE_NFN_FIELDS (type) == 0))
755
            {
756
              if (TYPE_STUB (type))
757
                fprintfi_filtered (level + 4, stream, "<incomplete type>\n");
758
              else
759
                fprintfi_filtered (level + 4, stream, "<no data fields>\n");
760
            }
761
 
762
          /* Start off with no specific section type, so we can print
763
             one for the first field we find, and use that section type
764
             thereafter until we find another type. */
765
 
766
          section_type = s_none;
767
 
768
          /* For a class, if all members are private, there's no need
769
             for a "private:" label; similarly, for a struct or union
770
             masquerading as a class, if all members are public, there's
771
             no need for a "public:" label. */
772
 
773
          if ((TYPE_DECLARED_TYPE (type) == DECLARED_TYPE_CLASS) ||
774
              (TYPE_DECLARED_TYPE (type) == DECLARED_TYPE_TEMPLATE))
775
            {
776
              QUIT;
777
              len = TYPE_NFIELDS (type);
778
              for (i = TYPE_N_BASECLASSES (type); i < len; i++)
779
                if (!TYPE_FIELD_PRIVATE (type, i))
780
                  {
781
                    need_access_label = 1;
782
                    break;
783
                  }
784
              QUIT;
785
              if (!need_access_label)
786
                {
787
                  len2 = TYPE_NFN_FIELDS (type);
788
                  for (j = 0; j < len2; j++)
789
                    {
790
                      len = TYPE_FN_FIELDLIST_LENGTH (type, j);
791
                      for (i = 0; i < len; i++)
792
                        if (!TYPE_FN_FIELD_PRIVATE (TYPE_FN_FIELDLIST1 (type, j), i))
793
                          {
794
                            need_access_label = 1;
795
                            break;
796
                          }
797
                      if (need_access_label)
798
                        break;
799
                    }
800
                }
801
            }
802
          else if ((TYPE_DECLARED_TYPE (type) == DECLARED_TYPE_STRUCT) ||
803
                   (TYPE_DECLARED_TYPE (type) == DECLARED_TYPE_UNION))
804
            {
805
              QUIT;
806
              len = TYPE_NFIELDS (type);
807
              for (i = TYPE_N_BASECLASSES (type); i < len; i++)
808
                if (TYPE_FIELD_PRIVATE (type, i) || TYPE_FIELD_PROTECTED (type, i))
809
                  {
810
                    need_access_label = 1;
811
                    break;
812
                  }
813
              QUIT;
814
              if (!need_access_label)
815
                {
816
                  len2 = TYPE_NFN_FIELDS (type);
817
                  for (j = 0; j < len2; j++)
818
                    {
819
                      QUIT;
820
                      len = TYPE_FN_FIELDLIST_LENGTH (type, j);
821
                      for (i = 0; i < len; i++)
822
                        if (TYPE_FN_FIELD_PRIVATE (TYPE_FN_FIELDLIST1 (type, j), i) ||
823
                            TYPE_FN_FIELD_PROTECTED (TYPE_FN_FIELDLIST1 (type, j), i))
824
                          {
825
                            need_access_label = 1;
826
                            break;
827
                          }
828
                      if (need_access_label)
829
                        break;
830
                    }
831
                }
832
            }
833
 
834
          /* If there is a base class for this type,
835
             do not print the field that it occupies.  */
836
 
837
          len = TYPE_NFIELDS (type);
838
          for (i = TYPE_N_BASECLASSES (type); i < len; i++)
839
            {
840
              QUIT;
841
              /* Don't print out virtual function table.  */
842
              /* HP ANSI C++ case */
843
              if (TYPE_HAS_VTABLE (type) && (STREQN (TYPE_FIELD_NAME (type, i), "__vfp", 5)))
844
                continue;
845
              /* Other compilers */
846
              if (STREQN (TYPE_FIELD_NAME (type, i), "_vptr", 5)
847
                  && is_cplus_marker ((TYPE_FIELD_NAME (type, i))[5]))
848
                continue;
849
 
850
              /* If this is a C++ class we can print the various C++ section
851
                 labels. */
852
 
853
              if (HAVE_CPLUS_STRUCT (type) && need_access_label)
854
                {
855
                  if (TYPE_FIELD_PROTECTED (type, i))
856
                    {
857
                      if (section_type != s_protected)
858
                        {
859
                          section_type = s_protected;
860
                          fprintfi_filtered (level + 2, stream,
861
                                             "protected:\n");
862
                        }
863
                    }
864
                  else if (TYPE_FIELD_PRIVATE (type, i))
865
                    {
866
                      if (section_type != s_private)
867
                        {
868
                          section_type = s_private;
869
                          fprintfi_filtered (level + 2, stream, "private:\n");
870
                        }
871
                    }
872
                  else
873
                    {
874
                      if (section_type != s_public)
875
                        {
876
                          section_type = s_public;
877
                          fprintfi_filtered (level + 2, stream, "public:\n");
878
                        }
879
                    }
880
                }
881
 
882
              print_spaces_filtered (level + 4, stream);
883
              if (TYPE_FIELD_STATIC (type, i))
884
                {
885
                  fprintf_filtered (stream, "static ");
886
                }
887
              c_print_type (TYPE_FIELD_TYPE (type, i),
888
                            TYPE_FIELD_NAME (type, i),
889
                            stream, show - 1, level + 4);
890
              if (!TYPE_FIELD_STATIC (type, i)
891
                  && TYPE_FIELD_PACKED (type, i))
892
                {
893
                  /* It is a bitfield.  This code does not attempt
894
                     to look at the bitpos and reconstruct filler,
895
                     unnamed fields.  This would lead to misleading
896
                     results if the compiler does not put out fields
897
                     for such things (I don't know what it does).  */
898
                  fprintf_filtered (stream, " : %d",
899
                                    TYPE_FIELD_BITSIZE (type, i));
900
                }
901
              fprintf_filtered (stream, ";\n");
902
            }
903
 
904
          /* If there are both fields and methods, put a blank line
905
              between them.  Make sure to count only method that we will
906
              display; artificial methods will be hidden.  */
907
          len = TYPE_NFN_FIELDS (type);
908
          real_len = 0;
909
          for (i = 0; i < len; i++)
910
            {
911
              struct fn_field *f = TYPE_FN_FIELDLIST1 (type, i);
912
              int len2 = TYPE_FN_FIELDLIST_LENGTH (type, i);
913
              int j;
914
              for (j = 0; j < len2; j++)
915
                if (!TYPE_FN_FIELD_ARTIFICIAL (f, j))
916
                  real_len++;
917
            }
918
          if (real_len > 0 && section_type != s_none)
919
            fprintf_filtered (stream, "\n");
920
 
921
          /* C++: print out the methods */
922
          for (i = 0; i < len; i++)
923
            {
924
              struct fn_field *f = TYPE_FN_FIELDLIST1 (type, i);
925
              int j, len2 = TYPE_FN_FIELDLIST_LENGTH (type, i);
926
              char *method_name = TYPE_FN_FIELDLIST_NAME (type, i);
927
              char *name = type_name_no_tag (type);
928
              int is_constructor = name && STREQ (method_name, name);
929
              for (j = 0; j < len2; j++)
930
                {
931
                  char *physname = TYPE_FN_FIELD_PHYSNAME (f, j);
932
                  int is_full_physname_constructor =
933
                   is_constructor_name (physname)
934
                   || is_destructor_name (physname)
935
                   || method_name[0] == '~';
936
 
937
                  /* Do not print out artificial methods.  */
938
                  if (TYPE_FN_FIELD_ARTIFICIAL (f, j))
939
                    continue;
940
 
941
                  QUIT;
942
                  if (TYPE_FN_FIELD_PROTECTED (f, j))
943
                    {
944
                      if (section_type != s_protected)
945
                        {
946
                          section_type = s_protected;
947
                          fprintfi_filtered (level + 2, stream,
948
                                             "protected:\n");
949
                        }
950
                    }
951
                  else if (TYPE_FN_FIELD_PRIVATE (f, j))
952
                    {
953
                      if (section_type != s_private)
954
                        {
955
                          section_type = s_private;
956
                          fprintfi_filtered (level + 2, stream, "private:\n");
957
                        }
958
                    }
959
                  else
960
                    {
961
                      if (section_type != s_public)
962
                        {
963
                          section_type = s_public;
964
                          fprintfi_filtered (level + 2, stream, "public:\n");
965
                        }
966
                    }
967
 
968
                  print_spaces_filtered (level + 4, stream);
969
                  if (TYPE_FN_FIELD_VIRTUAL_P (f, j))
970
                    fprintf_filtered (stream, "virtual ");
971
                  else if (TYPE_FN_FIELD_STATIC_P (f, j))
972
                    fprintf_filtered (stream, "static ");
973
                  if (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j)) == 0)
974
                    {
975
                      /* Keep GDB from crashing here.  */
976
                      fprintf_filtered (stream, "<undefined type> %s;\n",
977
                                        TYPE_FN_FIELD_PHYSNAME (f, j));
978
                      break;
979
                    }
980
                  else if (!is_constructor &&   /* constructors don't have declared types */
981
                           !is_full_physname_constructor &&     /*    " "  */
982
                           !is_type_conversion_operator (type, i, j))
983
                    {
984
                      type_print (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j)),
985
                                  "", stream, -1);
986
                      fputs_filtered (" ", stream);
987
                    }
988
                  if (TYPE_FN_FIELD_STUB (f, j))
989
                    /* Build something we can demangle.  */
990
                    mangled_name = gdb_mangle_name (type, i, j);
991
                  else
992
                    mangled_name = TYPE_FN_FIELD_PHYSNAME (f, j);
993
 
994
                  demangled_name =
995
                    cplus_demangle (mangled_name,
996
                                    DMGL_ANSI | DMGL_PARAMS);
997
                  if (demangled_name == NULL)
998
                    {
999
                      /* in some cases (for instance with the HP demangling),
1000
                         if a function has more than 10 arguments,
1001
                         the demangling will fail.
1002
                         Let's try to reconstruct the function signature from
1003
                         the symbol information */
1004
                      if (!TYPE_FN_FIELD_STUB (f, j))
1005
                        {
1006
                          int staticp = TYPE_FN_FIELD_STATIC_P (f, j);
1007
                          struct type *mtype = TYPE_FN_FIELD_TYPE (f, j);
1008
                          cp_type_print_method_args (mtype,
1009
                                                     "",
1010
                                                     method_name,
1011
                                                     staticp,
1012
                                                     stream);
1013
                        }
1014
                      else
1015
                        fprintf_filtered (stream, "<badly mangled name '%s'>",
1016
                                          mangled_name);
1017
                    }
1018
                  else
1019
                    {
1020
                      char *p;
1021
                      char *demangled_no_class
1022
                        = remove_qualifiers (demangled_name);
1023
 
1024
                      /* get rid of the `static' appended by the demangler */
1025
                      p = strstr (demangled_no_class, " static");
1026
                      if (p != NULL)
1027
                        {
1028
                          int length = p - demangled_no_class;
1029
                          demangled_no_static = (char *) xmalloc (length + 1);
1030
                          strncpy (demangled_no_static, demangled_no_class, length);
1031
                          *(demangled_no_static + length) = '\0';
1032
                          fputs_filtered (demangled_no_static, stream);
1033
                          xfree (demangled_no_static);
1034
                        }
1035
                      else
1036
                        fputs_filtered (demangled_no_class, stream);
1037
                      xfree (demangled_name);
1038
                    }
1039
 
1040
                  if (TYPE_FN_FIELD_STUB (f, j))
1041
                    xfree (mangled_name);
1042
 
1043
                  fprintf_filtered (stream, ";\n");
1044
                }
1045
            }
1046
 
1047
          fprintfi_filtered (level, stream, "}");
1048
 
1049
          if (TYPE_LOCALTYPE_PTR (type) && show >= 0)
1050
            fprintfi_filtered (level, stream, " (Local at %s:%d)\n",
1051
                               TYPE_LOCALTYPE_FILE (type),
1052
                               TYPE_LOCALTYPE_LINE (type));
1053
        }
1054
      if (TYPE_CODE (type) == TYPE_CODE_TEMPLATE)
1055
        goto go_back;
1056
      break;
1057
 
1058
    case TYPE_CODE_ENUM:
1059
      c_type_print_modifier (type, stream, 0, 1);
1060
      /* HP C supports sized enums */
1061
      if (hp_som_som_object_present)
1062
        switch (TYPE_LENGTH (type))
1063
          {
1064
          case 1:
1065
            fputs_filtered ("char ", stream);
1066
            break;
1067
          case 2:
1068
            fputs_filtered ("short ", stream);
1069
            break;
1070
          default:
1071
            break;
1072
          }
1073
      fprintf_filtered (stream, "enum ");
1074
      /* Print the tag name if it exists.
1075
         The aCC compiler emits a spurious
1076
         "{unnamed struct}"/"{unnamed union}"/"{unnamed enum}"
1077
         tag for unnamed struct/union/enum's, which we don't
1078
         want to print. */
1079
      if (TYPE_TAG_NAME (type) != NULL &&
1080
          strncmp (TYPE_TAG_NAME (type), "{unnamed", 8))
1081
        {
1082
          fputs_filtered (TYPE_TAG_NAME (type), stream);
1083
          if (show > 0)
1084
            fputs_filtered (" ", stream);
1085
        }
1086
 
1087
      wrap_here ("    ");
1088
      if (show < 0)
1089
        {
1090
          /* If we just printed a tag name, no need to print anything else.  */
1091
          if (TYPE_TAG_NAME (type) == NULL)
1092
            fprintf_filtered (stream, "{...}");
1093
        }
1094
      else if (show > 0 || TYPE_TAG_NAME (type) == NULL)
1095
        {
1096
          fprintf_filtered (stream, "{");
1097
          len = TYPE_NFIELDS (type);
1098
          lastval = 0;
1099
          for (i = 0; i < len; i++)
1100
            {
1101
              QUIT;
1102
              if (i)
1103
                fprintf_filtered (stream, ", ");
1104
              wrap_here ("    ");
1105
              fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
1106
              if (lastval != TYPE_FIELD_BITPOS (type, i))
1107
                {
1108
                  fprintf_filtered (stream, " = %d", TYPE_FIELD_BITPOS (type, i));
1109
                  lastval = TYPE_FIELD_BITPOS (type, i);
1110
                }
1111
              lastval++;
1112
            }
1113
          fprintf_filtered (stream, "}");
1114
        }
1115
      break;
1116
 
1117
    case TYPE_CODE_VOID:
1118
      fprintf_filtered (stream, "void");
1119
      break;
1120
 
1121
    case TYPE_CODE_UNDEF:
1122
      fprintf_filtered (stream, "struct <unknown>");
1123
      break;
1124
 
1125
    case TYPE_CODE_ERROR:
1126
      fprintf_filtered (stream, "<unknown type>");
1127
      break;
1128
 
1129
    case TYPE_CODE_RANGE:
1130
      /* This should not occur */
1131
      fprintf_filtered (stream, "<range type>");
1132
      break;
1133
 
1134
    case TYPE_CODE_TEMPLATE:
1135
      /* Called on "ptype t" where "t" is a template.
1136
         Prints the template header (with args), e.g.:
1137
         template <class T1, class T2> class "
1138
         and then merges with the struct/union/class code to
1139
         print the rest of the definition. */
1140
      c_type_print_modifier (type, stream, 0, 1);
1141
      fprintf_filtered (stream, "template <");
1142
      for (i = 0; i < TYPE_NTEMPLATE_ARGS (type); i++)
1143
        {
1144
          struct template_arg templ_arg;
1145
          templ_arg = TYPE_TEMPLATE_ARG (type, i);
1146
          fprintf_filtered (stream, "class %s", templ_arg.name);
1147
          if (i < TYPE_NTEMPLATE_ARGS (type) - 1)
1148
            fprintf_filtered (stream, ", ");
1149
        }
1150
      fprintf_filtered (stream, "> class ");
1151
      /* Yuck, factor this out to a subroutine so we can call
1152
         it and return to the point marked with the "goback:" label... - RT */
1153
      goto struct_union;
1154
    go_back:
1155
      if (TYPE_NINSTANTIATIONS (type) > 0)
1156
        {
1157
          fprintf_filtered (stream, "\ntemplate instantiations:\n");
1158
          for (i = 0; i < TYPE_NINSTANTIATIONS (type); i++)
1159
            {
1160
              fprintf_filtered (stream, "  ");
1161
              c_type_print_base (TYPE_INSTANTIATION (type, i), stream, 0, level);
1162
              if (i < TYPE_NINSTANTIATIONS (type) - 1)
1163
                fprintf_filtered (stream, "\n");
1164
            }
1165
        }
1166
      break;
1167
 
1168
    default:
1169
      /* Handle types not explicitly handled by the other cases,
1170
         such as fundamental types.  For these, just print whatever
1171
         the type name is, as recorded in the type itself.  If there
1172
         is no type name, then complain. */
1173
      if (TYPE_NAME (type) != NULL)
1174
        {
1175
          c_type_print_modifier (type, stream, 0, 1);
1176
          fputs_filtered (TYPE_NAME (type), stream);
1177
        }
1178
      else
1179
        {
1180
          /* At least for dump_symtab, it is important that this not be
1181
             an error ().  */
1182
          fprintf_filtered (stream, "<invalid type code %d>",
1183
                            TYPE_CODE (type));
1184
        }
1185
      break;
1186
    }
1187
}

powered by: WebSVN 2.1.0

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