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
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
, char *varstring
, struct ui_file
*stream
,
83 fputs_filtered (_("<type unknown>"), stream
);
87 code
= TYPE_CODE (type
);
88 switch (TYPE_CODE (type
))
91 m2_short_set(type
, stream
, show
, level
);
94 case TYPE_CODE_STRUCT
:
95 if (m2_long_set (type
, stream
, show
, level
)
96 || m2_unbounded_array (type
, stream
, show
, level
))
98 m2_record_fields (type
, stream
, show
, level
);
101 case TYPE_CODE_TYPEDEF
:
102 m2_typedef (type
, stream
, show
, level
);
105 case TYPE_CODE_ARRAY
:
106 m2_array (type
, stream
, show
, level
);
110 m2_pointer (type
, stream
, show
, level
);
114 m2_ref (type
, stream
, show
, level
);
117 case TYPE_CODE_METHOD
:
118 m2_unknown (_("method"), type
, stream
, show
, level
);
122 m2_procedure (type
, stream
, show
, level
);
125 case TYPE_CODE_UNION
:
126 m2_union (type
, stream
);
130 m2_enum (type
, stream
, show
, level
);
136 case TYPE_CODE_UNDEF
:
137 /* i18n: Do not translate the "struct" part! */
138 m2_unknown (_("undef"), type
, stream
, show
, level
);
141 case TYPE_CODE_ERROR
:
142 m2_unknown (_("error"), type
, stream
, show
, level
);
145 case TYPE_CODE_RANGE
:
146 m2_range (type
, stream
, show
, level
);
149 case TYPE_CODE_TEMPLATE
:
153 m2_type_name (type
, stream
);
158 /* Print a typedef using M2 syntax. TYPE is the underlying type.
159 NEW_SYMBOL is the symbol naming the type. STREAM is the stream on
163 m2_print_typedef (struct type
*type
, struct symbol
*new_symbol
,
164 struct ui_file
*stream
)
166 CHECK_TYPEDEF (type
);
167 fprintf_filtered (stream
, "TYPE ");
168 if (!TYPE_NAME (SYMBOL_TYPE (new_symbol
))
169 || strcmp (TYPE_NAME ((SYMBOL_TYPE (new_symbol
))),
170 SYMBOL_LINKAGE_NAME (new_symbol
)) != 0)
171 fprintf_filtered (stream
, "%s = ", SYMBOL_PRINT_NAME (new_symbol
));
173 fprintf_filtered (stream
, "<builtin> = ");
174 type_print (type
, "", stream
, 0);
175 fprintf_filtered (stream
, ";\n");
178 /* m2_type_name - if a, type, has a name then print it. */
181 m2_type_name (struct type
*type
, struct ui_file
*stream
)
183 if (TYPE_NAME (type
) != NULL
)
184 fputs_filtered (TYPE_NAME (type
), stream
);
187 /* m2_range - displays a Modula-2 subrange type. */
190 m2_range (struct type
*type
, struct ui_file
*stream
, int show
,
193 if (TYPE_HIGH_BOUND (type
) == TYPE_LOW_BOUND (type
))
194 m2_print_type (TYPE_DOMAIN_TYPE (type
), "", stream
, show
, level
);
197 struct type
*target
= TYPE_TARGET_TYPE (type
);
199 fprintf_filtered (stream
, "[");
200 print_type_scalar (target
, TYPE_LOW_BOUND (type
), stream
);
201 fprintf_filtered (stream
, "..");
202 print_type_scalar (target
, TYPE_HIGH_BOUND (type
), stream
);
203 fprintf_filtered (stream
, "]");
208 m2_typedef (struct type
*type
, struct ui_file
*stream
, int show
,
211 if (TYPE_NAME (type
) != NULL
)
213 fputs_filtered (TYPE_NAME (type
), stream
);
214 fputs_filtered (" = ", stream
);
216 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, show
, level
);
219 /* m2_array - prints out a Modula-2 ARRAY ... OF type. */
221 static void m2_array (struct type
*type
, struct ui_file
*stream
,
224 fprintf_filtered (stream
, "ARRAY [");
225 if (TYPE_LENGTH (TYPE_TARGET_TYPE (type
)) > 0
226 && !TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type
))
228 if (TYPE_INDEX_TYPE (type
) != 0)
230 m2_print_bounds (TYPE_INDEX_TYPE (type
), stream
, show
, -1, 0);
231 fprintf_filtered (stream
, "..");
232 m2_print_bounds (TYPE_INDEX_TYPE (type
), stream
, show
, -1, 1);
235 fprintf_filtered (stream
, "%d",
237 / TYPE_LENGTH (TYPE_TARGET_TYPE (type
))));
239 fprintf_filtered (stream
, "] OF ");
240 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, show
, level
);
244 m2_pointer (struct type
*type
, struct ui_file
*stream
, int show
,
247 if (TYPE_CONST (type
))
248 fprintf_filtered (stream
, "[...] : ");
250 fprintf_filtered (stream
, "POINTER TO ");
252 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, show
, level
);
256 m2_ref (struct type
*type
, struct ui_file
*stream
, int show
,
259 fprintf_filtered (stream
, "VAR");
260 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, show
, level
);
264 m2_unknown (const char *s
, struct type
*type
, struct ui_file
*stream
,
267 fprintf_filtered (stream
, "%s %s", s
, _("is unknown"));
270 static void m2_union (struct type
*type
, struct ui_file
*stream
)
272 fprintf_filtered (stream
, "union");
276 m2_procedure (struct type
*type
, struct ui_file
*stream
,
279 fprintf_filtered (stream
, "PROCEDURE ");
280 m2_type_name (type
, stream
);
281 if (TYPE_CODE (TYPE_TARGET_TYPE (type
)) != TYPE_CODE_VOID
)
283 int i
, len
= TYPE_NFIELDS (type
);
285 fprintf_filtered (stream
, " (");
286 for (i
= 0; i
< len
; i
++)
290 fputs_filtered (", ", stream
);
293 m2_print_type (TYPE_FIELD_TYPE (type
, i
), "", stream
, -1, 0);
295 if (TYPE_TARGET_TYPE (type
) != NULL
)
297 fprintf_filtered (stream
, " : ");
298 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, 0, 0);
304 m2_print_bounds (struct type
*type
,
305 struct ui_file
*stream
, int show
, int level
,
308 struct type
*target
= TYPE_TARGET_TYPE (type
);
311 target
= builtin_type_int32
;
313 if (TYPE_NFIELDS(type
) == 0)
317 print_type_scalar (target
, TYPE_HIGH_BOUND (type
), stream
);
319 print_type_scalar (target
, TYPE_LOW_BOUND (type
), stream
);
323 m2_short_set (struct type
*type
, struct ui_file
*stream
, int show
, int level
)
325 fprintf_filtered(stream
, "SET [");
326 m2_print_bounds (TYPE_INDEX_TYPE (type
), stream
,
329 fprintf_filtered(stream
, "..");
330 m2_print_bounds (TYPE_INDEX_TYPE (type
), stream
,
332 fprintf_filtered(stream
, "]");
336 m2_is_long_set (struct type
*type
)
338 LONGEST previous_high
= 0; /* unnecessary initialization
339 keeps gcc -Wall happy */
343 if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
)
346 /* check if all fields of the RECORD are consecutive sets. */
348 len
= TYPE_NFIELDS (type
);
349 for (i
= TYPE_N_BASECLASSES (type
); i
< len
; i
++)
351 if (TYPE_FIELD_TYPE (type
, i
) == NULL
)
353 if (TYPE_CODE (TYPE_FIELD_TYPE (type
, i
)) != TYPE_CODE_SET
)
355 if (TYPE_FIELD_NAME (type
, i
) != NULL
356 && (strcmp (TYPE_FIELD_NAME (type
, i
), "") != 0))
358 range
= TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, i
));
359 if ((i
> TYPE_N_BASECLASSES (type
))
360 && previous_high
+ 1 != TYPE_LOW_BOUND (range
))
362 previous_high
= TYPE_HIGH_BOUND (range
);
369 /* m2_get_discrete_bounds - a wrapper for get_discrete_bounds which
370 understands that CHARs might be signed.
371 This should be integrated into gdbtypes.c
372 inside get_discrete_bounds. */
375 m2_get_discrete_bounds (struct type
*type
, LONGEST
*lowp
, LONGEST
*highp
)
377 CHECK_TYPEDEF (type
);
378 switch (TYPE_CODE (type
))
381 if (TYPE_LENGTH (type
) < sizeof (LONGEST
))
383 if (!TYPE_UNSIGNED (type
))
385 *lowp
= -(1 << (TYPE_LENGTH (type
) * TARGET_CHAR_BIT
- 1));
392 return get_discrete_bounds (type
, lowp
, highp
);
396 /* m2_is_long_set_of_type - returns TRUE if the long set was declared as
397 SET OF <oftype> of_type is assigned to the
401 m2_is_long_set_of_type (struct type
*type
, struct type
**of_type
)
409 if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
)
411 len
= TYPE_NFIELDS (type
);
412 i
= TYPE_N_BASECLASSES (type
);
415 range
= TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, i
));
416 target
= TYPE_TARGET_TYPE (range
);
418 target
= builtin_type_int32
;
420 l1
= TYPE_LOW_BOUND (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, i
)));
421 h1
= TYPE_HIGH_BOUND (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, len
-1)));
423 if (m2_get_discrete_bounds (target
, &l2
, &h2
) >= 0)
424 return (l1
== l2
&& h1
== h2
);
425 error (_("long_set failed to find discrete bounds for its subtype"));
428 error (_("expecting long_set"));
433 m2_long_set (struct type
*type
, struct ui_file
*stream
, int show
, int level
)
435 struct type
*index_type
;
436 struct type
*range_type
;
437 struct type
*of_type
;
439 int len
= TYPE_NFIELDS (type
);
443 if (m2_is_long_set (type
))
445 if (TYPE_TAG_NAME (type
) != NULL
)
447 fputs_filtered (TYPE_TAG_NAME (type
), stream
);
451 else if (TYPE_NAME (type
) != NULL
)
453 fputs_filtered (TYPE_NAME (type
), stream
);
458 if (TYPE_TAG_NAME (type
) != NULL
|| TYPE_NAME (type
) != NULL
)
459 fputs_filtered (" = ", stream
);
461 if (get_long_set_bounds (type
, &low
, &high
))
463 fprintf_filtered(stream
, "SET OF ");
464 i
= TYPE_N_BASECLASSES (type
);
465 if (m2_is_long_set_of_type (type
, &of_type
))
466 m2_print_type (of_type
, "", stream
, show
- 1, level
);
469 fprintf_filtered(stream
, "[");
470 m2_print_bounds (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, i
)),
471 stream
, show
- 1, level
, 0);
473 fprintf_filtered(stream
, "..");
475 m2_print_bounds (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, len
-1)),
476 stream
, show
- 1, level
, 1);
477 fprintf_filtered(stream
, "]");
481 /* i18n: Do not translate the "SET OF" part! */
482 fprintf_filtered(stream
, _("SET OF <unknown>"));
489 /* m2_is_unbounded_array - returns TRUE if, type, should be regarded
490 as a Modula-2 unbounded ARRAY type. */
493 m2_is_unbounded_array (struct type
*type
)
495 if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
)
498 * check if we have a structure with exactly two fields named
499 * _m2_contents and _m2_high. It also checks to see if the
500 * type of _m2_contents is a pointer. The TYPE_TARGET_TYPE
501 * of the pointer determines the unbounded ARRAY OF type.
503 if (TYPE_NFIELDS (type
) != 2)
505 if (strcmp (TYPE_FIELD_NAME (type
, 0), "_m2_contents") != 0)
507 if (strcmp (TYPE_FIELD_NAME (type
, 1), "_m2_high") != 0)
509 if (TYPE_CODE (TYPE_FIELD_TYPE (type
, 0)) != TYPE_CODE_PTR
)
516 /* m2_unbounded_array - if the struct type matches a Modula-2 unbounded
517 parameter type then display the type as an
518 ARRAY OF type. Returns TRUE if an unbounded
519 array type was detected. */
522 m2_unbounded_array (struct type
*type
, struct ui_file
*stream
, int show
,
525 if (m2_is_unbounded_array (type
))
529 fputs_filtered ("ARRAY OF ", stream
);
530 m2_print_type (TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type
, 0)),
531 "", stream
, 0, level
);
539 m2_record_fields (struct type
*type
, struct ui_file
*stream
, int show
,
542 /* Print the tag if it exists. */
543 if (TYPE_TAG_NAME (type
) != NULL
)
545 if (strncmp (TYPE_TAG_NAME (type
), "$$", 2) != 0)
547 fputs_filtered (TYPE_TAG_NAME (type
), stream
);
549 fprintf_filtered (stream
, " = ");
555 if (TYPE_CODE (type
) == DECLARED_TYPE_STRUCT
)
556 fprintf_filtered (stream
, "RECORD ... END ");
557 else if (TYPE_DECLARED_TYPE (type
) == DECLARED_TYPE_UNION
)
558 fprintf_filtered (stream
, "CASE ... END ");
563 int len
= TYPE_NFIELDS (type
);
565 if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
)
566 fprintf_filtered (stream
, "RECORD\n");
567 else if (TYPE_CODE (type
) == TYPE_CODE_UNION
)
568 /* i18n: Do not translate "CASE" and "OF" */
569 fprintf_filtered (stream
, _("CASE <variant> OF\n"));
571 for (i
= TYPE_N_BASECLASSES (type
); i
< len
; i
++)
575 print_spaces_filtered (level
+ 4, stream
);
576 fputs_filtered (TYPE_FIELD_NAME (type
, i
), stream
);
577 fputs_filtered (" : ", stream
);
578 m2_print_type (TYPE_FIELD_TYPE (type
, i
),
580 stream
, 0, level
+ 4);
581 if (TYPE_FIELD_PACKED (type
, i
))
583 /* It is a bitfield. This code does not attempt
584 to look at the bitpos and reconstruct filler,
585 unnamed fields. This would lead to misleading
586 results if the compiler does not put out fields
587 for such things (I don't know what it does). */
588 fprintf_filtered (stream
, " : %d",
589 TYPE_FIELD_BITSIZE (type
, i
));
591 fprintf_filtered (stream
, ";\n");
594 fprintfi_filtered (level
, stream
, "END ");
599 m2_enum (struct type
*type
, struct ui_file
*stream
, int show
, int level
)
605 /* If we just printed a tag name, no need to print anything else. */
606 if (TYPE_TAG_NAME (type
) == NULL
)
607 fprintf_filtered (stream
, "(...)");
609 else if (show
> 0 || TYPE_TAG_NAME (type
) == NULL
)
611 fprintf_filtered (stream
, "(");
612 len
= TYPE_NFIELDS (type
);
614 for (i
= 0; i
< len
; i
++)
618 fprintf_filtered (stream
, ", ");
620 fputs_filtered (TYPE_FIELD_NAME (type
, i
), stream
);
621 if (lastval
!= TYPE_FIELD_BITPOS (type
, i
))
623 fprintf_filtered (stream
, " = %d", TYPE_FIELD_BITPOS (type
, i
));
624 lastval
= TYPE_FIELD_BITPOS (type
, i
);
628 fprintf_filtered (stream
, ")");
This page took 0.043016 seconds and 4 git commands to generate.