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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.0/] [gdb/] [c-typeprint.c] - Blame information for rev 1774

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

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

powered by: WebSVN 2.1.0

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