1 /* Support for printing Modula 2 types for GDB, the GNU debugger.
2 Copyright (C) 1986, 1988, 1989, 1991, 1992, 1995, 2000, 2001,
3 2002, 2003, 2004, 2005, 2006
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 2 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, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor,
21 Boston, MA 02110-1301, USA. */
24 #include "gdb_obstack.h"
25 #include "bfd.h" /* Binary File Description */
28 #include "expression.h"
36 #include "typeprint.h"
39 #include "gdb_string.h"
42 static void m2_print_bounds (struct type
*type
,
43 struct ui_file
*stream
, int show
, int level
,
46 static void m2_typedef (struct type
*, struct ui_file
*, int, int);
47 static void m2_array (struct type
*, struct ui_file
*, int, int);
48 static void m2_pointer (struct type
*, struct ui_file
*, int, int);
49 static void m2_ref (struct type
*, struct ui_file
*, int, int);
50 static void m2_procedure (struct type
*, struct ui_file
*, int, int);
51 static void m2_union (struct type
*, struct ui_file
*);
52 static void m2_enum (struct type
*, struct ui_file
*, int, int);
53 static void m2_range (struct type
*, struct ui_file
*, int, int);
54 static void m2_type_name (struct type
*type
, struct ui_file
*stream
);
55 static void m2_short_set (struct type
*type
, struct ui_file
*stream
,
57 static int m2_long_set (struct type
*type
, struct ui_file
*stream
,
59 static void m2_record_fields (struct type
*type
, struct ui_file
*stream
,
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
);
69 m2_print_type (struct type
*type
, char *varstring
, struct ui_file
*stream
,
76 code
= TYPE_CODE (type
);
83 fputs_filtered (_("<type unknown>"), stream
);
87 switch (TYPE_CODE (type
))
90 m2_short_set(type
, stream
, show
, level
);
93 case TYPE_CODE_STRUCT
:
94 if (m2_long_set (type
, stream
, show
, level
))
96 m2_record_fields (type
, stream
, show
, level
);
99 case TYPE_CODE_TYPEDEF
:
100 m2_typedef (type
, stream
, show
, level
);
103 case TYPE_CODE_ARRAY
:
104 m2_array (type
, stream
, show
, level
);
108 m2_pointer (type
, stream
, show
, level
);
112 m2_ref (type
, stream
, show
, level
);
115 case TYPE_CODE_MEMBER
:
116 m2_unknown (_("member"), type
, stream
, show
, level
);
119 case TYPE_CODE_METHOD
:
120 m2_unknown (_("method"), type
, stream
, show
, level
);
124 m2_procedure (type
, stream
, show
, level
);
127 case TYPE_CODE_UNION
:
128 m2_union (type
, stream
);
132 m2_enum (type
, stream
, show
, level
);
138 case TYPE_CODE_UNDEF
:
139 /* i18n: Do not translate the "struct" part! */
140 m2_unknown (_("undef"), type
, stream
, show
, level
);
143 case TYPE_CODE_ERROR
:
144 m2_unknown (_("error"), type
, stream
, show
, level
);
147 case TYPE_CODE_RANGE
:
148 m2_range (type
, stream
, show
, level
);
151 case TYPE_CODE_TEMPLATE
:
155 m2_type_name (type
, stream
);
161 * m2_type_name - if a, type, has a name then print it.
165 m2_type_name (struct type
*type
, struct ui_file
*stream
)
167 if (TYPE_NAME (type
) != NULL
)
168 fputs_filtered (TYPE_NAME (type
), stream
);
172 * m2_range - displays a Modula-2 subrange type.
176 m2_range (struct type
*type
, struct ui_file
*stream
, int show
,
179 if (TYPE_HIGH_BOUND (type
) == TYPE_LOW_BOUND (type
))
180 m2_print_type (TYPE_DOMAIN_TYPE (type
), "", stream
, show
, level
);
183 struct type
*target
= TYPE_TARGET_TYPE (type
);
185 fprintf_filtered (stream
, "[");
186 print_type_scalar (target
, TYPE_LOW_BOUND (type
), stream
);
187 fprintf_filtered (stream
, "..");
188 print_type_scalar (target
, TYPE_HIGH_BOUND (type
), stream
);
189 fprintf_filtered (stream
, "]");
194 m2_typedef (struct type
*type
, struct ui_file
*stream
, int show
,
197 if (TYPE_NAME (type
) != NULL
)
199 fputs_filtered (TYPE_NAME (type
), stream
);
200 fputs_filtered (" = ", stream
);
202 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, show
, level
);
206 * m2_array - prints out a Modula-2 ARRAY ... OF type
209 static void m2_array (struct type
*type
, struct ui_file
*stream
,
212 fprintf_filtered (stream
, "ARRAY [");
213 if (TYPE_LENGTH (type
) >= 0 && TYPE_LENGTH (TYPE_TARGET_TYPE (type
)) > 0
214 && TYPE_ARRAY_UPPER_BOUND_TYPE (type
) != BOUND_CANNOT_BE_DETERMINED
)
216 if (TYPE_INDEX_TYPE (type
) != 0)
218 m2_print_bounds (TYPE_INDEX_TYPE (type
), stream
, show
, -1, 0);
219 fprintf_filtered (stream
, "..");
220 m2_print_bounds (TYPE_INDEX_TYPE (type
), stream
, show
, -1, 1);
223 fprintf_filtered (stream
, "%d",
225 / TYPE_LENGTH (TYPE_TARGET_TYPE (type
))));
227 fprintf_filtered (stream
, "] OF ");
228 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, show
, level
);
232 m2_pointer (struct type
*type
, struct ui_file
*stream
, int show
,
235 if (TYPE_CONST (type
))
236 fprintf_filtered (stream
, "[...] : ");
238 fprintf_filtered (stream
, "POINTER TO ");
240 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, show
, level
);
244 m2_ref (struct type
*type
, struct ui_file
*stream
, int show
,
247 fprintf_filtered (stream
, "VAR");
248 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, show
, level
);
252 m2_unknown (const char *s
, struct type
*type
, struct ui_file
*stream
,
255 fprintf_filtered (stream
, "%s %s", s
, _("is unknown"));
258 static void m2_union (struct type
*type
, struct ui_file
*stream
)
260 fprintf_filtered (stream
, "union");
264 m2_procedure (struct type
*type
, struct ui_file
*stream
,
267 fprintf_filtered (stream
, "PROCEDURE ");
268 m2_type_name (type
, stream
);
269 if (TYPE_CODE (TYPE_TARGET_TYPE (type
)) != TYPE_CODE_VOID
)
271 int i
, len
= TYPE_NFIELDS (type
);
273 fprintf_filtered (stream
, " (");
274 for (i
= 0; i
< len
; i
++)
278 fputs_filtered (", ", stream
);
281 m2_print_type (TYPE_FIELD_TYPE (type
, i
), "", stream
, -1, 0);
283 if (TYPE_TARGET_TYPE (type
) != NULL
)
285 fprintf_filtered (stream
, " : ");
286 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, 0, 0);
292 m2_print_bounds (struct type
*type
,
293 struct ui_file
*stream
, int show
, int level
,
296 struct type
*target
= TYPE_TARGET_TYPE (type
);
299 target
= builtin_type_int
;
301 if (TYPE_NFIELDS(type
) == 0)
305 print_type_scalar (target
, TYPE_HIGH_BOUND (type
), stream
);
307 print_type_scalar (target
, TYPE_LOW_BOUND (type
), stream
);
311 m2_short_set (struct type
*type
, struct ui_file
*stream
, int show
, int level
)
313 fprintf_filtered(stream
, "SET [");
314 m2_print_bounds (TYPE_INDEX_TYPE (type
), stream
,
317 fprintf_filtered(stream
, "..");
318 m2_print_bounds (TYPE_INDEX_TYPE (type
), stream
,
320 fprintf_filtered(stream
, "]");
324 m2_is_long_set (struct type
*type
)
326 LONGEST previous_high
= 0; /* unnecessary initialization
327 keeps gcc -Wall happy */
331 if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
)
335 * check if all fields of the RECORD are consecutive sets
337 len
= TYPE_NFIELDS (type
);
338 for (i
= TYPE_N_BASECLASSES (type
); i
< len
; i
++)
340 if (TYPE_FIELD_TYPE (type
, i
) == NULL
)
342 if (TYPE_CODE (TYPE_FIELD_TYPE (type
, i
)) != TYPE_CODE_SET
)
344 if (TYPE_FIELD_NAME (type
, i
) != NULL
345 && (strcmp (TYPE_FIELD_NAME (type
, i
), "") != 0))
347 range
= TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, i
));
348 if ((i
> TYPE_N_BASECLASSES (type
))
349 && previous_high
+ 1 != TYPE_LOW_BOUND (range
))
351 previous_high
= TYPE_HIGH_BOUND (range
);
359 * m2_get_discrete_bounds - a wrapper for get_discrete_bounds which
360 * understands that CHARs might be signed.
361 * This should be integrated into gdbtypes.c
362 * inside get_discrete_bounds.
366 m2_get_discrete_bounds (struct type
*type
, LONGEST
*lowp
, LONGEST
*highp
)
368 CHECK_TYPEDEF (type
);
369 switch (TYPE_CODE (type
))
372 if (TYPE_LENGTH (type
) < sizeof (LONGEST
))
374 if (!TYPE_UNSIGNED (type
))
376 *lowp
= -(1 << (TYPE_LENGTH (type
) * TARGET_CHAR_BIT
- 1));
383 return get_discrete_bounds (type
, lowp
, highp
);
388 * m2_is_long_set_of_type - returns TRUE if the long set was declared as
389 * SET OF <oftype> of_type is assigned to the
394 m2_is_long_set_of_type (struct type
*type
, struct type
**of_type
)
402 if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
)
404 len
= TYPE_NFIELDS (type
);
405 i
= TYPE_N_BASECLASSES (type
);
408 range
= TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, i
));
409 target
= TYPE_TARGET_TYPE (range
);
411 target
= builtin_type_int
;
413 l1
= TYPE_LOW_BOUND (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, i
)));
414 h1
= TYPE_HIGH_BOUND (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, len
-1)));
416 if (m2_get_discrete_bounds (target
, &l2
, &h2
) >= 0)
417 return (l1
== l2
&& h1
== h2
);
418 error (_("long_set failed to find discrete bounds for its subtype"));
421 error (_("expecting long_set"));
426 m2_long_set (struct type
*type
, struct ui_file
*stream
, int show
, int level
)
428 struct type
*index_type
;
429 struct type
*range_type
;
430 struct type
*of_type
;
432 int len
= TYPE_NFIELDS (type
);
436 if (m2_is_long_set (type
))
438 if (TYPE_TAG_NAME (type
) != NULL
)
440 fputs_filtered (TYPE_TAG_NAME (type
), stream
);
444 else if (TYPE_NAME (type
) != NULL
)
446 fputs_filtered (TYPE_NAME (type
), stream
);
451 if (TYPE_TAG_NAME (type
) != NULL
|| TYPE_NAME (type
) != NULL
)
452 fputs_filtered (" = ", stream
);
454 if (get_long_set_bounds (type
, &low
, &high
))
456 fprintf_filtered(stream
, "SET OF ");
457 i
= TYPE_N_BASECLASSES (type
);
458 if (m2_is_long_set_of_type (type
, &of_type
))
459 m2_print_type (of_type
, "", stream
, show
- 1, level
);
462 fprintf_filtered(stream
, "[");
463 m2_print_bounds (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, i
)),
464 stream
, show
- 1, level
, 0);
466 fprintf_filtered(stream
, "..");
468 m2_print_bounds (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, len
-1)),
469 stream
, show
- 1, level
, 1);
470 fprintf_filtered(stream
, "]");
474 /* i18n: Do not translate the "SET OF" part! */
475 fprintf_filtered(stream
, _("SET OF <unknown>"));
483 m2_record_fields (struct type
*type
, struct ui_file
*stream
, int show
,
486 /* Print the tag if it exists.
488 if (TYPE_TAG_NAME (type
) != NULL
)
490 if (strncmp (TYPE_TAG_NAME (type
), "$$", 2) != 0)
492 fputs_filtered (TYPE_TAG_NAME (type
), stream
);
494 fprintf_filtered (stream
, " = ");
500 if (TYPE_CODE (type
) == DECLARED_TYPE_STRUCT
)
501 fprintf_filtered (stream
, "RECORD ... END ");
502 else if (TYPE_DECLARED_TYPE (type
) == DECLARED_TYPE_UNION
)
503 fprintf_filtered (stream
, "CASE ... END ");
508 int len
= TYPE_NFIELDS (type
);
510 if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
)
511 fprintf_filtered (stream
, "RECORD\n");
512 else if (TYPE_CODE (type
) == TYPE_CODE_UNION
)
513 /* i18n: Do not translate "CASE" and "OF" */
514 fprintf_filtered (stream
, _("CASE <variant> OF\n"));
516 for (i
= TYPE_N_BASECLASSES (type
); i
< len
; i
++)
520 print_spaces_filtered (level
+ 4, stream
);
521 fputs_filtered (TYPE_FIELD_NAME (type
, i
), stream
);
522 fputs_filtered (" : ", stream
);
523 m2_print_type (TYPE_FIELD_TYPE (type
, i
),
525 stream
, 0, level
+ 4);
526 if (TYPE_FIELD_PACKED (type
, i
))
528 /* It is a bitfield. This code does not attempt
529 to look at the bitpos and reconstruct filler,
530 unnamed fields. This would lead to misleading
531 results if the compiler does not put out fields
532 for such things (I don't know what it does). */
533 fprintf_filtered (stream
, " : %d",
534 TYPE_FIELD_BITSIZE (type
, i
));
536 fprintf_filtered (stream
, ";\n");
539 fprintfi_filtered (level
, stream
, "END ");
544 m2_enum (struct type
*type
, struct ui_file
*stream
, int show
, int level
)
550 /* If we just printed a tag name, no need to print anything else. */
551 if (TYPE_TAG_NAME (type
) == NULL
)
552 fprintf_filtered (stream
, "(...)");
554 else if (show
> 0 || TYPE_TAG_NAME (type
) == NULL
)
556 fprintf_filtered (stream
, "(");
557 len
= TYPE_NFIELDS (type
);
559 for (i
= 0; i
< len
; i
++)
563 fprintf_filtered (stream
, ", ");
565 fputs_filtered (TYPE_FIELD_NAME (type
, i
), stream
);
566 if (lastval
!= TYPE_FIELD_BITPOS (type
, i
))
568 fprintf_filtered (stream
, " = %d", TYPE_FIELD_BITPOS (type
, i
));
569 lastval
= TYPE_FIELD_BITPOS (type
, i
);
573 fprintf_filtered (stream
, ")");