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 Free Software Foundation, Inc.
5 This file is part of GDB.
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 3 of the License, or
10 (at your option) any later version.
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.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
21 #include "gdb_obstack.h"
22 #include "bfd.h" /* Binary File Description */
25 #include "expression.h"
33 #include "typeprint.h"
36 #include "gdb_string.h"
39 static void m2_print_bounds (struct type
*type
,
40 struct ui_file
*stream
, int show
, int level
,
43 static void m2_typedef (struct type
*, struct ui_file
*, int, int);
44 static void m2_array (struct type
*, struct ui_file
*, int, int);
45 static void m2_pointer (struct type
*, struct ui_file
*, int, int);
46 static void m2_ref (struct type
*, struct ui_file
*, int, int);
47 static void m2_procedure (struct type
*, struct ui_file
*, int, int);
48 static void m2_union (struct type
*, struct ui_file
*);
49 static void m2_enum (struct type
*, struct ui_file
*, int, int);
50 static void m2_range (struct type
*, struct ui_file
*, int, int);
51 static void m2_type_name (struct type
*type
, struct ui_file
*stream
);
52 static void m2_short_set (struct type
*type
, struct ui_file
*stream
,
54 static int m2_long_set (struct type
*type
, struct ui_file
*stream
,
56 static int m2_unbounded_array (struct type
*type
, struct ui_file
*stream
,
58 static void m2_record_fields (struct type
*type
, struct ui_file
*stream
,
60 static void m2_unknown (const char *s
, struct type
*type
,
61 struct ui_file
*stream
, int show
, int level
);
63 int m2_is_long_set (struct type
*type
);
64 int m2_is_long_set_of_type (struct type
*type
, struct type
**of_type
);
65 int m2_is_unbounded_array (struct type
*type
);
69 m2_print_type (struct type
*type
, char *varstring
, struct ui_file
*stream
,
82 fputs_filtered (_("<type unknown>"), stream
);
86 code
= TYPE_CODE (type
);
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
)
95 || m2_unbounded_array (type
, stream
, show
, level
))
97 m2_record_fields (type
, stream
, show
, level
);
100 case TYPE_CODE_TYPEDEF
:
101 m2_typedef (type
, stream
, show
, level
);
104 case TYPE_CODE_ARRAY
:
105 m2_array (type
, stream
, show
, level
);
109 m2_pointer (type
, stream
, show
, level
);
113 m2_ref (type
, stream
, show
, level
);
116 case TYPE_CODE_METHOD
:
117 m2_unknown (_("method"), type
, stream
, show
, level
);
121 m2_procedure (type
, stream
, show
, level
);
124 case TYPE_CODE_UNION
:
125 m2_union (type
, stream
);
129 m2_enum (type
, stream
, show
, level
);
135 case TYPE_CODE_UNDEF
:
136 /* i18n: Do not translate the "struct" part! */
137 m2_unknown (_("undef"), type
, stream
, show
, level
);
140 case TYPE_CODE_ERROR
:
141 m2_unknown (_("error"), type
, stream
, show
, level
);
144 case TYPE_CODE_RANGE
:
145 m2_range (type
, stream
, show
, level
);
148 case TYPE_CODE_TEMPLATE
:
152 m2_type_name (type
, stream
);
157 /* m2_type_name - if a, type, has a name then print it. */
160 m2_type_name (struct type
*type
, struct ui_file
*stream
)
162 if (TYPE_NAME (type
) != NULL
)
163 fputs_filtered (TYPE_NAME (type
), stream
);
166 /* m2_range - displays a Modula-2 subrange type. */
169 m2_range (struct type
*type
, struct ui_file
*stream
, int show
,
172 if (TYPE_HIGH_BOUND (type
) == TYPE_LOW_BOUND (type
))
173 m2_print_type (TYPE_DOMAIN_TYPE (type
), "", stream
, show
, level
);
176 struct type
*target
= TYPE_TARGET_TYPE (type
);
178 fprintf_filtered (stream
, "[");
179 print_type_scalar (target
, TYPE_LOW_BOUND (type
), stream
);
180 fprintf_filtered (stream
, "..");
181 print_type_scalar (target
, TYPE_HIGH_BOUND (type
), stream
);
182 fprintf_filtered (stream
, "]");
187 m2_typedef (struct type
*type
, struct ui_file
*stream
, int show
,
190 if (TYPE_NAME (type
) != NULL
)
192 fputs_filtered (TYPE_NAME (type
), stream
);
193 fputs_filtered (" = ", stream
);
195 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, show
, level
);
198 /* m2_array - prints out a Modula-2 ARRAY ... OF type. */
200 static void m2_array (struct type
*type
, struct ui_file
*stream
,
203 fprintf_filtered (stream
, "ARRAY [");
204 if (TYPE_LENGTH (TYPE_TARGET_TYPE (type
)) > 0
205 && TYPE_ARRAY_UPPER_BOUND_TYPE (type
) != BOUND_CANNOT_BE_DETERMINED
)
207 if (TYPE_INDEX_TYPE (type
) != 0)
209 m2_print_bounds (TYPE_INDEX_TYPE (type
), stream
, show
, -1, 0);
210 fprintf_filtered (stream
, "..");
211 m2_print_bounds (TYPE_INDEX_TYPE (type
), stream
, show
, -1, 1);
214 fprintf_filtered (stream
, "%d",
216 / TYPE_LENGTH (TYPE_TARGET_TYPE (type
))));
218 fprintf_filtered (stream
, "] OF ");
219 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, show
, level
);
223 m2_pointer (struct type
*type
, struct ui_file
*stream
, int show
,
226 if (TYPE_CONST (type
))
227 fprintf_filtered (stream
, "[...] : ");
229 fprintf_filtered (stream
, "POINTER TO ");
231 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, show
, level
);
235 m2_ref (struct type
*type
, struct ui_file
*stream
, int show
,
238 fprintf_filtered (stream
, "VAR");
239 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, show
, level
);
243 m2_unknown (const char *s
, struct type
*type
, struct ui_file
*stream
,
246 fprintf_filtered (stream
, "%s %s", s
, _("is unknown"));
249 static void m2_union (struct type
*type
, struct ui_file
*stream
)
251 fprintf_filtered (stream
, "union");
255 m2_procedure (struct type
*type
, struct ui_file
*stream
,
258 fprintf_filtered (stream
, "PROCEDURE ");
259 m2_type_name (type
, stream
);
260 if (TYPE_CODE (TYPE_TARGET_TYPE (type
)) != TYPE_CODE_VOID
)
262 int i
, len
= TYPE_NFIELDS (type
);
264 fprintf_filtered (stream
, " (");
265 for (i
= 0; i
< len
; i
++)
269 fputs_filtered (", ", stream
);
272 m2_print_type (TYPE_FIELD_TYPE (type
, i
), "", stream
, -1, 0);
274 if (TYPE_TARGET_TYPE (type
) != NULL
)
276 fprintf_filtered (stream
, " : ");
277 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, 0, 0);
283 m2_print_bounds (struct type
*type
,
284 struct ui_file
*stream
, int show
, int level
,
287 struct type
*target
= TYPE_TARGET_TYPE (type
);
290 target
= builtin_type_int
;
292 if (TYPE_NFIELDS(type
) == 0)
296 print_type_scalar (target
, TYPE_HIGH_BOUND (type
), stream
);
298 print_type_scalar (target
, TYPE_LOW_BOUND (type
), stream
);
302 m2_short_set (struct type
*type
, struct ui_file
*stream
, int show
, int level
)
304 fprintf_filtered(stream
, "SET [");
305 m2_print_bounds (TYPE_INDEX_TYPE (type
), stream
,
308 fprintf_filtered(stream
, "..");
309 m2_print_bounds (TYPE_INDEX_TYPE (type
), stream
,
311 fprintf_filtered(stream
, "]");
315 m2_is_long_set (struct type
*type
)
317 LONGEST previous_high
= 0; /* unnecessary initialization
318 keeps gcc -Wall happy */
322 if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
)
325 /* check if all fields of the RECORD are consecutive sets. */
327 len
= TYPE_NFIELDS (type
);
328 for (i
= TYPE_N_BASECLASSES (type
); i
< len
; i
++)
330 if (TYPE_FIELD_TYPE (type
, i
) == NULL
)
332 if (TYPE_CODE (TYPE_FIELD_TYPE (type
, i
)) != TYPE_CODE_SET
)
334 if (TYPE_FIELD_NAME (type
, i
) != NULL
335 && (strcmp (TYPE_FIELD_NAME (type
, i
), "") != 0))
337 range
= TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, i
));
338 if ((i
> TYPE_N_BASECLASSES (type
))
339 && previous_high
+ 1 != TYPE_LOW_BOUND (range
))
341 previous_high
= TYPE_HIGH_BOUND (range
);
348 /* m2_get_discrete_bounds - a wrapper for get_discrete_bounds which
349 understands that CHARs might be signed.
350 This should be integrated into gdbtypes.c
351 inside get_discrete_bounds. */
354 m2_get_discrete_bounds (struct type
*type
, LONGEST
*lowp
, LONGEST
*highp
)
356 CHECK_TYPEDEF (type
);
357 switch (TYPE_CODE (type
))
360 if (TYPE_LENGTH (type
) < sizeof (LONGEST
))
362 if (!TYPE_UNSIGNED (type
))
364 *lowp
= -(1 << (TYPE_LENGTH (type
) * TARGET_CHAR_BIT
- 1));
371 return get_discrete_bounds (type
, lowp
, highp
);
375 /* m2_is_long_set_of_type - returns TRUE if the long set was declared as
376 SET OF <oftype> of_type is assigned to the
380 m2_is_long_set_of_type (struct type
*type
, struct type
**of_type
)
388 if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
)
390 len
= TYPE_NFIELDS (type
);
391 i
= TYPE_N_BASECLASSES (type
);
394 range
= TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, i
));
395 target
= TYPE_TARGET_TYPE (range
);
397 target
= builtin_type_int
;
399 l1
= TYPE_LOW_BOUND (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, i
)));
400 h1
= TYPE_HIGH_BOUND (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, len
-1)));
402 if (m2_get_discrete_bounds (target
, &l2
, &h2
) >= 0)
403 return (l1
== l2
&& h1
== h2
);
404 error (_("long_set failed to find discrete bounds for its subtype"));
407 error (_("expecting long_set"));
412 m2_long_set (struct type
*type
, struct ui_file
*stream
, int show
, int level
)
414 struct type
*index_type
;
415 struct type
*range_type
;
416 struct type
*of_type
;
418 int len
= TYPE_NFIELDS (type
);
422 if (m2_is_long_set (type
))
424 if (TYPE_TAG_NAME (type
) != NULL
)
426 fputs_filtered (TYPE_TAG_NAME (type
), stream
);
430 else if (TYPE_NAME (type
) != NULL
)
432 fputs_filtered (TYPE_NAME (type
), stream
);
437 if (TYPE_TAG_NAME (type
) != NULL
|| TYPE_NAME (type
) != NULL
)
438 fputs_filtered (" = ", stream
);
440 if (get_long_set_bounds (type
, &low
, &high
))
442 fprintf_filtered(stream
, "SET OF ");
443 i
= TYPE_N_BASECLASSES (type
);
444 if (m2_is_long_set_of_type (type
, &of_type
))
445 m2_print_type (of_type
, "", stream
, show
- 1, level
);
448 fprintf_filtered(stream
, "[");
449 m2_print_bounds (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, i
)),
450 stream
, show
- 1, level
, 0);
452 fprintf_filtered(stream
, "..");
454 m2_print_bounds (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, len
-1)),
455 stream
, show
- 1, level
, 1);
456 fprintf_filtered(stream
, "]");
460 /* i18n: Do not translate the "SET OF" part! */
461 fprintf_filtered(stream
, _("SET OF <unknown>"));
468 /* m2_is_unbounded_array - returns TRUE if, type, should be regarded
469 as a Modula-2 unbounded ARRAY type. */
472 m2_is_unbounded_array (struct type
*type
)
474 if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
)
477 * check if we have a structure with exactly two fields named
478 * _m2_contents and _m2_high. It also checks to see if the
479 * type of _m2_contents is a pointer. The TYPE_TARGET_TYPE
480 * of the pointer determines the unbounded ARRAY OF type.
482 if (TYPE_NFIELDS (type
) != 2)
484 if (strcmp (TYPE_FIELD_NAME (type
, 0), "_m2_contents") != 0)
486 if (strcmp (TYPE_FIELD_NAME (type
, 1), "_m2_high") != 0)
488 if (TYPE_CODE (TYPE_FIELD_TYPE (type
, 0)) != TYPE_CODE_PTR
)
495 /* m2_unbounded_array - if the struct type matches a Modula-2 unbounded
496 parameter type then display the type as an
497 ARRAY OF type. Returns TRUE if an unbounded
498 array type was detected. */
501 m2_unbounded_array (struct type
*type
, struct ui_file
*stream
, int show
,
504 if (m2_is_unbounded_array (type
))
508 fputs_filtered ("ARRAY OF ", stream
);
509 m2_print_type (TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type
, 0)),
510 "", stream
, 0, level
);
518 m2_record_fields (struct type
*type
, struct ui_file
*stream
, int show
,
521 /* Print the tag if it exists. */
522 if (TYPE_TAG_NAME (type
) != NULL
)
524 if (strncmp (TYPE_TAG_NAME (type
), "$$", 2) != 0)
526 fputs_filtered (TYPE_TAG_NAME (type
), stream
);
528 fprintf_filtered (stream
, " = ");
534 if (TYPE_CODE (type
) == DECLARED_TYPE_STRUCT
)
535 fprintf_filtered (stream
, "RECORD ... END ");
536 else if (TYPE_DECLARED_TYPE (type
) == DECLARED_TYPE_UNION
)
537 fprintf_filtered (stream
, "CASE ... END ");
542 int len
= TYPE_NFIELDS (type
);
544 if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
)
545 fprintf_filtered (stream
, "RECORD\n");
546 else if (TYPE_CODE (type
) == TYPE_CODE_UNION
)
547 /* i18n: Do not translate "CASE" and "OF" */
548 fprintf_filtered (stream
, _("CASE <variant> OF\n"));
550 for (i
= TYPE_N_BASECLASSES (type
); i
< len
; i
++)
554 print_spaces_filtered (level
+ 4, stream
);
555 fputs_filtered (TYPE_FIELD_NAME (type
, i
), stream
);
556 fputs_filtered (" : ", stream
);
557 m2_print_type (TYPE_FIELD_TYPE (type
, i
),
559 stream
, 0, level
+ 4);
560 if (TYPE_FIELD_PACKED (type
, i
))
562 /* It is a bitfield. This code does not attempt
563 to look at the bitpos and reconstruct filler,
564 unnamed fields. This would lead to misleading
565 results if the compiler does not put out fields
566 for such things (I don't know what it does). */
567 fprintf_filtered (stream
, " : %d",
568 TYPE_FIELD_BITSIZE (type
, i
));
570 fprintf_filtered (stream
, ";\n");
573 fprintfi_filtered (level
, stream
, "END ");
578 m2_enum (struct type
*type
, struct ui_file
*stream
, int show
, int level
)
584 /* If we just printed a tag name, no need to print anything else. */
585 if (TYPE_TAG_NAME (type
) == NULL
)
586 fprintf_filtered (stream
, "(...)");
588 else if (show
> 0 || TYPE_TAG_NAME (type
) == NULL
)
590 fprintf_filtered (stream
, "(");
591 len
= TYPE_NFIELDS (type
);
593 for (i
= 0; i
< len
; i
++)
597 fprintf_filtered (stream
, ", ");
599 fputs_filtered (TYPE_FIELD_NAME (type
, i
), stream
);
600 if (lastval
!= TYPE_FIELD_BITPOS (type
, i
))
602 fprintf_filtered (stream
, " = %d", TYPE_FIELD_BITPOS (type
, i
));
603 lastval
= TYPE_FIELD_BITPOS (type
, i
);
607 fprintf_filtered (stream
, ")");