xref: /dragonfly/contrib/gdb-7/gdb/m2-typeprint.c (revision 6e5c5008)
1 /* Support for printing Modula 2 types for GDB, the GNU debugger.
2    Copyright (C) 1986-2013 Free Software Foundation, Inc.
3 
4    This file is part of GDB.
5 
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3 of the License, or
9    (at your option) any later version.
10 
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15 
16    You should have received a copy of the GNU General Public License
17    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
18 
19 #include "defs.h"
20 #include "gdb_obstack.h"
21 #include "bfd.h"		/* Binary File Description */
22 #include "symtab.h"
23 #include "gdbtypes.h"
24 #include "expression.h"
25 #include "value.h"
26 #include "gdbcore.h"
27 #include "m2-lang.h"
28 #include "target.h"
29 #include "language.h"
30 #include "demangle.h"
31 #include "c-lang.h"
32 #include "typeprint.h"
33 #include "cp-abi.h"
34 
35 #include "gdb_string.h"
36 #include <errno.h>
37 
38 static void m2_print_bounds (struct type *type,
39 			     struct ui_file *stream, int show, int level,
40 			     int print_high);
41 
42 static void m2_typedef (struct type *, struct ui_file *, int, int,
43 			const struct type_print_options *);
44 static void m2_array (struct type *, struct ui_file *, int, int,
45 		      const struct type_print_options *);
46 static void m2_pointer (struct type *, struct ui_file *, int, int,
47 			const struct type_print_options *);
48 static void m2_ref (struct type *, struct ui_file *, int, int,
49 		    const struct type_print_options *);
50 static void m2_procedure (struct type *, struct ui_file *, int, int,
51 			  const struct type_print_options *);
52 static void m2_union (struct type *, struct ui_file *);
53 static void m2_enum (struct type *, struct ui_file *, int, int);
54 static void m2_range (struct type *, struct ui_file *, int, int,
55 		      const struct type_print_options *);
56 static void m2_type_name (struct type *type, struct ui_file *stream);
57 static void m2_short_set (struct type *type, struct ui_file *stream,
58 			  int show, int level);
59 static int m2_long_set (struct type *type, struct ui_file *stream,
60 			int show, int level, const struct type_print_options *flags);
61 static int m2_unbounded_array (struct type *type, struct ui_file *stream,
62 			       int show, int level,
63 			       const struct type_print_options *flags);
64 static void m2_record_fields (struct type *type, struct ui_file *stream,
65 			      int show, int level, const struct type_print_options *flags);
66 static void m2_unknown (const char *s, struct type *type,
67 			struct ui_file *stream, int show, int level);
68 
69 int m2_is_long_set (struct type *type);
70 int m2_is_long_set_of_type (struct type *type, struct type **of_type);
71 int m2_is_unbounded_array (struct type *type);
72 
73 
74 void
75 m2_print_type (struct type *type, const char *varstring,
76 	       struct ui_file *stream,
77 	       int show, int level,
78 	       const struct type_print_options *flags)
79 {
80   CHECK_TYPEDEF (type);
81 
82   QUIT;
83 
84   wrap_here ("    ");
85   if (type == NULL)
86     {
87       fputs_filtered (_("<type unknown>"), stream);
88       return;
89     }
90 
91   switch (TYPE_CODE (type))
92     {
93     case TYPE_CODE_SET:
94       m2_short_set(type, stream, show, level);
95       break;
96 
97     case TYPE_CODE_STRUCT:
98       if (m2_long_set (type, stream, show, level, flags)
99 	  || m2_unbounded_array (type, stream, show, level, flags))
100 	break;
101       m2_record_fields (type, stream, show, level, flags);
102       break;
103 
104     case TYPE_CODE_TYPEDEF:
105       m2_typedef (type, stream, show, level, flags);
106       break;
107 
108     case TYPE_CODE_ARRAY:
109       m2_array (type, stream, show, level, flags);
110       break;
111 
112     case TYPE_CODE_PTR:
113       m2_pointer (type, stream, show, level, flags);
114       break;
115 
116     case TYPE_CODE_REF:
117       m2_ref (type, stream, show, level, flags);
118       break;
119 
120     case TYPE_CODE_METHOD:
121       m2_unknown (_("method"), type, stream, show, level);
122       break;
123 
124     case TYPE_CODE_FUNC:
125       m2_procedure (type, stream, show, level, flags);
126       break;
127 
128     case TYPE_CODE_UNION:
129       m2_union (type, stream);
130       break;
131 
132     case TYPE_CODE_ENUM:
133       m2_enum (type, stream, show, level);
134       break;
135 
136     case TYPE_CODE_VOID:
137       break;
138 
139     case TYPE_CODE_UNDEF:
140       /* i18n: Do not translate the "struct" part!  */
141       m2_unknown (_("undef"), type, stream, show, level);
142       break;
143 
144     case TYPE_CODE_ERROR:
145       m2_unknown (_("error"), type, stream, show, level);
146       break;
147 
148     case TYPE_CODE_RANGE:
149       m2_range (type, stream, show, level, flags);
150       break;
151 
152     default:
153       m2_type_name (type, stream);
154       break;
155     }
156 }
157 
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
160    which to print.  */
161 
162 void
163 m2_print_typedef (struct type *type, struct symbol *new_symbol,
164 		  struct ui_file *stream)
165 {
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));
172   else
173     fprintf_filtered (stream, "<builtin> = ");
174   type_print (type, "", stream, 0);
175   fprintf_filtered (stream, ";\n");
176 }
177 
178 /* m2_type_name - if a, type, has a name then print it.  */
179 
180 void
181 m2_type_name (struct type *type, struct ui_file *stream)
182 {
183   if (TYPE_NAME (type) != NULL)
184     fputs_filtered (TYPE_NAME (type), stream);
185 }
186 
187 /* m2_range - displays a Modula-2 subrange type.  */
188 
189 void
190 m2_range (struct type *type, struct ui_file *stream, int show,
191 	  int level, const struct type_print_options *flags)
192 {
193   if (TYPE_HIGH_BOUND (type) == TYPE_LOW_BOUND (type))
194     m2_print_type (TYPE_DOMAIN_TYPE (type), "", stream, show, level,
195 		   flags);
196   else
197     {
198       struct type *target = TYPE_TARGET_TYPE (type);
199 
200       fprintf_filtered (stream, "[");
201       print_type_scalar (target, TYPE_LOW_BOUND (type), stream);
202       fprintf_filtered (stream, "..");
203       print_type_scalar (target, TYPE_HIGH_BOUND (type), stream);
204       fprintf_filtered (stream, "]");
205     }
206 }
207 
208 static void
209 m2_typedef (struct type *type, struct ui_file *stream, int show,
210 	    int level, const struct type_print_options *flags)
211 {
212   if (TYPE_NAME (type) != NULL)
213     {
214       fputs_filtered (TYPE_NAME (type), stream);
215       fputs_filtered (" = ", stream);
216     }
217   m2_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level, flags);
218 }
219 
220 /* m2_array - prints out a Modula-2 ARRAY ... OF type.  */
221 
222 static void m2_array (struct type *type, struct ui_file *stream,
223 		      int show, int level, const struct type_print_options *flags)
224 {
225   fprintf_filtered (stream, "ARRAY [");
226   if (TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0
227       && !TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type))
228     {
229       if (TYPE_INDEX_TYPE (type) != 0)
230 	{
231 	  m2_print_bounds (TYPE_INDEX_TYPE (type), stream, show, -1, 0);
232 	  fprintf_filtered (stream, "..");
233 	  m2_print_bounds (TYPE_INDEX_TYPE (type), stream, show, -1, 1);
234 	}
235       else
236 	fprintf_filtered (stream, "%d",
237 			  (TYPE_LENGTH (type)
238 			   / TYPE_LENGTH (TYPE_TARGET_TYPE (type))));
239     }
240   fprintf_filtered (stream, "] OF ");
241   m2_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level, flags);
242 }
243 
244 static void
245 m2_pointer (struct type *type, struct ui_file *stream, int show,
246 	    int level, const struct type_print_options *flags)
247 {
248   if (TYPE_CONST (type))
249     fprintf_filtered (stream, "[...] : ");
250   else
251     fprintf_filtered (stream, "POINTER TO ");
252 
253   m2_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level, flags);
254 }
255 
256 static void
257 m2_ref (struct type *type, struct ui_file *stream, int show,
258 	int level, const struct type_print_options *flags)
259 {
260   fprintf_filtered (stream, "VAR");
261   m2_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level, flags);
262 }
263 
264 static void
265 m2_unknown (const char *s, struct type *type, struct ui_file *stream,
266 	    int show, int level)
267 {
268   fprintf_filtered (stream, "%s %s", s, _("is unknown"));
269 }
270 
271 static void m2_union (struct type *type, struct ui_file *stream)
272 {
273   fprintf_filtered (stream, "union");
274 }
275 
276 static void
277 m2_procedure (struct type *type, struct ui_file *stream,
278 	      int show, int level, const struct type_print_options *flags)
279 {
280   fprintf_filtered (stream, "PROCEDURE ");
281   m2_type_name (type, stream);
282   if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_VOID)
283     {
284       int i, len = TYPE_NFIELDS (type);
285 
286       fprintf_filtered (stream, " (");
287       for (i = 0; i < len; i++)
288 	{
289 	  if (i > 0)
290 	    {
291 	      fputs_filtered (", ", stream);
292 	      wrap_here ("    ");
293 	    }
294 	  m2_print_type (TYPE_FIELD_TYPE (type, i), "", stream, -1, 0, flags);
295 	}
296       if (TYPE_TARGET_TYPE (type) != NULL)
297 	{
298 	  fprintf_filtered (stream, " : ");
299 	  m2_print_type (TYPE_TARGET_TYPE (type), "", stream, 0, 0, flags);
300 	}
301     }
302 }
303 
304 static void
305 m2_print_bounds (struct type *type,
306 		 struct ui_file *stream, int show, int level,
307 		 int print_high)
308 {
309   struct type *target = TYPE_TARGET_TYPE (type);
310 
311   if (TYPE_NFIELDS(type) == 0)
312     return;
313 
314   if (print_high)
315     print_type_scalar (target, TYPE_HIGH_BOUND (type), stream);
316   else
317     print_type_scalar (target, TYPE_LOW_BOUND (type), stream);
318 }
319 
320 static void
321 m2_short_set (struct type *type, struct ui_file *stream, int show, int level)
322 {
323   fprintf_filtered(stream, "SET [");
324   m2_print_bounds (TYPE_INDEX_TYPE (type), stream,
325 		   show - 1, level, 0);
326 
327   fprintf_filtered(stream, "..");
328   m2_print_bounds (TYPE_INDEX_TYPE (type), stream,
329 		   show - 1, level, 1);
330   fprintf_filtered(stream, "]");
331 }
332 
333 int
334 m2_is_long_set (struct type *type)
335 {
336   LONGEST previous_high = 0;  /* Unnecessary initialization
337 				 keeps gcc -Wall happy.  */
338   int len, i;
339   struct type *range;
340 
341   if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
342     {
343 
344       /* check if all fields of the RECORD are consecutive sets.  */
345 
346       len = TYPE_NFIELDS (type);
347       for (i = TYPE_N_BASECLASSES (type); i < len; i++)
348 	{
349 	  if (TYPE_FIELD_TYPE (type, i) == NULL)
350 	    return 0;
351 	  if (TYPE_CODE (TYPE_FIELD_TYPE (type, i)) != TYPE_CODE_SET)
352 	    return 0;
353 	  if (TYPE_FIELD_NAME (type, i) != NULL
354 	      && (strcmp (TYPE_FIELD_NAME (type, i), "") != 0))
355 	    return 0;
356 	  range = TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, i));
357 	  if ((i > TYPE_N_BASECLASSES (type))
358 	      && previous_high + 1 != TYPE_LOW_BOUND (range))
359 	    return 0;
360 	  previous_high = TYPE_HIGH_BOUND (range);
361 	}
362       return len>0;
363     }
364   return 0;
365 }
366 
367 /* m2_get_discrete_bounds - a wrapper for get_discrete_bounds which
368                             understands that CHARs might be signed.
369                             This should be integrated into gdbtypes.c
370                             inside get_discrete_bounds.  */
371 
372 static int
373 m2_get_discrete_bounds (struct type *type, LONGEST *lowp, LONGEST *highp)
374 {
375   CHECK_TYPEDEF (type);
376   switch (TYPE_CODE (type))
377     {
378     case TYPE_CODE_CHAR:
379       if (TYPE_LENGTH (type) < sizeof (LONGEST))
380 	{
381 	  if (!TYPE_UNSIGNED (type))
382 	    {
383 	      *lowp = -(1 << (TYPE_LENGTH (type) * TARGET_CHAR_BIT - 1));
384 	      *highp = -*lowp - 1;
385 	      return 0;
386 	    }
387 	}
388       /* fall through */
389     default:
390       return get_discrete_bounds (type, lowp, highp);
391     }
392 }
393 
394 /* m2_is_long_set_of_type - returns TRUE if the long set was declared as
395                             SET OF <oftype> of_type is assigned to the
396                             subtype.  */
397 
398 int
399 m2_is_long_set_of_type (struct type *type, struct type **of_type)
400 {
401   int len, i;
402   struct type *range;
403   struct type *target;
404   LONGEST l1, l2;
405   LONGEST h1, h2;
406 
407   if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
408     {
409       len = TYPE_NFIELDS (type);
410       i = TYPE_N_BASECLASSES (type);
411       if (len == 0)
412 	return 0;
413       range = TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, i));
414       target = TYPE_TARGET_TYPE (range);
415 
416       l1 = TYPE_LOW_BOUND (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, i)));
417       h1 = TYPE_HIGH_BOUND (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, len-1)));
418       *of_type = target;
419       if (m2_get_discrete_bounds (target, &l2, &h2) >= 0)
420 	return (l1 == l2 && h1 == h2);
421       error (_("long_set failed to find discrete bounds for its subtype"));
422       return 0;
423     }
424   error (_("expecting long_set"));
425   return 0;
426 }
427 
428 static int
429 m2_long_set (struct type *type, struct ui_file *stream, int show, int level,
430 	     const struct type_print_options *flags)
431 {
432   struct type *of_type;
433   int i;
434   int len = TYPE_NFIELDS (type);
435   LONGEST low;
436   LONGEST high;
437 
438   if (m2_is_long_set (type))
439     {
440       if (TYPE_TAG_NAME (type) != NULL)
441 	{
442 	  fputs_filtered (TYPE_TAG_NAME (type), stream);
443 	  if (show == 0)
444 	    return 1;
445 	}
446       else if (TYPE_NAME (type) != NULL)
447 	{
448 	  fputs_filtered (TYPE_NAME (type), stream);
449 	  if (show == 0)
450 	    return 1;
451 	}
452 
453       if (TYPE_TAG_NAME (type) != NULL || TYPE_NAME (type) != NULL)
454 	fputs_filtered (" = ", stream);
455 
456       if (get_long_set_bounds (type, &low, &high))
457 	{
458 	  fprintf_filtered(stream, "SET OF ");
459 	  i = TYPE_N_BASECLASSES (type);
460 	  if (m2_is_long_set_of_type (type, &of_type))
461 	    m2_print_type (of_type, "", stream, show - 1, level, flags);
462 	  else
463 	    {
464 	      fprintf_filtered(stream, "[");
465 	      m2_print_bounds (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, i)),
466 			       stream, show - 1, level, 0);
467 
468 	      fprintf_filtered(stream, "..");
469 
470 	      m2_print_bounds (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, len-1)),
471 			       stream, show - 1, level, 1);
472 	      fprintf_filtered(stream, "]");
473 	    }
474 	}
475       else
476 	/* i18n: Do not translate the "SET OF" part!  */
477 	fprintf_filtered(stream, _("SET OF <unknown>"));
478 
479       return 1;
480     }
481   return 0;
482 }
483 
484 /* m2_is_unbounded_array - returns TRUE if, type, should be regarded
485                            as a Modula-2 unbounded ARRAY type.  */
486 
487 int
488 m2_is_unbounded_array (struct type *type)
489 {
490   if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
491     {
492       /*
493        *  check if we have a structure with exactly two fields named
494        *  _m2_contents and _m2_high.  It also checks to see if the
495        *  type of _m2_contents is a pointer.  The TYPE_TARGET_TYPE
496        *  of the pointer determines the unbounded ARRAY OF type.
497        */
498       if (TYPE_NFIELDS (type) != 2)
499 	return 0;
500       if (strcmp (TYPE_FIELD_NAME (type, 0), "_m2_contents") != 0)
501 	return 0;
502       if (strcmp (TYPE_FIELD_NAME (type, 1), "_m2_high") != 0)
503 	return 0;
504       if (TYPE_CODE (TYPE_FIELD_TYPE (type, 0)) != TYPE_CODE_PTR)
505 	return 0;
506       return 1;
507     }
508   return 0;
509 }
510 
511 /* m2_unbounded_array - if the struct type matches a Modula-2 unbounded
512                         parameter type then display the type as an
513                         ARRAY OF type.  Returns TRUE if an unbounded
514                         array type was detected.  */
515 
516 static int
517 m2_unbounded_array (struct type *type, struct ui_file *stream, int show,
518 		    int level, const struct type_print_options *flags)
519 {
520   if (m2_is_unbounded_array (type))
521     {
522       if (show > 0)
523 	{
524 	  fputs_filtered ("ARRAY OF ", stream);
525 	  m2_print_type (TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type, 0)),
526 			 "", stream, 0, level, flags);
527 	}
528       return 1;
529     }
530   return 0;
531 }
532 
533 void
534 m2_record_fields (struct type *type, struct ui_file *stream, int show,
535 		  int level, const struct type_print_options *flags)
536 {
537   /* Print the tag if it exists.  */
538   if (TYPE_TAG_NAME (type) != NULL)
539     {
540       if (strncmp (TYPE_TAG_NAME (type), "$$", 2) != 0)
541 	{
542 	  fputs_filtered (TYPE_TAG_NAME (type), stream);
543 	  if (show > 0)
544 	    fprintf_filtered (stream, " = ");
545 	}
546     }
547   wrap_here ("    ");
548   if (show < 0)
549     {
550       if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
551 	fprintf_filtered (stream, "RECORD ... END ");
552       else if (TYPE_CODE (type) == TYPE_CODE_UNION)
553 	fprintf_filtered (stream, "CASE ... END ");
554     }
555   else if (show > 0)
556     {
557       int i;
558       int len = TYPE_NFIELDS (type);
559 
560       if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
561 	fprintf_filtered (stream, "RECORD\n");
562       else if (TYPE_CODE (type) == TYPE_CODE_UNION)
563 	/* i18n: Do not translate "CASE" and "OF".  */
564 	fprintf_filtered (stream, _("CASE <variant> OF\n"));
565 
566       for (i = TYPE_N_BASECLASSES (type); i < len; i++)
567 	{
568 	  QUIT;
569 
570 	  print_spaces_filtered (level + 4, stream);
571 	  fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
572 	  fputs_filtered (" : ", stream);
573 	  m2_print_type (TYPE_FIELD_TYPE (type, i),
574 			 "",
575 			 stream, 0, level + 4, flags);
576 	  if (TYPE_FIELD_PACKED (type, i))
577 	    {
578 	      /* It is a bitfield.  This code does not attempt
579 		 to look at the bitpos and reconstruct filler,
580 		 unnamed fields.  This would lead to misleading
581 		 results if the compiler does not put out fields
582 		 for such things (I don't know what it does).  */
583 	      fprintf_filtered (stream, " : %d",
584 				TYPE_FIELD_BITSIZE (type, i));
585 	    }
586 	  fprintf_filtered (stream, ";\n");
587 	}
588 
589       fprintfi_filtered (level, stream, "END ");
590     }
591 }
592 
593 void
594 m2_enum (struct type *type, struct ui_file *stream, int show, int level)
595 {
596   LONGEST lastval;
597   int i, len;
598 
599   if (show < 0)
600     {
601       /* If we just printed a tag name, no need to print anything else.  */
602       if (TYPE_TAG_NAME (type) == NULL)
603 	fprintf_filtered (stream, "(...)");
604     }
605   else if (show > 0 || TYPE_TAG_NAME (type) == NULL)
606     {
607       fprintf_filtered (stream, "(");
608       len = TYPE_NFIELDS (type);
609       lastval = 0;
610       for (i = 0; i < len; i++)
611 	{
612 	  QUIT;
613 	  if (i > 0)
614 	    fprintf_filtered (stream, ", ");
615 	  wrap_here ("    ");
616 	  fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
617 	  if (lastval != TYPE_FIELD_ENUMVAL (type, i))
618 	    {
619 	      fprintf_filtered (stream, " = %s",
620 				plongest (TYPE_FIELD_ENUMVAL (type, i)));
621 	      lastval = TYPE_FIELD_ENUMVAL (type, i);
622 	    }
623 	  lastval++;
624 	}
625       fprintf_filtered (stream, ")");
626     }
627 }
628