2010-10-11 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
[binutils-gdb.git] / gdb / m2-typeprint.c
blob592df378270ad1eaf44490ebbab0dc750a1270ea
1 /* Support for printing Modula 2 types for GDB, the GNU debugger.
2 Copyright (C) 1986, 1988, 1989, 1991, 1992, 1995, 2000, 2001, 2002, 2003,
3 2004, 2005, 2006, 2007, 2008, 2009, 2010
4 Free Software Foundation, Inc.
6 This file is part of GDB.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
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.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
21 #include "defs.h"
22 #include "gdb_obstack.h"
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 "m2-lang.h"
30 #include "target.h"
31 #include "language.h"
32 #include "demangle.h"
33 #include "c-lang.h"
34 #include "typeprint.h"
35 #include "cp-abi.h"
37 #include "gdb_string.h"
38 #include <errno.h>
40 static void m2_print_bounds (struct type *type,
41 struct ui_file *stream, int show, int level,
42 int print_high);
44 static void m2_typedef (struct type *, struct ui_file *, int, int);
45 static void m2_array (struct type *, struct ui_file *, int, int);
46 static void m2_pointer (struct type *, struct ui_file *, int, int);
47 static void m2_ref (struct type *, struct ui_file *, int, int);
48 static void m2_procedure (struct type *, struct ui_file *, int, int);
49 static void m2_union (struct type *, struct ui_file *);
50 static void m2_enum (struct type *, struct ui_file *, int, int);
51 static void m2_range (struct type *, struct ui_file *, int, int);
52 static void m2_type_name (struct type *type, struct ui_file *stream);
53 static void m2_short_set (struct type *type, struct ui_file *stream,
54 int show, int level);
55 static int m2_long_set (struct type *type, struct ui_file *stream,
56 int show, int level);
57 static int m2_unbounded_array (struct type *type, struct ui_file *stream,
58 int show, int level);
59 static void m2_record_fields (struct type *type, struct ui_file *stream,
60 int show, int level);
61 static void m2_unknown (const char *s, struct type *type,
62 struct ui_file *stream, int show, int level);
64 int m2_is_long_set (struct type *type);
65 int m2_is_long_set_of_type (struct type *type, struct type **of_type);
66 int m2_is_unbounded_array (struct type *type);
69 void
70 m2_print_type (struct type *type, const char *varstring, struct ui_file *stream,
71 int show, int level)
73 enum type_code code;
75 CHECK_TYPEDEF (type);
77 QUIT;
79 wrap_here (" ");
80 if (type == NULL)
82 fputs_filtered (_("<type unknown>"), stream);
83 return;
86 code = TYPE_CODE (type);
87 switch (TYPE_CODE (type))
89 case TYPE_CODE_SET:
90 m2_short_set(type, stream, show, level);
91 break;
93 case TYPE_CODE_STRUCT:
94 if (m2_long_set (type, stream, show, level)
95 || m2_unbounded_array (type, stream, show, level))
96 break;
97 m2_record_fields (type, stream, show, level);
98 break;
100 case TYPE_CODE_TYPEDEF:
101 m2_typedef (type, stream, show, level);
102 break;
104 case TYPE_CODE_ARRAY:
105 m2_array (type, stream, show, level);
106 break;
108 case TYPE_CODE_PTR:
109 m2_pointer (type, stream, show, level);
110 break;
112 case TYPE_CODE_REF:
113 m2_ref (type, stream, show, level);
114 break;
116 case TYPE_CODE_METHOD:
117 m2_unknown (_("method"), type, stream, show, level);
118 break;
120 case TYPE_CODE_FUNC:
121 m2_procedure (type, stream, show, level);
122 break;
124 case TYPE_CODE_UNION:
125 m2_union (type, stream);
126 break;
128 case TYPE_CODE_ENUM:
129 m2_enum (type, stream, show, level);
130 break;
132 case TYPE_CODE_VOID:
133 break;
135 case TYPE_CODE_UNDEF:
136 /* i18n: Do not translate the "struct" part! */
137 m2_unknown (_("undef"), type, stream, show, level);
138 break;
140 case TYPE_CODE_ERROR:
141 m2_unknown (_("error"), type, stream, show, level);
142 break;
144 case TYPE_CODE_RANGE:
145 m2_range (type, stream, show, level);
146 break;
148 default:
149 m2_type_name (type, stream);
150 break;
154 /* Print a typedef using M2 syntax. TYPE is the underlying type.
155 NEW_SYMBOL is the symbol naming the type. STREAM is the stream on
156 which to print. */
158 void
159 m2_print_typedef (struct type *type, struct symbol *new_symbol,
160 struct ui_file *stream)
162 CHECK_TYPEDEF (type);
163 fprintf_filtered (stream, "TYPE ");
164 if (!TYPE_NAME (SYMBOL_TYPE (new_symbol))
165 || strcmp (TYPE_NAME ((SYMBOL_TYPE (new_symbol))),
166 SYMBOL_LINKAGE_NAME (new_symbol)) != 0)
167 fprintf_filtered (stream, "%s = ", SYMBOL_PRINT_NAME (new_symbol));
168 else
169 fprintf_filtered (stream, "<builtin> = ");
170 type_print (type, "", stream, 0);
171 fprintf_filtered (stream, ";\n");
174 /* m2_type_name - if a, type, has a name then print it. */
176 void
177 m2_type_name (struct type *type, struct ui_file *stream)
179 if (TYPE_NAME (type) != NULL)
180 fputs_filtered (TYPE_NAME (type), stream);
183 /* m2_range - displays a Modula-2 subrange type. */
185 void
186 m2_range (struct type *type, struct ui_file *stream, int show,
187 int level)
189 if (TYPE_HIGH_BOUND (type) == TYPE_LOW_BOUND (type))
190 m2_print_type (TYPE_DOMAIN_TYPE (type), "", stream, show, level);
191 else
193 struct type *target = TYPE_TARGET_TYPE (type);
195 fprintf_filtered (stream, "[");
196 print_type_scalar (target, TYPE_LOW_BOUND (type), stream);
197 fprintf_filtered (stream, "..");
198 print_type_scalar (target, TYPE_HIGH_BOUND (type), stream);
199 fprintf_filtered (stream, "]");
203 static void
204 m2_typedef (struct type *type, struct ui_file *stream, int show,
205 int level)
207 if (TYPE_NAME (type) != NULL)
209 fputs_filtered (TYPE_NAME (type), stream);
210 fputs_filtered (" = ", stream);
212 m2_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level);
215 /* m2_array - prints out a Modula-2 ARRAY ... OF type. */
217 static void m2_array (struct type *type, struct ui_file *stream,
218 int show, int level)
220 fprintf_filtered (stream, "ARRAY [");
221 if (TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0
222 && !TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type))
224 if (TYPE_INDEX_TYPE (type) != 0)
226 m2_print_bounds (TYPE_INDEX_TYPE (type), stream, show, -1, 0);
227 fprintf_filtered (stream, "..");
228 m2_print_bounds (TYPE_INDEX_TYPE (type), stream, show, -1, 1);
230 else
231 fprintf_filtered (stream, "%d",
232 (TYPE_LENGTH (type)
233 / TYPE_LENGTH (TYPE_TARGET_TYPE (type))));
235 fprintf_filtered (stream, "] OF ");
236 m2_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level);
239 static void
240 m2_pointer (struct type *type, struct ui_file *stream, int show,
241 int level)
243 if (TYPE_CONST (type))
244 fprintf_filtered (stream, "[...] : ");
245 else
246 fprintf_filtered (stream, "POINTER TO ");
248 m2_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level);
251 static void
252 m2_ref (struct type *type, struct ui_file *stream, int show,
253 int level)
255 fprintf_filtered (stream, "VAR");
256 m2_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level);
259 static void
260 m2_unknown (const char *s, struct type *type, struct ui_file *stream,
261 int show, int level)
263 fprintf_filtered (stream, "%s %s", s, _("is unknown"));
266 static void m2_union (struct type *type, struct ui_file *stream)
268 fprintf_filtered (stream, "union");
271 static void
272 m2_procedure (struct type *type, struct ui_file *stream,
273 int show, int level)
275 fprintf_filtered (stream, "PROCEDURE ");
276 m2_type_name (type, stream);
277 if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_VOID)
279 int i, len = TYPE_NFIELDS (type);
281 fprintf_filtered (stream, " (");
282 for (i = 0; i < len; i++)
284 if (i > 0)
286 fputs_filtered (", ", stream);
287 wrap_here (" ");
289 m2_print_type (TYPE_FIELD_TYPE (type, i), "", stream, -1, 0);
291 if (TYPE_TARGET_TYPE (type) != NULL)
293 fprintf_filtered (stream, " : ");
294 m2_print_type (TYPE_TARGET_TYPE (type), "", stream, 0, 0);
299 static void
300 m2_print_bounds (struct type *type,
301 struct ui_file *stream, int show, int level,
302 int print_high)
304 struct type *target = TYPE_TARGET_TYPE (type);
306 if (TYPE_NFIELDS(type) == 0)
307 return;
309 if (print_high)
310 print_type_scalar (target, TYPE_HIGH_BOUND (type), stream);
311 else
312 print_type_scalar (target, TYPE_LOW_BOUND (type), stream);
315 static void
316 m2_short_set (struct type *type, struct ui_file *stream, int show, int level)
318 fprintf_filtered(stream, "SET [");
319 m2_print_bounds (TYPE_INDEX_TYPE (type), stream,
320 show - 1, level, 0);
322 fprintf_filtered(stream, "..");
323 m2_print_bounds (TYPE_INDEX_TYPE (type), stream,
324 show - 1, level, 1);
325 fprintf_filtered(stream, "]");
329 m2_is_long_set (struct type *type)
331 LONGEST previous_high = 0; /* unnecessary initialization
332 keeps gcc -Wall happy */
333 int len, i;
334 struct type *range;
336 if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
339 /* check if all fields of the RECORD are consecutive sets. */
341 len = TYPE_NFIELDS (type);
342 for (i = TYPE_N_BASECLASSES (type); i < len; i++)
344 if (TYPE_FIELD_TYPE (type, i) == NULL)
345 return 0;
346 if (TYPE_CODE (TYPE_FIELD_TYPE (type, i)) != TYPE_CODE_SET)
347 return 0;
348 if (TYPE_FIELD_NAME (type, i) != NULL
349 && (strcmp (TYPE_FIELD_NAME (type, i), "") != 0))
350 return 0;
351 range = TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, i));
352 if ((i > TYPE_N_BASECLASSES (type))
353 && previous_high + 1 != TYPE_LOW_BOUND (range))
354 return 0;
355 previous_high = TYPE_HIGH_BOUND (range);
357 return len>0;
359 return 0;
362 /* m2_get_discrete_bounds - a wrapper for get_discrete_bounds which
363 understands that CHARs might be signed.
364 This should be integrated into gdbtypes.c
365 inside get_discrete_bounds. */
367 static int
368 m2_get_discrete_bounds (struct type *type, LONGEST *lowp, LONGEST *highp)
370 CHECK_TYPEDEF (type);
371 switch (TYPE_CODE (type))
373 case TYPE_CODE_CHAR:
374 if (TYPE_LENGTH (type) < sizeof (LONGEST))
376 if (!TYPE_UNSIGNED (type))
378 *lowp = -(1 << (TYPE_LENGTH (type) * TARGET_CHAR_BIT - 1));
379 *highp = -*lowp - 1;
380 return 0;
383 /* fall through */
384 default:
385 return get_discrete_bounds (type, lowp, highp);
389 /* m2_is_long_set_of_type - returns TRUE if the long set was declared as
390 SET OF <oftype> of_type is assigned to the
391 subtype. */
394 m2_is_long_set_of_type (struct type *type, struct type **of_type)
396 int len, i;
397 struct type *range;
398 struct type *target;
399 LONGEST l1, l2;
400 LONGEST h1, h2;
402 if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
404 len = TYPE_NFIELDS (type);
405 i = TYPE_N_BASECLASSES (type);
406 if (len == 0)
407 return 0;
408 range = TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, i));
409 target = TYPE_TARGET_TYPE (range);
411 l1 = TYPE_LOW_BOUND (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, i)));
412 h1 = TYPE_HIGH_BOUND (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, len-1)));
413 *of_type = target;
414 if (m2_get_discrete_bounds (target, &l2, &h2) >= 0)
415 return (l1 == l2 && h1 == h2);
416 error (_("long_set failed to find discrete bounds for its subtype"));
417 return 0;
419 error (_("expecting long_set"));
420 return 0;
423 static int
424 m2_long_set (struct type *type, struct ui_file *stream, int show, int level)
426 struct type *of_type;
427 int i;
428 int len = TYPE_NFIELDS (type);
429 LONGEST low;
430 LONGEST high;
432 if (m2_is_long_set (type))
434 if (TYPE_TAG_NAME (type) != NULL)
436 fputs_filtered (TYPE_TAG_NAME (type), stream);
437 if (show == 0)
438 return 1;
440 else if (TYPE_NAME (type) != NULL)
442 fputs_filtered (TYPE_NAME (type), stream);
443 if (show == 0)
444 return 1;
447 if (TYPE_TAG_NAME (type) != NULL || TYPE_NAME (type) != NULL)
448 fputs_filtered (" = ", stream);
450 if (get_long_set_bounds (type, &low, &high))
452 fprintf_filtered(stream, "SET OF ");
453 i = TYPE_N_BASECLASSES (type);
454 if (m2_is_long_set_of_type (type, &of_type))
455 m2_print_type (of_type, "", stream, show - 1, level);
456 else
458 fprintf_filtered(stream, "[");
459 m2_print_bounds (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, i)),
460 stream, show - 1, level, 0);
462 fprintf_filtered(stream, "..");
464 m2_print_bounds (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, len-1)),
465 stream, show - 1, level, 1);
466 fprintf_filtered(stream, "]");
469 else
470 /* i18n: Do not translate the "SET OF" part! */
471 fprintf_filtered(stream, _("SET OF <unknown>"));
473 return 1;
475 return 0;
478 /* m2_is_unbounded_array - returns TRUE if, type, should be regarded
479 as a Modula-2 unbounded ARRAY type. */
482 m2_is_unbounded_array (struct type *type)
484 if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
487 * check if we have a structure with exactly two fields named
488 * _m2_contents and _m2_high. It also checks to see if the
489 * type of _m2_contents is a pointer. The TYPE_TARGET_TYPE
490 * of the pointer determines the unbounded ARRAY OF type.
492 if (TYPE_NFIELDS (type) != 2)
493 return 0;
494 if (strcmp (TYPE_FIELD_NAME (type, 0), "_m2_contents") != 0)
495 return 0;
496 if (strcmp (TYPE_FIELD_NAME (type, 1), "_m2_high") != 0)
497 return 0;
498 if (TYPE_CODE (TYPE_FIELD_TYPE (type, 0)) != TYPE_CODE_PTR)
499 return 0;
500 return 1;
502 return 0;
505 /* m2_unbounded_array - if the struct type matches a Modula-2 unbounded
506 parameter type then display the type as an
507 ARRAY OF type. Returns TRUE if an unbounded
508 array type was detected. */
510 static int
511 m2_unbounded_array (struct type *type, struct ui_file *stream, int show,
512 int level)
514 if (m2_is_unbounded_array (type))
516 if (show > 0)
518 fputs_filtered ("ARRAY OF ", stream);
519 m2_print_type (TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type, 0)),
520 "", stream, 0, level);
522 return 1;
524 return 0;
527 void
528 m2_record_fields (struct type *type, struct ui_file *stream, int show,
529 int level)
531 /* Print the tag if it exists. */
532 if (TYPE_TAG_NAME (type) != NULL)
534 if (strncmp (TYPE_TAG_NAME (type), "$$", 2) != 0)
536 fputs_filtered (TYPE_TAG_NAME (type), stream);
537 if (show > 0)
538 fprintf_filtered (stream, " = ");
541 wrap_here (" ");
542 if (show < 0)
544 if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
545 fprintf_filtered (stream, "RECORD ... END ");
546 else if (TYPE_CODE (type) == TYPE_CODE_UNION)
547 fprintf_filtered (stream, "CASE ... END ");
549 else if (show > 0)
551 int i;
552 int len = TYPE_NFIELDS (type);
554 if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
555 fprintf_filtered (stream, "RECORD\n");
556 else if (TYPE_CODE (type) == TYPE_CODE_UNION)
557 /* i18n: Do not translate "CASE" and "OF" */
558 fprintf_filtered (stream, _("CASE <variant> OF\n"));
560 for (i = TYPE_N_BASECLASSES (type); i < len; i++)
562 QUIT;
564 print_spaces_filtered (level + 4, stream);
565 fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
566 fputs_filtered (" : ", stream);
567 m2_print_type (TYPE_FIELD_TYPE (type, i),
569 stream, 0, level + 4);
570 if (TYPE_FIELD_PACKED (type, i))
572 /* It is a bitfield. This code does not attempt
573 to look at the bitpos and reconstruct filler,
574 unnamed fields. This would lead to misleading
575 results if the compiler does not put out fields
576 for such things (I don't know what it does). */
577 fprintf_filtered (stream, " : %d",
578 TYPE_FIELD_BITSIZE (type, i));
580 fprintf_filtered (stream, ";\n");
583 fprintfi_filtered (level, stream, "END ");
587 void
588 m2_enum (struct type *type, struct ui_file *stream, int show, int level)
590 int lastval, i, len;
592 if (show < 0)
594 /* If we just printed a tag name, no need to print anything else. */
595 if (TYPE_TAG_NAME (type) == NULL)
596 fprintf_filtered (stream, "(...)");
598 else if (show > 0 || TYPE_TAG_NAME (type) == NULL)
600 fprintf_filtered (stream, "(");
601 len = TYPE_NFIELDS (type);
602 lastval = 0;
603 for (i = 0; i < len; i++)
605 QUIT;
606 if (i > 0)
607 fprintf_filtered (stream, ", ");
608 wrap_here (" ");
609 fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
610 if (lastval != TYPE_FIELD_BITPOS (type, i))
612 fprintf_filtered (stream, " = %d", TYPE_FIELD_BITPOS (type, i));
613 lastval = TYPE_FIELD_BITPOS (type, i);
615 lastval++;
617 fprintf_filtered (stream, ")");