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/>. */
22 #include "gdb_obstack.h"
23 #include "bfd.h" /* Binary File Description */
26 #include "expression.h"
34 #include "typeprint.h"
37 #include "gdb_string.h"
40 static void m2_print_bounds (struct type
*type
,
41 struct ui_file
*stream
, int show
, int level
,
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
,
55 static int m2_long_set (struct type
*type
, struct ui_file
*stream
,
57 static int m2_unbounded_array (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
);
66 int m2_is_unbounded_array (struct type
*type
);
70 m2_print_type (struct type
*type
, const 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
);
149 m2_type_name (type
, stream
);
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
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
));
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. */
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. */
186 m2_range (struct type
*type
, struct ui_file
*stream
, int show
,
189 if (TYPE_HIGH_BOUND (type
) == TYPE_LOW_BOUND (type
))
190 m2_print_type (TYPE_DOMAIN_TYPE (type
), "", stream
, show
, level
);
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
, "]");
204 m2_typedef (struct type
*type
, struct ui_file
*stream
, int show
,
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
,
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);
231 fprintf_filtered (stream
, "%d",
233 / TYPE_LENGTH (TYPE_TARGET_TYPE (type
))));
235 fprintf_filtered (stream
, "] OF ");
236 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, show
, level
);
240 m2_pointer (struct type
*type
, struct ui_file
*stream
, int show
,
243 if (TYPE_CONST (type
))
244 fprintf_filtered (stream
, "[...] : ");
246 fprintf_filtered (stream
, "POINTER TO ");
248 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, show
, level
);
252 m2_ref (struct type
*type
, struct ui_file
*stream
, int show
,
255 fprintf_filtered (stream
, "VAR");
256 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, show
, level
);
260 m2_unknown (const char *s
, struct type
*type
, struct ui_file
*stream
,
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");
272 m2_procedure (struct type
*type
, struct ui_file
*stream
,
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
++)
286 fputs_filtered (", ", stream
);
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);
300 m2_print_bounds (struct type
*type
,
301 struct ui_file
*stream
, int show
, int level
,
304 struct type
*target
= TYPE_TARGET_TYPE (type
);
306 if (TYPE_NFIELDS(type
) == 0)
310 print_type_scalar (target
, TYPE_HIGH_BOUND (type
), stream
);
312 print_type_scalar (target
, TYPE_LOW_BOUND (type
), stream
);
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
,
322 fprintf_filtered(stream
, "..");
323 m2_print_bounds (TYPE_INDEX_TYPE (type
), stream
,
325 fprintf_filtered(stream
, "]");
329 m2_is_long_set (struct type
*type
)
331 LONGEST previous_high
= 0; /* unnecessary initialization
332 keeps gcc -Wall happy */
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
)
346 if (TYPE_CODE (TYPE_FIELD_TYPE (type
, i
)) != TYPE_CODE_SET
)
348 if (TYPE_FIELD_NAME (type
, i
) != NULL
349 && (strcmp (TYPE_FIELD_NAME (type
, i
), "") != 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
))
355 previous_high
= TYPE_HIGH_BOUND (range
);
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. */
368 m2_get_discrete_bounds (struct type
*type
, LONGEST
*lowp
, LONGEST
*highp
)
370 CHECK_TYPEDEF (type
);
371 switch (TYPE_CODE (type
))
374 if (TYPE_LENGTH (type
) < sizeof (LONGEST
))
376 if (!TYPE_UNSIGNED (type
))
378 *lowp
= -(1 << (TYPE_LENGTH (type
) * TARGET_CHAR_BIT
- 1));
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
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 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)));
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"));
419 error (_("expecting long_set"));
424 m2_long_set (struct type
*type
, struct ui_file
*stream
, int show
, int level
)
426 struct type
*of_type
;
428 int len
= TYPE_NFIELDS (type
);
432 if (m2_is_long_set (type
))
434 if (TYPE_TAG_NAME (type
) != NULL
)
436 fputs_filtered (TYPE_TAG_NAME (type
), stream
);
440 else if (TYPE_NAME (type
) != NULL
)
442 fputs_filtered (TYPE_NAME (type
), stream
);
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
);
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
, "]");
470 /* i18n: Do not translate the "SET OF" part! */
471 fprintf_filtered(stream
, _("SET OF <unknown>"));
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)
494 if (strcmp (TYPE_FIELD_NAME (type
, 0), "_m2_contents") != 0)
496 if (strcmp (TYPE_FIELD_NAME (type
, 1), "_m2_high") != 0)
498 if (TYPE_CODE (TYPE_FIELD_TYPE (type
, 0)) != TYPE_CODE_PTR
)
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. */
511 m2_unbounded_array (struct type
*type
, struct ui_file
*stream
, int show
,
514 if (m2_is_unbounded_array (type
))
518 fputs_filtered ("ARRAY OF ", stream
);
519 m2_print_type (TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type
, 0)),
520 "", stream
, 0, level
);
528 m2_record_fields (struct type
*type
, struct ui_file
*stream
, int show
,
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
);
538 fprintf_filtered (stream
, " = ");
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 ");
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
++)
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 ");
588 m2_enum (struct type
*type
, struct ui_file
*stream
, int show
, int level
)
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
);
603 for (i
= 0; i
< len
; i
++)
607 fprintf_filtered (stream
, ", ");
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
);
617 fprintf_filtered (stream
, ")");