gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gdb / p-typeprint.c
CommitLineData
373a8247 1/* Support for printing Pascal types for GDB, the GNU debugger.
b811d2c2 2 Copyright (C) 2000-2020 Free Software Foundation, Inc.
373a8247
PM
3
4 This file is part of GDB.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
a9762ec7 8 the Free Software Foundation; either version 3 of the License, or
373a8247
PM
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
a9762ec7 17 along with this program. If not, see <http://www.gnu.org/licenses/>. */
373a8247
PM
18
19/* This file is derived from p-typeprint.c */
20
21#include "defs.h"
04ea0df1 22#include "gdb_obstack.h"
373a8247
PM
23#include "bfd.h" /* Binary File Description */
24#include "symtab.h"
25#include "gdbtypes.h"
26#include "expression.h"
27#include "value.h"
28#include "gdbcore.h"
29#include "target.h"
373a8247 30#include "language.h"
373a8247
PM
31#include "p-lang.h"
32#include "typeprint.h"
50f182aa 33#include "gdb-demangle.h"
373a8247 34#include <ctype.h>
7f6aba03 35#include "cli/cli-style.h"
373a8247 36
3e43a32a 37static void pascal_type_print_varspec_suffix (struct type *, struct ui_file *,
79d43c61
TT
38 int, int, int,
39 const struct type_print_options *);
373a8247 40
3e43a32a
MS
41static void pascal_type_print_derivation_info (struct ui_file *,
42 struct type *);
373a8247 43
373a8247
PM
44\f
45
46/* LEVEL is the depth to indent lines by. */
47
48void
25b524e8 49pascal_print_type (struct type *type, const char *varstring,
79d43c61
TT
50 struct ui_file *stream, int show, int level,
51 const struct type_print_options *flags)
373a8247 52{
52f0bd74 53 enum type_code code;
373a8247
PM
54 int demangled_args;
55
78134374 56 code = type->code ();
373a8247
PM
57
58 if (show > 0)
f168693b 59 type = check_typedef (type);
373a8247 60
3e9313ab
PM
61 if ((code == TYPE_CODE_FUNC
62 || code == TYPE_CODE_METHOD))
373a8247 63 {
79d43c61 64 pascal_type_print_varspec_prefix (type, stream, show, 0, flags);
373a8247
PM
65 }
66 /* first the name */
67 fputs_filtered (varstring, stream);
68
3e9313ab
PM
69 if ((varstring != NULL && *varstring != '\0')
70 && !(code == TYPE_CODE_FUNC
71 || code == TYPE_CODE_METHOD))
373a8247
PM
72 {
73 fputs_filtered (" : ", stream);
74 }
75
3e9313ab
PM
76 if (!(code == TYPE_CODE_FUNC
77 || code == TYPE_CODE_METHOD))
373a8247 78 {
79d43c61 79 pascal_type_print_varspec_prefix (type, stream, show, 0, flags);
373a8247
PM
80 }
81
79d43c61 82 pascal_type_print_base (type, stream, show, level, flags);
373a8247 83 /* For demangled function names, we have the arglist as part of the name,
0df8b418 84 so don't print an additional pair of ()'s. */
373a8247
PM
85
86 demangled_args = varstring ? strchr (varstring, '(') != NULL : 0;
79d43c61
TT
87 pascal_type_print_varspec_suffix (type, stream, show, 0, demangled_args,
88 flags);
373a8247
PM
89
90}
91
5c6ce71d
TT
92/* Print a typedef using Pascal syntax. TYPE is the underlying type.
93 NEW_SYMBOL is the symbol naming the type. STREAM is the stream on
94 which to print. */
95
96void
97pascal_print_typedef (struct type *type, struct symbol *new_symbol,
98 struct ui_file *stream)
99{
f168693b 100 type = check_typedef (type);
5c6ce71d 101 fprintf_filtered (stream, "type ");
987012b8 102 fprintf_filtered (stream, "%s = ", new_symbol->print_name ());
5c6ce71d 103 type_print (type, "", stream, 0);
e1709896 104 fprintf_filtered (stream, ";");
5c6ce71d
TT
105}
106
373a8247
PM
107/* If TYPE is a derived type, then print out derivation information.
108 Print only the actual base classes of this type, not the base classes
0df8b418 109 of the base classes. I.e. for the derivation hierarchy:
373a8247
PM
110
111 class A { int a; };
112 class B : public A {int b; };
113 class C : public B {int c; };
114
115 Print the type of class C as:
116
117 class C : public B {
118 int c;
119 }
120
121 Not as the following (like gdb used to), which is not legal C++ syntax for
122 derived types and may be confused with the multiple inheritance form:
123
124 class C : public B : public A {
125 int c;
126 }
127
128 In general, gdb should try to print the types as closely as possible to
0df8b418 129 the form that they appear in the source code. */
373a8247
PM
130
131static void
fba45db2 132pascal_type_print_derivation_info (struct ui_file *stream, struct type *type)
373a8247 133{
0d5cff50 134 const char *name;
373a8247
PM
135 int i;
136
137 for (i = 0; i < TYPE_N_BASECLASSES (type); i++)
138 {
139 fputs_filtered (i == 0 ? ": " : ", ", stream);
140 fprintf_filtered (stream, "%s%s ",
141 BASETYPE_VIA_PUBLIC (type, i) ? "public" : "private",
142 BASETYPE_VIA_VIRTUAL (type, i) ? " virtual" : "");
7d93a1e0 143 name = TYPE_BASECLASS (type, i)->name ();
373a8247
PM
144 fprintf_filtered (stream, "%s", name ? name : "(null)");
145 }
146 if (i > 0)
147 {
148 fputs_filtered (" ", stream);
149 }
150}
151
152/* Print the Pascal method arguments ARGS to the file STREAM. */
153
154void
1d06ead6 155pascal_type_print_method_args (const char *physname, const char *methodname,
fba45db2 156 struct ui_file *stream)
373a8247 157{
61012eef
GB
158 int is_constructor = (startswith (physname, "__ct__"));
159 int is_destructor = (startswith (physname, "__dt__"));
373a8247 160
c96d965c 161 if (is_constructor || is_destructor)
373a8247 162 {
c96d965c
MS
163 physname += 6;
164 }
00b8699c 165
c96d965c 166 fputs_filtered (methodname, stream);
00b8699c 167
c96d965c
MS
168 if (physname && (*physname != 0))
169 {
373a8247 170 fputs_filtered (" (", stream);
0df8b418 171 /* We must demangle this. */
8ce17b9a 172 while (isdigit (physname[0]))
373a8247 173 {
3a9d7214 174 int len = 0;
1d06ead6 175 int i, j;
3a9d7214
PM
176 char *argname;
177
8ce17b9a 178 while (isdigit (physname[len]))
373a8247
PM
179 {
180 len++;
181 }
182 i = strtol (physname, &argname, 0);
183 physname += len;
1d06ead6
TT
184
185 for (j = 0; j < i; ++j)
d0e7e15a 186 fputc_filtered (physname[j], stream);
1d06ead6 187
373a8247
PM
188 physname += i;
189 if (physname[0] != 0)
190 {
191 fputs_filtered (", ", stream);
192 }
193 }
194 fputs_filtered (")", stream);
195 }
196}
197
198/* Print any asterisks or open-parentheses needed before the
199 variable name (to describe its type).
200
201 On outermost call, pass 0 for PASSED_A_PTR.
202 On outermost call, SHOW > 0 means should ignore
203 any typename for TYPE and show its details.
204 SHOW is always zero on recursive calls. */
205
206void
fba45db2 207pascal_type_print_varspec_prefix (struct type *type, struct ui_file *stream,
79d43c61
TT
208 int show, int passed_a_ptr,
209 const struct type_print_options *flags)
373a8247 210{
373a8247
PM
211 if (type == 0)
212 return;
213
7d93a1e0 214 if (type->name () && show <= 0)
373a8247
PM
215 return;
216
217 QUIT;
218
78134374 219 switch (type->code ())
373a8247
PM
220 {
221 case TYPE_CODE_PTR:
222 fprintf_filtered (stream, "^");
79d43c61
TT
223 pascal_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 1,
224 flags);
0df8b418
MS
225 break; /* Pointer should be handled normally
226 in pascal. */
373a8247 227
373a8247
PM
228 case TYPE_CODE_METHOD:
229 if (passed_a_ptr)
230 fprintf_filtered (stream, "(");
7022349d 231 if (TYPE_TARGET_TYPE (type) != NULL
78134374 232 && TYPE_TARGET_TYPE (type)->code () != TYPE_CODE_VOID)
373a8247
PM
233 {
234 fprintf_filtered (stream, "function ");
235 }
236 else
237 {
238 fprintf_filtered (stream, "procedure ");
239 }
240
241 if (passed_a_ptr)
242 {
243 fprintf_filtered (stream, " ");
4bfb94b8 244 pascal_type_print_base (TYPE_SELF_TYPE (type),
79d43c61 245 stream, 0, passed_a_ptr, flags);
373a8247
PM
246 fprintf_filtered (stream, "::");
247 }
248 break;
249
250 case TYPE_CODE_REF:
79d43c61
TT
251 pascal_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 1,
252 flags);
373a8247
PM
253 fprintf_filtered (stream, "&");
254 break;
255
256 case TYPE_CODE_FUNC:
257 if (passed_a_ptr)
258 fprintf_filtered (stream, "(");
259
7022349d 260 if (TYPE_TARGET_TYPE (type) != NULL
78134374 261 && TYPE_TARGET_TYPE (type)->code () != TYPE_CODE_VOID)
373a8247
PM
262 {
263 fprintf_filtered (stream, "function ");
264 }
265 else
266 {
267 fprintf_filtered (stream, "procedure ");
268 }
269
270 break;
271
272 case TYPE_CODE_ARRAY:
273 if (passed_a_ptr)
274 fprintf_filtered (stream, "(");
275 fprintf_filtered (stream, "array ");
d5d6fca5 276 if (TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0
d78df370 277 && !TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type))
43bbcdc2
PH
278 fprintf_filtered (stream, "[%s..%s] ",
279 plongest (TYPE_ARRAY_LOWER_BOUND_VALUE (type)),
280 plongest (TYPE_ARRAY_UPPER_BOUND_VALUE (type)));
373a8247
PM
281 fprintf_filtered (stream, "of ");
282 break;
283
284 case TYPE_CODE_UNDEF:
285 case TYPE_CODE_STRUCT:
286 case TYPE_CODE_UNION:
287 case TYPE_CODE_ENUM:
288 case TYPE_CODE_INT:
289 case TYPE_CODE_FLT:
290 case TYPE_CODE_VOID:
291 case TYPE_CODE_ERROR:
292 case TYPE_CODE_CHAR:
293 case TYPE_CODE_BOOL:
294 case TYPE_CODE_SET:
295 case TYPE_CODE_RANGE:
296 case TYPE_CODE_STRING:
373a8247
PM
297 case TYPE_CODE_COMPLEX:
298 case TYPE_CODE_TYPEDEF:
373a8247
PM
299 /* These types need no prefix. They are listed here so that
300 gcc -Wall will reveal any types that haven't been handled. */
301 break;
302 default:
8a3fe4f8 303 error (_("type not handled in pascal_type_print_varspec_prefix()"));
373a8247
PM
304 break;
305 }
306}
307
373a8247 308static void
79d43c61
TT
309pascal_print_func_args (struct type *type, struct ui_file *stream,
310 const struct type_print_options *flags)
373a8247 311{
1f704f76 312 int i, len = type->num_fields ();
ad3bbd48 313
373a8247
PM
314 if (len)
315 {
316 fprintf_filtered (stream, "(");
317 }
318 for (i = 0; i < len; i++)
319 {
320 if (i > 0)
321 {
322 fputs_filtered (", ", stream);
323 wrap_here (" ");
324 }
0df8b418 325 /* Can we find if it is a var parameter ??
373a8247
PM
326 if ( TYPE_FIELD(type, i) == )
327 {
328 fprintf_filtered (stream, "var ");
329 } */
3e43a32a
MS
330 pascal_print_type (TYPE_FIELD_TYPE (type, i), "" /* TYPE_FIELD_NAME
331 seems invalid! */
79d43c61 332 ,stream, -1, 0, flags);
373a8247
PM
333 }
334 if (len)
335 {
336 fprintf_filtered (stream, ")");
337 }
338}
339
7022349d
PA
340/* Helper for pascal_type_print_varspec_suffix to print the suffix of
341 a function or method. */
342
343static void
344pascal_type_print_func_varspec_suffix (struct type *type, struct ui_file *stream,
345 int show, int passed_a_ptr,
346 int demangled_args,
347 const struct type_print_options *flags)
348{
349 if (TYPE_TARGET_TYPE (type) == NULL
78134374 350 || TYPE_TARGET_TYPE (type)->code () != TYPE_CODE_VOID)
7022349d
PA
351 {
352 fprintf_filtered (stream, " : ");
353 pascal_type_print_varspec_prefix (TYPE_TARGET_TYPE (type),
354 stream, 0, 0, flags);
355
356 if (TYPE_TARGET_TYPE (type) == NULL)
357 type_print_unknown_return_type (stream);
358 else
359 pascal_type_print_base (TYPE_TARGET_TYPE (type), stream, show, 0,
360 flags);
361
362 pascal_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0,
363 passed_a_ptr, 0, flags);
364 }
365}
366
373a8247
PM
367/* Print any array sizes, function arguments or close parentheses
368 needed after the variable name (to describe its type).
369 Args work like pascal_type_print_varspec_prefix. */
370
371static void
fba45db2
KB
372pascal_type_print_varspec_suffix (struct type *type, struct ui_file *stream,
373 int show, int passed_a_ptr,
79d43c61
TT
374 int demangled_args,
375 const struct type_print_options *flags)
373a8247
PM
376{
377 if (type == 0)
378 return;
379
7d93a1e0 380 if (type->name () && show <= 0)
373a8247
PM
381 return;
382
383 QUIT;
384
78134374 385 switch (type->code ())
373a8247
PM
386 {
387 case TYPE_CODE_ARRAY:
388 if (passed_a_ptr)
389 fprintf_filtered (stream, ")");
390 break;
391
373a8247
PM
392 case TYPE_CODE_METHOD:
393 if (passed_a_ptr)
394 fprintf_filtered (stream, ")");
395 pascal_type_print_method_args ("",
396 "",
397 stream);
7022349d
PA
398 pascal_type_print_func_varspec_suffix (type, stream, show,
399 passed_a_ptr, 0, flags);
373a8247
PM
400 break;
401
402 case TYPE_CODE_PTR:
403 case TYPE_CODE_REF:
3e43a32a 404 pascal_type_print_varspec_suffix (TYPE_TARGET_TYPE (type),
79d43c61 405 stream, 0, 1, 0, flags);
373a8247
PM
406 break;
407
408 case TYPE_CODE_FUNC:
409 if (passed_a_ptr)
410 fprintf_filtered (stream, ")");
411 if (!demangled_args)
79d43c61 412 pascal_print_func_args (type, stream, flags);
7022349d
PA
413 pascal_type_print_func_varspec_suffix (type, stream, show,
414 passed_a_ptr, 0, flags);
373a8247
PM
415 break;
416
417 case TYPE_CODE_UNDEF:
418 case TYPE_CODE_STRUCT:
419 case TYPE_CODE_UNION:
420 case TYPE_CODE_ENUM:
421 case TYPE_CODE_INT:
422 case TYPE_CODE_FLT:
423 case TYPE_CODE_VOID:
424 case TYPE_CODE_ERROR:
425 case TYPE_CODE_CHAR:
426 case TYPE_CODE_BOOL:
427 case TYPE_CODE_SET:
428 case TYPE_CODE_RANGE:
429 case TYPE_CODE_STRING:
373a8247
PM
430 case TYPE_CODE_COMPLEX:
431 case TYPE_CODE_TYPEDEF:
373a8247
PM
432 /* These types do not need a suffix. They are listed so that
433 gcc -Wall will report types that may not have been considered. */
434 break;
435 default:
8a3fe4f8 436 error (_("type not handled in pascal_type_print_varspec_suffix()"));
373a8247
PM
437 break;
438 }
439}
440
441/* Print the name of the type (or the ultimate pointer target,
442 function value or array element), or the description of a
443 structure or union.
444
445 SHOW positive means print details about the type (e.g. enum values),
446 and print structure elements passing SHOW - 1 for show.
447 SHOW negative means just print the type name or struct tag if there is one.
448 If there is no name, print something sensible but concise like
449 "struct {...}".
450 SHOW zero means just print the type name or struct tag if there is one.
451 If there is no name, print something sensible but not as concise like
452 "struct {int x; int y;}".
453
454 LEVEL is the number of spaces to indent by.
455 We increase it for some recursive calls. */
456
457void
fba45db2 458pascal_type_print_base (struct type *type, struct ui_file *stream, int show,
79d43c61 459 int level, const struct type_print_options *flags)
373a8247 460{
52f0bd74
AC
461 int i;
462 int len;
b4aa388a 463 LONGEST lastval;
373a8247
PM
464 enum
465 {
466 s_none, s_public, s_private, s_protected
467 }
468 section_type;
373a8247 469
ad3bbd48 470 QUIT;
373a8247
PM
471 wrap_here (" ");
472 if (type == NULL)
473 {
7f6aba03 474 fputs_styled ("<type unknown>", metadata_style.style (), stream);
373a8247
PM
475 return;
476 }
477
478 /* void pointer */
78134374
SM
479 if ((type->code () == TYPE_CODE_PTR)
480 && (TYPE_TARGET_TYPE (type)->code () == TYPE_CODE_VOID))
373a8247 481 {
7d93a1e0 482 fputs_filtered (type->name () ? type->name () : "pointer",
306d9ac5 483 stream);
373a8247
PM
484 return;
485 }
486 /* When SHOW is zero or less, and there is a valid type name, then always
487 just print the type name directly from the type. */
488
489 if (show <= 0
7d93a1e0 490 && type->name () != NULL)
373a8247 491 {
7d93a1e0 492 fputs_filtered (type->name (), stream);
373a8247
PM
493 return;
494 }
495
f168693b 496 type = check_typedef (type);
373a8247 497
78134374 498 switch (type->code ())
373a8247
PM
499 {
500 case TYPE_CODE_TYPEDEF:
501 case TYPE_CODE_PTR:
373a8247
PM
502 case TYPE_CODE_REF:
503 /* case TYPE_CODE_FUNC:
504 case TYPE_CODE_METHOD: */
79d43c61
TT
505 pascal_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level,
506 flags);
373a8247
PM
507 break;
508
509 case TYPE_CODE_ARRAY:
3e43a32a
MS
510 /* pascal_type_print_varspec_prefix (TYPE_TARGET_TYPE (type),
511 stream, 0, 0);
512 pascal_type_print_base (TYPE_TARGET_TYPE (type),
513 stream, show, level);
514 pascal_type_print_varspec_suffix (TYPE_TARGET_TYPE (type),
515 stream, 0, 0, 0); */
79d43c61 516 pascal_print_type (TYPE_TARGET_TYPE (type), NULL, stream, 0, 0, flags);
373a8247
PM
517 break;
518
519 case TYPE_CODE_FUNC:
520 case TYPE_CODE_METHOD:
521 /*
522 pascal_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level);
0df8b418 523 only after args !! */
373a8247
PM
524 break;
525 case TYPE_CODE_STRUCT:
7d93a1e0 526 if (type->name () != NULL)
373a8247 527 {
7d93a1e0 528 fputs_filtered (type->name (), stream);
373a8247
PM
529 fputs_filtered (" = ", stream);
530 }
531 if (HAVE_CPLUS_STRUCT (type))
532 {
533 fprintf_filtered (stream, "class ");
534 }
535 else
536 {
537 fprintf_filtered (stream, "record ");
538 }
539 goto struct_union;
540
541 case TYPE_CODE_UNION:
7d93a1e0 542 if (type->name () != NULL)
373a8247 543 {
7d93a1e0 544 fputs_filtered (type->name (), stream);
373a8247
PM
545 fputs_filtered (" = ", stream);
546 }
547 fprintf_filtered (stream, "case <?> of ");
548
549 struct_union:
550 wrap_here (" ");
551 if (show < 0)
552 {
553 /* If we just printed a tag name, no need to print anything else. */
7d93a1e0 554 if (type->name () == NULL)
373a8247
PM
555 fprintf_filtered (stream, "{...}");
556 }
7d93a1e0 557 else if (show > 0 || type->name () == NULL)
373a8247
PM
558 {
559 pascal_type_print_derivation_info (stream, type);
560
561 fprintf_filtered (stream, "\n");
1f704f76 562 if ((type->num_fields () == 0) && (TYPE_NFN_FIELDS (type) == 0))
373a8247 563 {
74a9bb82 564 if (TYPE_STUB (type))
373a8247
PM
565 fprintfi_filtered (level + 4, stream, "<incomplete type>\n");
566 else
567 fprintfi_filtered (level + 4, stream, "<no data fields>\n");
568 }
569
570 /* Start off with no specific section type, so we can print
571 one for the first field we find, and use that section type
0df8b418 572 thereafter until we find another type. */
373a8247
PM
573
574 section_type = s_none;
575
576 /* If there is a base class for this type,
577 do not print the field that it occupies. */
578
1f704f76 579 len = type->num_fields ();
373a8247
PM
580 for (i = TYPE_N_BASECLASSES (type); i < len; i++)
581 {
582 QUIT;
583 /* Don't print out virtual function table. */
61012eef 584 if ((startswith (TYPE_FIELD_NAME (type, i), "_vptr"))
373a8247
PM
585 && is_cplus_marker ((TYPE_FIELD_NAME (type, i))[5]))
586 continue;
587
588 /* If this is a pascal object or class we can print the
0df8b418 589 various section labels. */
373a8247
PM
590
591 if (HAVE_CPLUS_STRUCT (type))
592 {
593 if (TYPE_FIELD_PROTECTED (type, i))
594 {
595 if (section_type != s_protected)
596 {
597 section_type = s_protected;
598 fprintfi_filtered (level + 2, stream,
599 "protected\n");
600 }
601 }
602 else if (TYPE_FIELD_PRIVATE (type, i))
603 {
604 if (section_type != s_private)
605 {
606 section_type = s_private;
607 fprintfi_filtered (level + 2, stream, "private\n");
608 }
609 }
610 else
611 {
612 if (section_type != s_public)
613 {
614 section_type = s_public;
615 fprintfi_filtered (level + 2, stream, "public\n");
616 }
617 }
618 }
619
620 print_spaces_filtered (level + 4, stream);
ceacbf6e 621 if (field_is_static (&type->field (i)))
d6a843b5 622 fprintf_filtered (stream, "static ");
373a8247
PM
623 pascal_print_type (TYPE_FIELD_TYPE (type, i),
624 TYPE_FIELD_NAME (type, i),
79d43c61 625 stream, show - 1, level + 4, flags);
ceacbf6e 626 if (!field_is_static (&type->field (i))
373a8247
PM
627 && TYPE_FIELD_PACKED (type, i))
628 {
629 /* It is a bitfield. This code does not attempt
630 to look at the bitpos and reconstruct filler,
631 unnamed fields. This would lead to misleading
632 results if the compiler does not put out fields
633 for such things (I don't know what it does). */
634 fprintf_filtered (stream, " : %d",
635 TYPE_FIELD_BITSIZE (type, i));
636 }
637 fprintf_filtered (stream, ";\n");
638 }
639
0df8b418 640 /* If there are both fields and methods, put a space between. */
373a8247
PM
641 len = TYPE_NFN_FIELDS (type);
642 if (len && section_type != s_none)
643 fprintf_filtered (stream, "\n");
644
0df8b418 645 /* Object pascal: print out the methods. */
373a8247
PM
646
647 for (i = 0; i < len; i++)
648 {
649 struct fn_field *f = TYPE_FN_FIELDLIST1 (type, i);
650 int j, len2 = TYPE_FN_FIELDLIST_LENGTH (type, i);
0d5cff50 651 const char *method_name = TYPE_FN_FIELDLIST_NAME (type, i);
9216103f 652
373a8247
PM
653 /* this is GNU C++ specific
654 how can we know constructor/destructor?
0df8b418 655 It might work for GNU pascal. */
373a8247
PM
656 for (j = 0; j < len2; j++)
657 {
1d06ead6 658 const char *physname = TYPE_FN_FIELD_PHYSNAME (f, j);
373a8247 659
61012eef
GB
660 int is_constructor = (startswith (physname, "__ct__"));
661 int is_destructor = (startswith (physname, "__dt__"));
373a8247
PM
662
663 QUIT;
664 if (TYPE_FN_FIELD_PROTECTED (f, j))
665 {
666 if (section_type != s_protected)
667 {
668 section_type = s_protected;
669 fprintfi_filtered (level + 2, stream,
670 "protected\n");
671 }
672 }
673 else if (TYPE_FN_FIELD_PRIVATE (f, j))
674 {
675 if (section_type != s_private)
676 {
677 section_type = s_private;
678 fprintfi_filtered (level + 2, stream, "private\n");
679 }
680 }
681 else
682 {
683 if (section_type != s_public)
684 {
685 section_type = s_public;
686 fprintfi_filtered (level + 2, stream, "public\n");
687 }
688 }
689
690 print_spaces_filtered (level + 4, stream);
691 if (TYPE_FN_FIELD_STATIC_P (f, j))
692 fprintf_filtered (stream, "static ");
693 if (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j)) == 0)
694 {
695 /* Keep GDB from crashing here. */
696 fprintf_filtered (stream, "<undefined type> %s;\n",
697 TYPE_FN_FIELD_PHYSNAME (f, j));
698 break;
699 }
700
701 if (is_constructor)
702 {
703 fprintf_filtered (stream, "constructor ");
704 }
705 else if (is_destructor)
706 {
707 fprintf_filtered (stream, "destructor ");
708 }
3e9313ab 709 else if (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j)) != 0
78134374 710 && TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE(f, j))->code () != TYPE_CODE_VOID)
373a8247
PM
711 {
712 fprintf_filtered (stream, "function ");
713 }
714 else
715 {
716 fprintf_filtered (stream, "procedure ");
717 }
0df8b418 718 /* This does not work, no idea why !! */
373a8247
PM
719
720 pascal_type_print_method_args (physname,
721 method_name,
722 stream);
723
3e9313ab 724 if (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j)) != 0
78134374 725 && TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE(f, j))->code () != TYPE_CODE_VOID)
373a8247
PM
726 {
727 fputs_filtered (" : ", stream);
728 type_print (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j)),
729 "", stream, -1);
730 }
731 if (TYPE_FN_FIELD_VIRTUAL_P (f, j))
732 fprintf_filtered (stream, "; virtual");
733
734 fprintf_filtered (stream, ";\n");
735 }
736 }
737 fprintfi_filtered (level, stream, "end");
738 }
739 break;
740
741 case TYPE_CODE_ENUM:
7d93a1e0 742 if (type->name () != NULL)
373a8247 743 {
7d93a1e0 744 fputs_filtered (type->name (), stream);
373a8247
PM
745 if (show > 0)
746 fputs_filtered (" ", stream);
747 }
748 /* enum is just defined by
0df8b418 749 type enume_name = (enum_member1,enum_member2,...) */
373a8247
PM
750 fprintf_filtered (stream, " = ");
751 wrap_here (" ");
752 if (show < 0)
753 {
754 /* If we just printed a tag name, no need to print anything else. */
7d93a1e0 755 if (type->name () == NULL)
373a8247
PM
756 fprintf_filtered (stream, "(...)");
757 }
7d93a1e0 758 else if (show > 0 || type->name () == NULL)
373a8247
PM
759 {
760 fprintf_filtered (stream, "(");
1f704f76 761 len = type->num_fields ();
373a8247
PM
762 lastval = 0;
763 for (i = 0; i < len; i++)
764 {
765 QUIT;
766 if (i)
767 fprintf_filtered (stream, ", ");
768 wrap_here (" ");
769 fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
14e75d8e 770 if (lastval != TYPE_FIELD_ENUMVAL (type, i))
373a8247 771 {
3e43a32a 772 fprintf_filtered (stream,
14e75d8e
JK
773 " := %s",
774 plongest (TYPE_FIELD_ENUMVAL (type, i)));
775 lastval = TYPE_FIELD_ENUMVAL (type, i);
373a8247
PM
776 }
777 lastval++;
778 }
779 fprintf_filtered (stream, ")");
780 }
781 break;
782
783 case TYPE_CODE_VOID:
784 fprintf_filtered (stream, "void");
785 break;
786
787 case TYPE_CODE_UNDEF:
788 fprintf_filtered (stream, "record <unknown>");
789 break;
790
791 case TYPE_CODE_ERROR:
b00fdb78 792 fprintf_filtered (stream, "%s", TYPE_ERROR_NAME (type));
373a8247
PM
793 break;
794
0df8b418 795 /* this probably does not work for enums. */
373a8247
PM
796 case TYPE_CODE_RANGE:
797 {
798 struct type *target = TYPE_TARGET_TYPE (type);
ad3bbd48 799
373a8247
PM
800 print_type_scalar (target, TYPE_LOW_BOUND (type), stream);
801 fputs_filtered ("..", stream);
802 print_type_scalar (target, TYPE_HIGH_BOUND (type), stream);
803 }
804 break;
805
806 case TYPE_CODE_SET:
807 fputs_filtered ("set of ", stream);
808 pascal_print_type (TYPE_INDEX_TYPE (type), "", stream,
79d43c61 809 show - 1, level, flags);
373a8247
PM
810 break;
811
6604db2e
PM
812 case TYPE_CODE_STRING:
813 fputs_filtered ("String", stream);
814 break;
815
373a8247
PM
816 default:
817 /* Handle types not explicitly handled by the other cases,
818 such as fundamental types. For these, just print whatever
819 the type name is, as recorded in the type itself. If there
0df8b418 820 is no type name, then complain. */
7d93a1e0 821 if (type->name () != NULL)
373a8247 822 {
7d93a1e0 823 fputs_filtered (type->name (), stream);
373a8247
PM
824 }
825 else
826 {
827 /* At least for dump_symtab, it is important that this not be
828 an error (). */
7f6aba03
TT
829 fprintf_styled (stream, metadata_style.style (),
830 "<invalid unnamed pascal type code %d>",
78134374 831 type->code ());
373a8247
PM
832 }
833 break;
834 }
835}
This page took 1.900464 seconds and 4 git commands to generate.