xref: /netbsd-src/external/gpl3/binutils/dist/binutils/prdbg.c (revision a5847cc334d9a7029f6352b847e9e8d71a0f9e0c)
1 /* prdbg.c -- Print out generic debugging information.
2    Copyright 1995, 1996, 1999, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
3    2009  Free Software Foundation, Inc.
4    Written by Ian Lance Taylor <ian@cygnus.com>.
5    Tags style generation written by Salvador E. Tropea <set@computer.org>.
6 
7    This file is part of GNU Binutils.
8 
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3 of the License, or
12    (at your option) any later version.
13 
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18 
19    You should have received a copy of the GNU General Public License
20    along with this program; if not, write to the Free Software
21    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
22    02110-1301, USA.  */
23 
24 /* This file prints out the generic debugging information, by
25    supplying a set of routines to debug_write.  */
26 
27 #include "sysdep.h"
28 #include <assert.h>
29 #include "bfd.h"
30 #include "libiberty.h"
31 #include "demangle.h"
32 #include "debug.h"
33 #include "budbg.h"
34 
35 /* This is the structure we use as a handle for these routines.  */
36 
37 struct pr_handle
38 {
39   /* File to print information to.  */
40   FILE *f;
41   /* Current indentation level.  */
42   unsigned int indent;
43   /* Type stack.  */
44   struct pr_stack *stack;
45   /* Parameter number we are about to output.  */
46   int parameter;
47   /* The following are used only by the tags code (tg_).  */
48   /* Name of the file we are using.  */
49   char *filename;
50   /* The BFD.  */
51   bfd *abfd;
52   /* The symbols table for this BFD.  */
53   asymbol **syms;
54   /* Pointer to a function to demangle symbols.  */
55   char *(*demangler) (bfd *, const char *, int);
56 };
57 
58 /* The type stack.  */
59 
60 struct pr_stack
61 {
62   /* Next element on the stack.  */
63   struct pr_stack *next;
64   /* This element.  */
65   char *type;
66   /* Current visibility of fields if this is a class.  */
67   enum debug_visibility visibility;
68   /* Name of the current method we are handling.  */
69   const char *method;
70   /* The following are used only by the tags code (tg_).  */
71   /* Type for the container (struct, union, class, union class).  */
72   const char *flavor;
73   /* A comma separated list of parent classes.  */
74   char *parents;
75   /* How many parents contains parents.  */
76   int num_parents;
77 };
78 
79 static void indent (struct pr_handle *);
80 static bfd_boolean push_type (struct pr_handle *, const char *);
81 static bfd_boolean prepend_type (struct pr_handle *, const char *);
82 static bfd_boolean append_type (struct pr_handle *, const char *);
83 static bfd_boolean substitute_type (struct pr_handle *, const char *);
84 static bfd_boolean indent_type (struct pr_handle *);
85 static char *pop_type (struct pr_handle *);
86 static void print_vma (bfd_vma, char *, bfd_boolean, bfd_boolean);
87 static bfd_boolean pr_fix_visibility
88   (struct pr_handle *, enum debug_visibility);
89 static bfd_boolean pr_start_compilation_unit (void *, const char *);
90 static bfd_boolean pr_start_source (void *, const char *);
91 static bfd_boolean pr_empty_type (void *);
92 static bfd_boolean pr_void_type (void *);
93 static bfd_boolean pr_int_type (void *, unsigned int, bfd_boolean);
94 static bfd_boolean pr_float_type (void *, unsigned int);
95 static bfd_boolean pr_complex_type (void *, unsigned int);
96 static bfd_boolean pr_bool_type (void *, unsigned int);
97 static bfd_boolean pr_enum_type
98   (void *, const char *, const char **, bfd_signed_vma *);
99 static bfd_boolean pr_pointer_type (void *);
100 static bfd_boolean pr_function_type (void *, int, bfd_boolean);
101 static bfd_boolean pr_reference_type (void *);
102 static bfd_boolean pr_range_type (void *, bfd_signed_vma, bfd_signed_vma);
103 static bfd_boolean pr_array_type
104   (void *, bfd_signed_vma, bfd_signed_vma, bfd_boolean);
105 static bfd_boolean pr_set_type (void *, bfd_boolean);
106 static bfd_boolean pr_offset_type (void *);
107 static bfd_boolean pr_method_type (void *, bfd_boolean, int, bfd_boolean);
108 static bfd_boolean pr_const_type (void *);
109 static bfd_boolean pr_volatile_type (void *);
110 static bfd_boolean pr_start_struct_type
111   (void *, const char *, unsigned int, bfd_boolean, unsigned int);
112 static bfd_boolean pr_struct_field
113   (void *, const char *, bfd_vma, bfd_vma, enum debug_visibility);
114 static bfd_boolean pr_end_struct_type (void *);
115 static bfd_boolean pr_start_class_type
116   (void *, const char *, unsigned int, bfd_boolean, unsigned int,
117    bfd_boolean, bfd_boolean);
118 static bfd_boolean pr_class_static_member
119   (void *, const char *, const char *, enum debug_visibility);
120 static bfd_boolean pr_class_baseclass
121   (void *, bfd_vma, bfd_boolean, enum debug_visibility);
122 static bfd_boolean pr_class_start_method (void *, const char *);
123 static bfd_boolean pr_class_method_variant
124   (void *, const char *, enum debug_visibility, bfd_boolean, bfd_boolean,
125    bfd_vma, bfd_boolean);
126 static bfd_boolean pr_class_static_method_variant
127   (void *, const char *, enum debug_visibility, bfd_boolean, bfd_boolean);
128 static bfd_boolean pr_class_end_method (void *);
129 static bfd_boolean pr_end_class_type (void *);
130 static bfd_boolean pr_typedef_type (void *, const char *);
131 static bfd_boolean pr_tag_type
132   (void *, const char *, unsigned int, enum debug_type_kind);
133 static bfd_boolean pr_typdef (void *, const char *);
134 static bfd_boolean pr_tag (void *, const char *);
135 static bfd_boolean pr_int_constant (void *, const char *, bfd_vma);
136 static bfd_boolean pr_float_constant (void *, const char *, double);
137 static bfd_boolean pr_typed_constant (void *, const char *, bfd_vma);
138 static bfd_boolean pr_variable
139   (void *, const char *, enum debug_var_kind, bfd_vma);
140 static bfd_boolean pr_start_function (void *, const char *, bfd_boolean);
141 static bfd_boolean pr_function_parameter
142   (void *, const char *, enum debug_parm_kind, bfd_vma);
143 static bfd_boolean pr_start_block (void *, bfd_vma);
144 static bfd_boolean pr_end_block (void *, bfd_vma);
145 static bfd_boolean pr_end_function (void *);
146 static bfd_boolean pr_lineno (void *, const char *, unsigned long, bfd_vma);
147 static bfd_boolean append_parent (struct pr_handle *, const char *);
148 /* Only used by tg_ code.  */
149 static bfd_boolean tg_fix_visibility
150   (struct pr_handle *, enum debug_visibility);
151 static void find_address_in_section (bfd *, asection *, void *);
152 static void translate_addresses (bfd *, char *, FILE *, asymbol **);
153 static const char *visibility_name (enum debug_visibility);
154 /* Tags style replacements.  */
155 static bfd_boolean tg_start_compilation_unit (void *, const char *);
156 static bfd_boolean tg_start_source (void *, const char *);
157 static bfd_boolean tg_enum_type
158   (void *, const char *, const char **, bfd_signed_vma *);
159 static bfd_boolean tg_start_struct_type
160   (void *, const char *, unsigned int, bfd_boolean, unsigned int);
161 static bfd_boolean pr_struct_field
162   (void *, const char *, bfd_vma, bfd_vma, enum debug_visibility);
163 static bfd_boolean tg_struct_field
164   (void *, const char *, bfd_vma, bfd_vma, enum debug_visibility);
165 static bfd_boolean tg_struct_field
166   (void *, const char *, bfd_vma, bfd_vma, enum debug_visibility);
167 static bfd_boolean tg_end_struct_type (void *);
168 static bfd_boolean tg_start_class_type
169   (void *, const char *, unsigned int, bfd_boolean, unsigned int, bfd_boolean, bfd_boolean);
170 static bfd_boolean tg_class_static_member
171   (void *, const char *, const char *, enum debug_visibility);
172 static bfd_boolean tg_class_baseclass
173   (void *, bfd_vma, bfd_boolean, enum debug_visibility);
174 static bfd_boolean tg_class_method_variant
175   (void *, const char *, enum debug_visibility, bfd_boolean, bfd_boolean, bfd_vma, bfd_boolean);
176 static bfd_boolean tg_class_static_method_variant
177   (void *, const char *, enum debug_visibility, bfd_boolean, bfd_boolean);
178 static bfd_boolean tg_end_class_type (void *);
179 static bfd_boolean tg_tag_type
180   (void *, const char *, unsigned int, enum debug_type_kind);
181 static bfd_boolean tg_typdef (void *, const char *);
182 static bfd_boolean tg_tag (void *, const char *);
183 static bfd_boolean tg_int_constant (void *, const char *, bfd_vma);
184 static bfd_boolean tg_float_constant (void *, const char *, double);
185 static bfd_boolean tg_typed_constant (void *, const char *, bfd_vma);
186 static bfd_boolean tg_variable
187   (void *, const char *, enum debug_var_kind, bfd_vma);
188 static bfd_boolean tg_start_function (void *, const char *, bfd_boolean);
189 static bfd_boolean tg_function_parameter
190   (void *, const char *, enum debug_parm_kind, bfd_vma);
191 static bfd_boolean tg_start_block (void *, bfd_vma);
192 static bfd_boolean tg_end_block (void *, bfd_vma);
193 static bfd_boolean tg_lineno (void *, const char *, unsigned long, bfd_vma);
194 
195 static const struct debug_write_fns pr_fns =
196 {
197   pr_start_compilation_unit,
198   pr_start_source,
199   pr_empty_type,
200   pr_void_type,
201   pr_int_type,
202   pr_float_type,
203   pr_complex_type,
204   pr_bool_type,
205   pr_enum_type,
206   pr_pointer_type,
207   pr_function_type,
208   pr_reference_type,
209   pr_range_type,
210   pr_array_type,
211   pr_set_type,
212   pr_offset_type,
213   pr_method_type,
214   pr_const_type,
215   pr_volatile_type,
216   pr_start_struct_type,
217   pr_struct_field,
218   pr_end_struct_type,
219   pr_start_class_type,
220   pr_class_static_member,
221   pr_class_baseclass,
222   pr_class_start_method,
223   pr_class_method_variant,
224   pr_class_static_method_variant,
225   pr_class_end_method,
226   pr_end_class_type,
227   pr_typedef_type,
228   pr_tag_type,
229   pr_typdef,
230   pr_tag,
231   pr_int_constant,
232   pr_float_constant,
233   pr_typed_constant,
234   pr_variable,
235   pr_start_function,
236   pr_function_parameter,
237   pr_start_block,
238   pr_end_block,
239   pr_end_function,
240   pr_lineno
241 };
242 
243 static const struct debug_write_fns tg_fns =
244 {
245   tg_start_compilation_unit,
246   tg_start_source,
247   pr_empty_type,		/* Same, push_type.  */
248   pr_void_type,			/* Same, push_type.  */
249   pr_int_type,			/* Same, push_type.  */
250   pr_float_type,		/* Same, push_type.  */
251   pr_complex_type,		/* Same, push_type.  */
252   pr_bool_type,			/* Same, push_type.  */
253   tg_enum_type,
254   pr_pointer_type,		/* Same, changes to pointer.  */
255   pr_function_type,		/* Same, push_type.  */
256   pr_reference_type,		/* Same, changes to reference.  */
257   pr_range_type,		/* FIXME: What's that?.  */
258   pr_array_type,		/* Same, push_type.  */
259   pr_set_type,			/* FIXME: What's that?.  */
260   pr_offset_type,		/* FIXME: What's that?.  */
261   pr_method_type,		/* Same.  */
262   pr_const_type,		/* Same, changes to const.  */
263   pr_volatile_type,		/* Same, changes to volatile.  */
264   tg_start_struct_type,
265   tg_struct_field,
266   tg_end_struct_type,
267   tg_start_class_type,
268   tg_class_static_member,
269   tg_class_baseclass,
270   pr_class_start_method,	/* Same, remembers that's a method.  */
271   tg_class_method_variant,
272   tg_class_static_method_variant,
273   pr_class_end_method,		/* Same, forgets that's a method.  */
274   tg_end_class_type,
275   pr_typedef_type,		/* Same, just push type.  */
276   tg_tag_type,
277   tg_typdef,
278   tg_tag,
279   tg_int_constant,		/* Untested.  */
280   tg_float_constant,		/* Untested.  */
281   tg_typed_constant,		/* Untested.  */
282   tg_variable,
283   tg_start_function,
284   tg_function_parameter,
285   tg_start_block,
286   tg_end_block,
287   pr_end_function,		/* Same, does nothing.  */
288   tg_lineno
289 };
290 
291 /* Print out the generic debugging information recorded in dhandle.  */
292 
293 bfd_boolean
294 print_debugging_info (FILE *f, void *dhandle, bfd *abfd, asymbol **syms,
295 		      void *demangler, bfd_boolean as_tags)
296 {
297   struct pr_handle info;
298 
299   info.f = f;
300   info.indent = 0;
301   info.stack = NULL;
302   info.parameter = 0;
303   info.filename = NULL;
304   info.abfd = abfd;
305   info.syms = syms;
306   info.demangler = (char * (*)(struct bfd *, const char *, int)) demangler;
307 
308   if (as_tags)
309     {
310       fputs ("!_TAG_FILE_FORMAT\t2\t/extended format/\n", f);
311       fputs ("!_TAG_FILE_SORTED\t0\t/0=unsorted, 1=sorted/\n", f);
312       fputs ("!_TAG_PROGRAM_AUTHOR\tIan Lance Taylor, Salvador E. Tropea and others\t//\n", f);
313       fputs ("!_TAG_PROGRAM_NAME\tobjdump\t/From GNU binutils/\n", f);
314     }
315 
316   return as_tags ? debug_write (dhandle, &tg_fns, (void *) & info)
317     : debug_write (dhandle, &pr_fns, (void *) & info);
318 }
319 
320 /* Indent to the current indentation level.  */
321 
322 static void
323 indent (struct pr_handle *info)
324 {
325   unsigned int i;
326 
327   for (i = 0; i < info->indent; i++)
328     putc (' ', info->f);
329 }
330 
331 /* Push a type on the type stack.  */
332 
333 static bfd_boolean
334 push_type (struct pr_handle *info, const char *type)
335 {
336   struct pr_stack *n;
337 
338   if (type == NULL)
339     return FALSE;
340 
341   n = (struct pr_stack *) xmalloc (sizeof *n);
342   memset (n, 0, sizeof *n);
343 
344   n->type = xstrdup (type);
345   n->visibility = DEBUG_VISIBILITY_IGNORE;
346   n->method = NULL;
347   n->next = info->stack;
348   info->stack = n;
349 
350   return TRUE;
351 }
352 
353 /* Prepend a string onto the type on the top of the type stack.  */
354 
355 static bfd_boolean
356 prepend_type (struct pr_handle *info, const char *s)
357 {
358   char *n;
359 
360   assert (info->stack != NULL);
361 
362   n = (char *) xmalloc (strlen (s) + strlen (info->stack->type) + 1);
363   sprintf (n, "%s%s", s, info->stack->type);
364   free (info->stack->type);
365   info->stack->type = n;
366 
367   return TRUE;
368 }
369 
370 /* Append a string to the type on the top of the type stack.  */
371 
372 static bfd_boolean
373 append_type (struct pr_handle *info, const char *s)
374 {
375   unsigned int len;
376 
377   if (s == NULL)
378     return FALSE;
379 
380   assert (info->stack != NULL);
381 
382   len = strlen (info->stack->type);
383   info->stack->type = (char *) xrealloc (info->stack->type,
384 					 len + strlen (s) + 1);
385   strcpy (info->stack->type + len, s);
386 
387   return TRUE;
388 }
389 
390 /* Append a string to the parents on the top of the type stack.  */
391 
392 static bfd_boolean
393 append_parent (struct pr_handle *info, const char *s)
394 {
395   unsigned int len;
396 
397   if (s == NULL)
398     return FALSE;
399 
400   assert (info->stack != NULL);
401 
402   len = info->stack->parents ? strlen (info->stack->parents) : 0;
403   info->stack->parents = (char *) xrealloc (info->stack->parents,
404 					    len + strlen (s) + 1);
405   strcpy (info->stack->parents + len, s);
406 
407   return TRUE;
408 }
409 
410 /* We use an underscore to indicate where the name should go in a type
411    string.  This function substitutes a string for the underscore.  If
412    there is no underscore, the name follows the type.  */
413 
414 static bfd_boolean
415 substitute_type (struct pr_handle *info, const char *s)
416 {
417   char *u;
418 
419   assert (info->stack != NULL);
420 
421   u = strchr (info->stack->type, '|');
422   if (u != NULL)
423     {
424       char *n;
425 
426       n = (char *) xmalloc (strlen (info->stack->type) + strlen (s));
427 
428       memcpy (n, info->stack->type, u - info->stack->type);
429       strcpy (n + (u - info->stack->type), s);
430       strcat (n, u + 1);
431 
432       free (info->stack->type);
433       info->stack->type = n;
434 
435       return TRUE;
436     }
437 
438   if (strchr (s, '|') != NULL
439       && (strchr (info->stack->type, '{') != NULL
440 	  || strchr (info->stack->type, '(') != NULL))
441     {
442       if (! prepend_type (info, "(")
443 	  || ! append_type (info, ")"))
444 	return FALSE;
445     }
446 
447   if (*s == '\0')
448     return TRUE;
449 
450   return (append_type (info, " ")
451 	  && append_type (info, s));
452 }
453 
454 /* Indent the type at the top of the stack by appending spaces.  */
455 
456 static bfd_boolean
457 indent_type (struct pr_handle *info)
458 {
459   unsigned int i;
460 
461   for (i = 0; i < info->indent; i++)
462     {
463       if (! append_type (info, " "))
464 	return FALSE;
465     }
466 
467   return TRUE;
468 }
469 
470 /* Pop a type from the type stack.  */
471 
472 static char *
473 pop_type (struct pr_handle *info)
474 {
475   struct pr_stack *o;
476   char *ret;
477 
478   assert (info->stack != NULL);
479 
480   o = info->stack;
481   info->stack = o->next;
482   ret = o->type;
483   free (o);
484 
485   return ret;
486 }
487 
488 /* Print a VMA value into a string.  */
489 
490 static void
491 print_vma (bfd_vma vma, char *buf, bfd_boolean unsignedp, bfd_boolean hexp)
492 {
493   if (sizeof (vma) <= sizeof (unsigned long))
494     {
495       if (hexp)
496 	sprintf (buf, "0x%lx", (unsigned long) vma);
497       else if (unsignedp)
498 	sprintf (buf, "%lu", (unsigned long) vma);
499       else
500 	sprintf (buf, "%ld", (long) vma);
501     }
502 #if BFD_HOST_64BIT_LONG_LONG
503   else if (sizeof (vma) <= sizeof (unsigned long long))
504     {
505 #ifndef __MSVCRT__
506       if (hexp)
507 	sprintf (buf, "0x%llx", (unsigned long long) vma);
508       else if (unsignedp)
509 	sprintf (buf, "%llu", (unsigned long long) vma);
510       else
511 	sprintf (buf, "%lld", (long long) vma);
512 #else
513       if (hexp)
514 	sprintf (buf, "0x%I64x", (unsigned long long) vma);
515       else if (unsignedp)
516 	sprintf (buf, "%I64u", (unsigned long long) vma);
517       else
518 	sprintf (buf, "%I64d", (long long) vma);
519 #endif
520     }
521 #endif
522   else
523     {
524       buf[0] = '0';
525       buf[1] = 'x';
526       sprintf_vma (buf + 2, vma);
527     }
528 }
529 
530 /* Start a new compilation unit.  */
531 
532 static bfd_boolean
533 pr_start_compilation_unit (void *p, const char *filename)
534 {
535   struct pr_handle *info = (struct pr_handle *) p;
536 
537   assert (info->indent == 0);
538 
539   fprintf (info->f, "%s:\n", filename);
540 
541   return TRUE;
542 }
543 
544 /* Start a source file within a compilation unit.  */
545 
546 static bfd_boolean
547 pr_start_source (void *p, const char *filename)
548 {
549   struct pr_handle *info = (struct pr_handle *) p;
550 
551   assert (info->indent == 0);
552 
553   fprintf (info->f, " %s:\n", filename);
554 
555   return TRUE;
556 }
557 
558 /* Push an empty type onto the type stack.  */
559 
560 static bfd_boolean
561 pr_empty_type (void *p)
562 {
563   struct pr_handle *info = (struct pr_handle *) p;
564 
565   return push_type (info, "<undefined>");
566 }
567 
568 /* Push a void type onto the type stack.  */
569 
570 static bfd_boolean
571 pr_void_type (void *p)
572 {
573   struct pr_handle *info = (struct pr_handle *) p;
574 
575   return push_type (info, "void");
576 }
577 
578 /* Push an integer type onto the type stack.  */
579 
580 static bfd_boolean
581 pr_int_type (void *p, unsigned int size, bfd_boolean unsignedp)
582 {
583   struct pr_handle *info = (struct pr_handle *) p;
584   char ab[10];
585 
586   sprintf (ab, "%sint%d", unsignedp ? "u" : "", size * 8);
587   return push_type (info, ab);
588 }
589 
590 /* Push a floating type onto the type stack.  */
591 
592 static bfd_boolean
593 pr_float_type (void *p, unsigned int size)
594 {
595   struct pr_handle *info = (struct pr_handle *) p;
596   char ab[10];
597 
598   if (size == 4)
599     return push_type (info, "float");
600   else if (size == 8)
601     return push_type (info, "double");
602 
603   sprintf (ab, "float%d", size * 8);
604   return push_type (info, ab);
605 }
606 
607 /* Push a complex type onto the type stack.  */
608 
609 static bfd_boolean
610 pr_complex_type (void *p, unsigned int size)
611 {
612   struct pr_handle *info = (struct pr_handle *) p;
613 
614   if (! pr_float_type (p, size))
615     return FALSE;
616 
617   return prepend_type (info, "complex ");
618 }
619 
620 /* Push a bfd_boolean type onto the type stack.  */
621 
622 static bfd_boolean
623 pr_bool_type (void *p, unsigned int size)
624 {
625   struct pr_handle *info = (struct pr_handle *) p;
626   char ab[10];
627 
628   sprintf (ab, "bool%d", size * 8);
629 
630   return push_type (info, ab);
631 }
632 
633 /* Push an enum type onto the type stack.  */
634 
635 static bfd_boolean
636 pr_enum_type (void *p, const char *tag, const char **names,
637 	      bfd_signed_vma *values)
638 {
639   struct pr_handle *info = (struct pr_handle *) p;
640   unsigned int i;
641   bfd_signed_vma val;
642 
643   if (! push_type (info, "enum "))
644     return FALSE;
645   if (tag != NULL)
646     {
647       if (! append_type (info, tag)
648 	  || ! append_type (info, " "))
649 	return FALSE;
650     }
651   if (! append_type (info, "{ "))
652     return FALSE;
653 
654   if (names == NULL)
655     {
656       if (! append_type (info, "/* undefined */"))
657 	return FALSE;
658     }
659   else
660     {
661       val = 0;
662       for (i = 0; names[i] != NULL; i++)
663 	{
664 	  if (i > 0)
665 	    {
666 	      if (! append_type (info, ", "))
667 		return FALSE;
668 	    }
669 
670 	  if (! append_type (info, names[i]))
671 	    return FALSE;
672 
673 	  if (values[i] != val)
674 	    {
675 	      char ab[20];
676 
677 	      print_vma (values[i], ab, FALSE, FALSE);
678 	      if (! append_type (info, " = ")
679 		  || ! append_type (info, ab))
680 		return FALSE;
681 	      val = values[i];
682 	    }
683 
684 	  ++val;
685 	}
686     }
687 
688   return append_type (info, " }");
689 }
690 
691 /* Turn the top type on the stack into a pointer.  */
692 
693 static bfd_boolean
694 pr_pointer_type (void *p)
695 {
696   struct pr_handle *info = (struct pr_handle *) p;
697   char *s;
698 
699   assert (info->stack != NULL);
700 
701   s = strchr (info->stack->type, '|');
702   if (s != NULL && s[1] == '[')
703     return substitute_type (info, "(*|)");
704   return substitute_type (info, "*|");
705 }
706 
707 /* Turn the top type on the stack into a function returning that type.  */
708 
709 static bfd_boolean
710 pr_function_type (void *p, int argcount, bfd_boolean varargs)
711 {
712   struct pr_handle *info = (struct pr_handle *) p;
713   char **arg_types;
714   unsigned int len;
715   char *s;
716 
717   assert (info->stack != NULL);
718 
719   len = 10;
720 
721   if (argcount <= 0)
722     {
723       arg_types = NULL;
724       len += 15;
725     }
726   else
727     {
728       int i;
729 
730       arg_types = (char **) xmalloc (argcount * sizeof *arg_types);
731       for (i = argcount - 1; i >= 0; i--)
732 	{
733 	  if (! substitute_type (info, ""))
734 	    return FALSE;
735 	  arg_types[i] = pop_type (info);
736 	  if (arg_types[i] == NULL)
737 	    return FALSE;
738 	  len += strlen (arg_types[i]) + 2;
739 	}
740       if (varargs)
741 	len += 5;
742     }
743 
744   /* Now the return type is on the top of the stack.  */
745 
746   s = (char *) xmalloc (len);
747   LITSTRCPY (s, "(|) (");
748 
749   if (argcount < 0)
750     strcat (s, "/* unknown */");
751   else
752     {
753       int i;
754 
755       for (i = 0; i < argcount; i++)
756 	{
757 	  if (i > 0)
758 	    strcat (s, ", ");
759 	  strcat (s, arg_types[i]);
760 	}
761       if (varargs)
762 	{
763 	  if (i > 0)
764 	    strcat (s, ", ");
765 	  strcat (s, "...");
766 	}
767       if (argcount > 0)
768 	free (arg_types);
769     }
770 
771   strcat (s, ")");
772 
773   if (! substitute_type (info, s))
774     return FALSE;
775 
776   free (s);
777 
778   return TRUE;
779 }
780 
781 /* Turn the top type on the stack into a reference to that type.  */
782 
783 static bfd_boolean
784 pr_reference_type (void *p)
785 {
786   struct pr_handle *info = (struct pr_handle *) p;
787 
788   assert (info->stack != NULL);
789 
790   return substitute_type (info, "&|");
791 }
792 
793 /* Make a range type.  */
794 
795 static bfd_boolean
796 pr_range_type (void *p, bfd_signed_vma lower, bfd_signed_vma upper)
797 {
798   struct pr_handle *info = (struct pr_handle *) p;
799   char abl[20], abu[20];
800 
801   assert (info->stack != NULL);
802 
803   if (! substitute_type (info, ""))
804     return FALSE;
805 
806   print_vma (lower, abl, FALSE, FALSE);
807   print_vma (upper, abu, FALSE, FALSE);
808 
809   return (prepend_type (info, "range (")
810 	  && append_type (info, "):")
811 	  && append_type (info, abl)
812 	  && append_type (info, ":")
813 	  && append_type (info, abu));
814 }
815 
816 /* Make an array type.  */
817 
818 static bfd_boolean
819 pr_array_type (void *p, bfd_signed_vma lower, bfd_signed_vma upper,
820 	       bfd_boolean stringp)
821 {
822   struct pr_handle *info = (struct pr_handle *) p;
823   char *range_type;
824   char abl[20], abu[20], ab[50];
825 
826   range_type = pop_type (info);
827   if (range_type == NULL)
828     return FALSE;
829 
830   if (lower == 0)
831     {
832       if (upper == -1)
833 	sprintf (ab, "|[]");
834       else
835 	{
836 	  print_vma (upper + 1, abu, FALSE, FALSE);
837 	  sprintf (ab, "|[%s]", abu);
838 	}
839     }
840   else
841     {
842       print_vma (lower, abl, FALSE, FALSE);
843       print_vma (upper, abu, FALSE, FALSE);
844       sprintf (ab, "|[%s:%s]", abl, abu);
845     }
846 
847   if (! substitute_type (info, ab))
848     return FALSE;
849 
850   if (strcmp (range_type, "int") != 0)
851     {
852       if (! append_type (info, ":")
853 	  || ! append_type (info, range_type))
854 	return FALSE;
855     }
856 
857   if (stringp)
858     {
859       if (! append_type (info, " /* string */"))
860 	return FALSE;
861     }
862 
863   return TRUE;
864 }
865 
866 /* Make a set type.  */
867 
868 static bfd_boolean
869 pr_set_type (void *p, bfd_boolean bitstringp)
870 {
871   struct pr_handle *info = (struct pr_handle *) p;
872 
873   if (! substitute_type (info, ""))
874     return FALSE;
875 
876   if (! prepend_type (info, "set { ")
877       || ! append_type (info, " }"))
878     return FALSE;
879 
880   if (bitstringp)
881     {
882       if (! append_type (info, "/* bitstring */"))
883 	return FALSE;
884     }
885 
886   return TRUE;
887 }
888 
889 /* Make an offset type.  */
890 
891 static bfd_boolean
892 pr_offset_type (void *p)
893 {
894   struct pr_handle *info = (struct pr_handle *) p;
895   char *t;
896 
897   if (! substitute_type (info, ""))
898     return FALSE;
899 
900   t = pop_type (info);
901   if (t == NULL)
902     return FALSE;
903 
904   return (substitute_type (info, "")
905 	  && prepend_type (info, " ")
906 	  && prepend_type (info, t)
907 	  && append_type (info, "::|"));
908 }
909 
910 /* Make a method type.  */
911 
912 static bfd_boolean
913 pr_method_type (void *p, bfd_boolean domain, int argcount, bfd_boolean varargs)
914 {
915   struct pr_handle *info = (struct pr_handle *) p;
916   unsigned int len;
917   char *domain_type;
918   char **arg_types;
919   char *s;
920 
921   len = 10;
922 
923   if (! domain)
924     domain_type = NULL;
925   else
926     {
927       if (! substitute_type (info, ""))
928 	return FALSE;
929       domain_type = pop_type (info);
930       if (domain_type == NULL)
931 	return FALSE;
932       if (CONST_STRNEQ (domain_type, "class ")
933 	  && strchr (domain_type + sizeof "class " - 1, ' ') == NULL)
934 	domain_type += sizeof "class " - 1;
935       else if (CONST_STRNEQ (domain_type, "union class ")
936 	       && (strchr (domain_type + sizeof "union class " - 1, ' ')
937 		   == NULL))
938 	domain_type += sizeof "union class " - 1;
939       len += strlen (domain_type);
940     }
941 
942   if (argcount <= 0)
943     {
944       arg_types = NULL;
945       len += 15;
946     }
947   else
948     {
949       int i;
950 
951       arg_types = (char **) xmalloc (argcount * sizeof *arg_types);
952       for (i = argcount - 1; i >= 0; i--)
953 	{
954 	  if (! substitute_type (info, ""))
955 	    return FALSE;
956 	  arg_types[i] = pop_type (info);
957 	  if (arg_types[i] == NULL)
958 	    return FALSE;
959 	  len += strlen (arg_types[i]) + 2;
960 	}
961       if (varargs)
962 	len += 5;
963     }
964 
965   /* Now the return type is on the top of the stack.  */
966 
967   s = (char *) xmalloc (len);
968   if (! domain)
969     *s = '\0';
970   else
971     strcpy (s, domain_type);
972   strcat (s, "::| (");
973 
974   if (argcount < 0)
975     strcat (s, "/* unknown */");
976   else
977     {
978       int i;
979 
980       for (i = 0; i < argcount; i++)
981 	{
982 	  if (i > 0)
983 	    strcat (s, ", ");
984 	  strcat (s, arg_types[i]);
985 	}
986       if (varargs)
987 	{
988 	  if (i > 0)
989 	    strcat (s, ", ");
990 	  strcat (s, "...");
991 	}
992       if (argcount > 0)
993 	free (arg_types);
994     }
995 
996   strcat (s, ")");
997 
998   if (! substitute_type (info, s))
999     return FALSE;
1000 
1001   free (s);
1002 
1003   return TRUE;
1004 }
1005 
1006 /* Make a const qualified type.  */
1007 
1008 static bfd_boolean
1009 pr_const_type (void *p)
1010 {
1011   struct pr_handle *info = (struct pr_handle *) p;
1012 
1013   return substitute_type (info, "const |");
1014 }
1015 
1016 /* Make a volatile qualified type.  */
1017 
1018 static bfd_boolean
1019 pr_volatile_type (void *p)
1020 {
1021   struct pr_handle *info = (struct pr_handle *) p;
1022 
1023   return substitute_type (info, "volatile |");
1024 }
1025 
1026 /* Start accumulating a struct type.  */
1027 
1028 static bfd_boolean
1029 pr_start_struct_type (void *p, const char *tag, unsigned int id,
1030 		      bfd_boolean structp, unsigned int size)
1031 {
1032   struct pr_handle *info = (struct pr_handle *) p;
1033 
1034   info->indent += 2;
1035 
1036   if (! push_type (info, structp ? "struct " : "union "))
1037     return FALSE;
1038   if (tag != NULL)
1039     {
1040       if (! append_type (info, tag))
1041 	return FALSE;
1042     }
1043   else
1044     {
1045       char idbuf[20];
1046 
1047       sprintf (idbuf, "%%anon%u", id);
1048       if (! append_type (info, idbuf))
1049 	return FALSE;
1050     }
1051 
1052   if (! append_type (info, " {"))
1053     return FALSE;
1054   if (size != 0 || tag != NULL)
1055     {
1056       char ab[30];
1057 
1058       if (! append_type (info, " /*"))
1059 	return FALSE;
1060 
1061       if (size != 0)
1062 	{
1063 	  sprintf (ab, " size %u", size);
1064 	  if (! append_type (info, ab))
1065 	    return FALSE;
1066 	}
1067       if (tag != NULL)
1068 	{
1069 	  sprintf (ab, " id %u", id);
1070 	  if (! append_type (info, ab))
1071 	    return FALSE;
1072 	}
1073       if (! append_type (info, " */"))
1074 	return FALSE;
1075     }
1076   if (! append_type (info, "\n"))
1077     return FALSE;
1078 
1079   info->stack->visibility = DEBUG_VISIBILITY_PUBLIC;
1080 
1081   return indent_type (info);
1082 }
1083 
1084 /* Output the visibility of a field in a struct.  */
1085 
1086 static bfd_boolean
1087 pr_fix_visibility (struct pr_handle *info, enum debug_visibility visibility)
1088 {
1089   const char *s = NULL;
1090   char *t;
1091   unsigned int len;
1092 
1093   assert (info->stack != NULL);
1094 
1095   if (info->stack->visibility == visibility)
1096     return TRUE;
1097 
1098   switch (visibility)
1099     {
1100     case DEBUG_VISIBILITY_PUBLIC:
1101       s = "public";
1102       break;
1103     case DEBUG_VISIBILITY_PRIVATE:
1104       s = "private";
1105       break;
1106     case DEBUG_VISIBILITY_PROTECTED:
1107       s = "protected";
1108       break;
1109     case DEBUG_VISIBILITY_IGNORE:
1110       s = "/* ignore */";
1111       break;
1112     default:
1113       abort ();
1114       return FALSE;
1115     }
1116 
1117   /* Trim off a trailing space in the struct string, to make the
1118      output look a bit better, then stick on the visibility string.  */
1119 
1120   t = info->stack->type;
1121   len = strlen (t);
1122   assert (t[len - 1] == ' ');
1123   t[len - 1] = '\0';
1124 
1125   if (! append_type (info, s)
1126       || ! append_type (info, ":\n")
1127       || ! indent_type (info))
1128     return FALSE;
1129 
1130   info->stack->visibility = visibility;
1131 
1132   return TRUE;
1133 }
1134 
1135 /* Add a field to a struct type.  */
1136 
1137 static bfd_boolean
1138 pr_struct_field (void *p, const char *name, bfd_vma bitpos, bfd_vma bitsize,
1139 		 enum debug_visibility visibility)
1140 {
1141   struct pr_handle *info = (struct pr_handle *) p;
1142   char ab[20];
1143   char *t;
1144 
1145   if (! substitute_type (info, name))
1146     return FALSE;
1147 
1148   if (! append_type (info, "; /* "))
1149     return FALSE;
1150 
1151   if (bitsize != 0)
1152     {
1153       print_vma (bitsize, ab, TRUE, FALSE);
1154       if (! append_type (info, "bitsize ")
1155 	  || ! append_type (info, ab)
1156 	  || ! append_type (info, ", "))
1157 	return FALSE;
1158     }
1159 
1160   print_vma (bitpos, ab, TRUE, FALSE);
1161   if (! append_type (info, "bitpos ")
1162       || ! append_type (info, ab)
1163       || ! append_type (info, " */\n")
1164       || ! indent_type (info))
1165     return FALSE;
1166 
1167   t = pop_type (info);
1168   if (t == NULL)
1169     return FALSE;
1170 
1171   if (! pr_fix_visibility (info, visibility))
1172     return FALSE;
1173 
1174   return append_type (info, t);
1175 }
1176 
1177 /* Finish a struct type.  */
1178 
1179 static bfd_boolean
1180 pr_end_struct_type (void *p)
1181 {
1182   struct pr_handle *info = (struct pr_handle *) p;
1183   char *s;
1184 
1185   assert (info->stack != NULL);
1186   assert (info->indent >= 2);
1187 
1188   info->indent -= 2;
1189 
1190   /* Change the trailing indentation to have a close brace.  */
1191   s = info->stack->type + strlen (info->stack->type) - 2;
1192   assert (s[0] == ' ' && s[1] == ' ' && s[2] == '\0');
1193 
1194   *s++ = '}';
1195   *s = '\0';
1196 
1197   return TRUE;
1198 }
1199 
1200 /* Start a class type.  */
1201 
1202 static bfd_boolean
1203 pr_start_class_type (void *p, const char *tag, unsigned int id,
1204 		     bfd_boolean structp, unsigned int size,
1205 		     bfd_boolean vptr, bfd_boolean ownvptr)
1206 {
1207   struct pr_handle *info = (struct pr_handle *) p;
1208   char *tv = NULL;
1209 
1210   info->indent += 2;
1211 
1212   if (vptr && ! ownvptr)
1213     {
1214       tv = pop_type (info);
1215       if (tv == NULL)
1216 	return FALSE;
1217     }
1218 
1219   if (! push_type (info, structp ? "class " : "union class "))
1220     return FALSE;
1221   if (tag != NULL)
1222     {
1223       if (! append_type (info, tag))
1224 	return FALSE;
1225     }
1226   else
1227     {
1228       char idbuf[20];
1229 
1230       sprintf (idbuf, "%%anon%u", id);
1231       if (! append_type (info, idbuf))
1232 	return FALSE;
1233     }
1234 
1235   if (! append_type (info, " {"))
1236     return FALSE;
1237   if (size != 0 || vptr || ownvptr || tag != NULL)
1238     {
1239       if (! append_type (info, " /*"))
1240 	return FALSE;
1241 
1242       if (size != 0)
1243 	{
1244 	  char ab[20];
1245 
1246 	  sprintf (ab, "%u", size);
1247 	  if (! append_type (info, " size ")
1248 	      || ! append_type (info, ab))
1249 	    return FALSE;
1250 	}
1251 
1252       if (vptr)
1253 	{
1254 	  if (! append_type (info, " vtable "))
1255 	    return FALSE;
1256 	  if (ownvptr)
1257 	    {
1258 	      if (! append_type (info, "self "))
1259 		return FALSE;
1260 	    }
1261 	  else
1262 	    {
1263 	      if (! append_type (info, tv)
1264 		  || ! append_type (info, " "))
1265 		return FALSE;
1266 	    }
1267 	}
1268 
1269       if (tag != NULL)
1270 	{
1271 	  char ab[30];
1272 
1273 	  sprintf (ab, " id %u", id);
1274 	  if (! append_type (info, ab))
1275 	    return FALSE;
1276 	}
1277 
1278       if (! append_type (info, " */"))
1279 	return FALSE;
1280     }
1281 
1282   info->stack->visibility = DEBUG_VISIBILITY_PRIVATE;
1283 
1284   return (append_type (info, "\n")
1285 	  && indent_type (info));
1286 }
1287 
1288 /* Add a static member to a class.  */
1289 
1290 static bfd_boolean
1291 pr_class_static_member (void *p, const char *name, const char *physname,
1292 			enum debug_visibility visibility)
1293 {
1294   struct pr_handle *info = (struct pr_handle *) p;
1295   char *t;
1296 
1297   if (! substitute_type (info, name))
1298     return FALSE;
1299 
1300   if (! prepend_type (info, "static ")
1301       || ! append_type (info, "; /* ")
1302       || ! append_type (info, physname)
1303       || ! append_type (info, " */\n")
1304       || ! indent_type (info))
1305     return FALSE;
1306 
1307   t = pop_type (info);
1308   if (t == NULL)
1309     return FALSE;
1310 
1311   if (! pr_fix_visibility (info, visibility))
1312     return FALSE;
1313 
1314   return append_type (info, t);
1315 }
1316 
1317 /* Add a base class to a class.  */
1318 
1319 static bfd_boolean
1320 pr_class_baseclass (void *p, bfd_vma bitpos, bfd_boolean is_virtual,
1321 		    enum debug_visibility visibility)
1322 {
1323   struct pr_handle *info = (struct pr_handle *) p;
1324   char *t;
1325   const char *prefix;
1326   char ab[20];
1327   char *s, *l, *n;
1328 
1329   assert (info->stack != NULL && info->stack->next != NULL);
1330 
1331   if (! substitute_type (info, ""))
1332     return FALSE;
1333 
1334   t = pop_type (info);
1335   if (t == NULL)
1336     return FALSE;
1337 
1338   if (CONST_STRNEQ (t, "class "))
1339     t += sizeof "class " - 1;
1340 
1341   /* Push it back on to take advantage of the prepend_type and
1342      append_type routines.  */
1343   if (! push_type (info, t))
1344     return FALSE;
1345 
1346   if (is_virtual)
1347     {
1348       if (! prepend_type (info, "virtual "))
1349 	return FALSE;
1350     }
1351 
1352   switch (visibility)
1353     {
1354     case DEBUG_VISIBILITY_PUBLIC:
1355       prefix = "public ";
1356       break;
1357     case DEBUG_VISIBILITY_PROTECTED:
1358       prefix = "protected ";
1359       break;
1360     case DEBUG_VISIBILITY_PRIVATE:
1361       prefix = "private ";
1362       break;
1363     default:
1364       prefix = "/* unknown visibility */ ";
1365       break;
1366     }
1367 
1368   if (! prepend_type (info, prefix))
1369     return FALSE;
1370 
1371   if (bitpos != 0)
1372     {
1373       print_vma (bitpos, ab, TRUE, FALSE);
1374       if (! append_type (info, " /* bitpos ")
1375 	  || ! append_type (info, ab)
1376 	  || ! append_type (info, " */"))
1377 	return FALSE;
1378     }
1379 
1380   /* Now the top of the stack is something like "public A / * bitpos
1381      10 * /".  The next element on the stack is something like "class
1382      xx { / * size 8 * /\n...".  We want to substitute the top of the
1383      stack in before the {.  */
1384   s = strchr (info->stack->next->type, '{');
1385   assert (s != NULL);
1386   --s;
1387 
1388   /* If there is already a ':', then we already have a baseclass, and
1389      we must append this one after a comma.  */
1390   for (l = info->stack->next->type; l != s; l++)
1391     if (*l == ':')
1392       break;
1393   if (! prepend_type (info, l == s ? " : " : ", "))
1394     return FALSE;
1395 
1396   t = pop_type (info);
1397   if (t == NULL)
1398     return FALSE;
1399 
1400   n = (char *) xmalloc (strlen (info->stack->type) + strlen (t) + 1);
1401   memcpy (n, info->stack->type, s - info->stack->type);
1402   strcpy (n + (s - info->stack->type), t);
1403   strcat (n, s);
1404 
1405   free (info->stack->type);
1406   info->stack->type = n;
1407 
1408   free (t);
1409 
1410   return TRUE;
1411 }
1412 
1413 /* Start adding a method to a class.  */
1414 
1415 static bfd_boolean
1416 pr_class_start_method (void *p, const char *name)
1417 {
1418   struct pr_handle *info = (struct pr_handle *) p;
1419 
1420   assert (info->stack != NULL);
1421   info->stack->method = name;
1422   return TRUE;
1423 }
1424 
1425 /* Add a variant to a method.  */
1426 
1427 static bfd_boolean
1428 pr_class_method_variant (void *p, const char *physname,
1429 			 enum debug_visibility visibility,
1430 			 bfd_boolean constp, bfd_boolean volatilep,
1431 			 bfd_vma voffset, bfd_boolean context)
1432 {
1433   struct pr_handle *info = (struct pr_handle *) p;
1434   char *method_type;
1435   char *context_type;
1436 
1437   assert (info->stack != NULL);
1438   assert (info->stack->next != NULL);
1439 
1440   /* Put the const and volatile qualifiers on the type.  */
1441   if (volatilep)
1442     {
1443       if (! append_type (info, " volatile"))
1444 	return FALSE;
1445     }
1446   if (constp)
1447     {
1448       if (! append_type (info, " const"))
1449 	return FALSE;
1450     }
1451 
1452   /* Stick the name of the method into its type.  */
1453   if (! substitute_type (info,
1454 			 (context
1455 			  ? info->stack->next->next->method
1456 			  : info->stack->next->method)))
1457     return FALSE;
1458 
1459   /* Get the type.  */
1460   method_type = pop_type (info);
1461   if (method_type == NULL)
1462     return FALSE;
1463 
1464   /* Pull off the context type if there is one.  */
1465   if (! context)
1466     context_type = NULL;
1467   else
1468     {
1469       context_type = pop_type (info);
1470       if (context_type == NULL)
1471 	return FALSE;
1472     }
1473 
1474   /* Now the top of the stack is the class.  */
1475 
1476   if (! pr_fix_visibility (info, visibility))
1477     return FALSE;
1478 
1479   if (! append_type (info, method_type)
1480       || ! append_type (info, " /* ")
1481       || ! append_type (info, physname)
1482       || ! append_type (info, " "))
1483     return FALSE;
1484   if (context || voffset != 0)
1485     {
1486       char ab[20];
1487 
1488       if (context)
1489 	{
1490 	  if (! append_type (info, "context ")
1491 	      || ! append_type (info, context_type)
1492 	      || ! append_type (info, " "))
1493 	    return FALSE;
1494 	}
1495       print_vma (voffset, ab, TRUE, FALSE);
1496       if (! append_type (info, "voffset ")
1497 	  || ! append_type (info, ab))
1498 	return FALSE;
1499     }
1500 
1501   return (append_type (info, " */;\n")
1502 	  && indent_type (info));
1503 }
1504 
1505 /* Add a static variant to a method.  */
1506 
1507 static bfd_boolean
1508 pr_class_static_method_variant (void *p, const char *physname,
1509 				enum debug_visibility visibility,
1510 				bfd_boolean constp, bfd_boolean volatilep)
1511 {
1512   struct pr_handle *info = (struct pr_handle *) p;
1513   char *method_type;
1514 
1515   assert (info->stack != NULL);
1516   assert (info->stack->next != NULL);
1517   assert (info->stack->next->method != NULL);
1518 
1519   /* Put the const and volatile qualifiers on the type.  */
1520   if (volatilep)
1521     {
1522       if (! append_type (info, " volatile"))
1523 	return FALSE;
1524     }
1525   if (constp)
1526     {
1527       if (! append_type (info, " const"))
1528 	return FALSE;
1529     }
1530 
1531   /* Mark it as static.  */
1532   if (! prepend_type (info, "static "))
1533     return FALSE;
1534 
1535   /* Stick the name of the method into its type.  */
1536   if (! substitute_type (info, info->stack->next->method))
1537     return FALSE;
1538 
1539   /* Get the type.  */
1540   method_type = pop_type (info);
1541   if (method_type == NULL)
1542     return FALSE;
1543 
1544   /* Now the top of the stack is the class.  */
1545 
1546   if (! pr_fix_visibility (info, visibility))
1547     return FALSE;
1548 
1549   return (append_type (info, method_type)
1550 	  && append_type (info, " /* ")
1551 	  && append_type (info, physname)
1552 	  && append_type (info, " */;\n")
1553 	  && indent_type (info));
1554 }
1555 
1556 /* Finish up a method.  */
1557 
1558 static bfd_boolean
1559 pr_class_end_method (void *p)
1560 {
1561   struct pr_handle *info = (struct pr_handle *) p;
1562 
1563   info->stack->method = NULL;
1564   return TRUE;
1565 }
1566 
1567 /* Finish up a class.  */
1568 
1569 static bfd_boolean
1570 pr_end_class_type (void *p)
1571 {
1572   return pr_end_struct_type (p);
1573 }
1574 
1575 /* Push a type on the stack using a typedef name.  */
1576 
1577 static bfd_boolean
1578 pr_typedef_type (void *p, const char *name)
1579 {
1580   struct pr_handle *info = (struct pr_handle *) p;
1581 
1582   return push_type (info, name);
1583 }
1584 
1585 /* Push a type on the stack using a tag name.  */
1586 
1587 static bfd_boolean
1588 pr_tag_type (void *p, const char *name, unsigned int id,
1589 	     enum debug_type_kind kind)
1590 {
1591   struct pr_handle *info = (struct pr_handle *) p;
1592   const char *t, *tag;
1593   char idbuf[20];
1594 
1595   switch (kind)
1596     {
1597     case DEBUG_KIND_STRUCT:
1598       t = "struct ";
1599       break;
1600     case DEBUG_KIND_UNION:
1601       t = "union ";
1602       break;
1603     case DEBUG_KIND_ENUM:
1604       t = "enum ";
1605       break;
1606     case DEBUG_KIND_CLASS:
1607       t = "class ";
1608       break;
1609     case DEBUG_KIND_UNION_CLASS:
1610       t = "union class ";
1611       break;
1612     default:
1613       abort ();
1614       return FALSE;
1615     }
1616 
1617   if (! push_type (info, t))
1618     return FALSE;
1619   if (name != NULL)
1620     tag = name;
1621   else
1622     {
1623       sprintf (idbuf, "%%anon%u", id);
1624       tag = idbuf;
1625     }
1626 
1627   if (! append_type (info, tag))
1628     return FALSE;
1629   if (name != NULL && kind != DEBUG_KIND_ENUM)
1630     {
1631       sprintf (idbuf, " /* id %u */", id);
1632       if (! append_type (info, idbuf))
1633 	return FALSE;
1634     }
1635 
1636   return TRUE;
1637 }
1638 
1639 /* Output a typedef.  */
1640 
1641 static bfd_boolean
1642 pr_typdef (void *p, const char *name)
1643 {
1644   struct pr_handle *info = (struct pr_handle *) p;
1645   char *s;
1646 
1647   if (! substitute_type (info, name))
1648     return FALSE;
1649 
1650   s = pop_type (info);
1651   if (s == NULL)
1652     return FALSE;
1653 
1654   indent (info);
1655   fprintf (info->f, "typedef %s;\n", s);
1656 
1657   free (s);
1658 
1659   return TRUE;
1660 }
1661 
1662 /* Output a tag.  The tag should already be in the string on the
1663    stack, so all we have to do here is print it out.  */
1664 
1665 static bfd_boolean
1666 pr_tag (void *p, const char *name ATTRIBUTE_UNUSED)
1667 {
1668   struct pr_handle *info = (struct pr_handle *) p;
1669   char *t;
1670 
1671   t = pop_type (info);
1672   if (t == NULL)
1673     return FALSE;
1674 
1675   indent (info);
1676   fprintf (info->f, "%s;\n", t);
1677 
1678   free (t);
1679 
1680   return TRUE;
1681 }
1682 
1683 /* Output an integer constant.  */
1684 
1685 static bfd_boolean
1686 pr_int_constant (void *p, const char *name, bfd_vma val)
1687 {
1688   struct pr_handle *info = (struct pr_handle *) p;
1689   char ab[20];
1690 
1691   indent (info);
1692   print_vma (val, ab, FALSE, FALSE);
1693   fprintf (info->f, "const int %s = %s;\n", name, ab);
1694   return TRUE;
1695 }
1696 
1697 /* Output a floating point constant.  */
1698 
1699 static bfd_boolean
1700 pr_float_constant (void *p, const char *name, double val)
1701 {
1702   struct pr_handle *info = (struct pr_handle *) p;
1703 
1704   indent (info);
1705   fprintf (info->f, "const double %s = %g;\n", name, val);
1706   return TRUE;
1707 }
1708 
1709 /* Output a typed constant.  */
1710 
1711 static bfd_boolean
1712 pr_typed_constant (void *p, const char *name, bfd_vma val)
1713 {
1714   struct pr_handle *info = (struct pr_handle *) p;
1715   char *t;
1716   char ab[20];
1717 
1718   t = pop_type (info);
1719   if (t == NULL)
1720     return FALSE;
1721 
1722   indent (info);
1723   print_vma (val, ab, FALSE, FALSE);
1724   fprintf (info->f, "const %s %s = %s;\n", t, name, ab);
1725 
1726   free (t);
1727 
1728   return TRUE;
1729 }
1730 
1731 /* Output a variable.  */
1732 
1733 static bfd_boolean
1734 pr_variable (void *p, const char *name, enum debug_var_kind kind,
1735 	     bfd_vma val)
1736 {
1737   struct pr_handle *info = (struct pr_handle *) p;
1738   char *t;
1739   char ab[20];
1740 
1741   if (! substitute_type (info, name))
1742     return FALSE;
1743 
1744   t = pop_type (info);
1745   if (t == NULL)
1746     return FALSE;
1747 
1748   indent (info);
1749   switch (kind)
1750     {
1751     case DEBUG_STATIC:
1752     case DEBUG_LOCAL_STATIC:
1753       fprintf (info->f, "static ");
1754       break;
1755     case DEBUG_REGISTER:
1756       fprintf (info->f, "register ");
1757       break;
1758     default:
1759       break;
1760     }
1761   print_vma (val, ab, TRUE, TRUE);
1762   fprintf (info->f, "%s /* %s */;\n", t, ab);
1763 
1764   free (t);
1765 
1766   return TRUE;
1767 }
1768 
1769 /* Start outputting a function.  */
1770 
1771 static bfd_boolean
1772 pr_start_function (void *p, const char *name, bfd_boolean global)
1773 {
1774   struct pr_handle *info = (struct pr_handle *) p;
1775   char *t;
1776 
1777   if (! substitute_type (info, name))
1778     return FALSE;
1779 
1780   t = pop_type (info);
1781   if (t == NULL)
1782     return FALSE;
1783 
1784   indent (info);
1785   if (! global)
1786     fprintf (info->f, "static ");
1787   fprintf (info->f, "%s (", t);
1788 
1789   info->parameter = 1;
1790 
1791   return TRUE;
1792 }
1793 
1794 /* Output a function parameter.  */
1795 
1796 static bfd_boolean
1797 pr_function_parameter (void *p, const char *name,
1798 		       enum debug_parm_kind kind, bfd_vma val)
1799 {
1800   struct pr_handle *info = (struct pr_handle *) p;
1801   char *t;
1802   char ab[20];
1803 
1804   if (kind == DEBUG_PARM_REFERENCE
1805       || kind == DEBUG_PARM_REF_REG)
1806     {
1807       if (! pr_reference_type (p))
1808 	return FALSE;
1809     }
1810 
1811   if (! substitute_type (info, name))
1812     return FALSE;
1813 
1814   t = pop_type (info);
1815   if (t == NULL)
1816     return FALSE;
1817 
1818   if (info->parameter != 1)
1819     fprintf (info->f, ", ");
1820 
1821   if (kind == DEBUG_PARM_REG || kind == DEBUG_PARM_REF_REG)
1822     fprintf (info->f, "register ");
1823 
1824   print_vma (val, ab, TRUE, TRUE);
1825   fprintf (info->f, "%s /* %s */", t, ab);
1826 
1827   free (t);
1828 
1829   ++info->parameter;
1830 
1831   return TRUE;
1832 }
1833 
1834 /* Start writing out a block.  */
1835 
1836 static bfd_boolean
1837 pr_start_block (void *p, bfd_vma addr)
1838 {
1839   struct pr_handle *info = (struct pr_handle *) p;
1840   char ab[20];
1841 
1842   if (info->parameter > 0)
1843     {
1844       fprintf (info->f, ")\n");
1845       info->parameter = 0;
1846     }
1847 
1848   indent (info);
1849   print_vma (addr, ab, TRUE, TRUE);
1850   fprintf (info->f, "{ /* %s */\n", ab);
1851 
1852   info->indent += 2;
1853 
1854   return TRUE;
1855 }
1856 
1857 /* Write out line number information.  */
1858 
1859 static bfd_boolean
1860 pr_lineno (void *p, const char *filename, unsigned long lineno, bfd_vma addr)
1861 {
1862   struct pr_handle *info = (struct pr_handle *) p;
1863   char ab[20];
1864 
1865   indent (info);
1866   print_vma (addr, ab, TRUE, TRUE);
1867   fprintf (info->f, "/* file %s line %lu addr %s */\n", filename, lineno, ab);
1868 
1869   return TRUE;
1870 }
1871 
1872 /* Finish writing out a block.  */
1873 
1874 static bfd_boolean
1875 pr_end_block (void *p, bfd_vma addr)
1876 {
1877   struct pr_handle *info = (struct pr_handle *) p;
1878   char ab[20];
1879 
1880   info->indent -= 2;
1881 
1882   indent (info);
1883   print_vma (addr, ab, TRUE, TRUE);
1884   fprintf (info->f, "} /* %s */\n", ab);
1885 
1886   return TRUE;
1887 }
1888 
1889 /* Finish writing out a function.  */
1890 
1891 static bfd_boolean
1892 pr_end_function (void *p ATTRIBUTE_UNUSED)
1893 {
1894   return TRUE;
1895 }
1896 
1897 /* Tags style generation functions start here.  */
1898 
1899 /* Variables for address to line translation.  */
1900 static bfd_vma pc;
1901 static const char *filename;
1902 static const char *functionname;
1903 static unsigned int line;
1904 static bfd_boolean found;
1905 
1906 /* Look for an address in a section.  This is called via
1907    bfd_map_over_sections.  */
1908 
1909 static void
1910 find_address_in_section (bfd *abfd, asection *section, void *data)
1911 {
1912   bfd_vma vma;
1913   bfd_size_type size;
1914   asymbol **syms = (asymbol **) data;
1915 
1916   if (found)
1917     return;
1918 
1919   if ((bfd_get_section_flags (abfd, section) & SEC_ALLOC) == 0)
1920     return;
1921 
1922   vma = bfd_get_section_vma (abfd, section);
1923   if (pc < vma)
1924     return;
1925 
1926   size = bfd_get_section_size (section);
1927   if (pc >= vma + size)
1928     return;
1929 
1930   found = bfd_find_nearest_line (abfd, section, syms, pc - vma,
1931 				 &filename, &functionname, &line);
1932 }
1933 
1934 static void
1935 translate_addresses (bfd *abfd, char *addr_hex, FILE *f, asymbol **syms)
1936 {
1937   pc = bfd_scan_vma (addr_hex, NULL, 16);
1938   found = FALSE;
1939   bfd_map_over_sections (abfd, find_address_in_section, syms);
1940 
1941   if (! found)
1942     fprintf (f, "??");
1943   else
1944     fprintf (f, "%u", line);
1945 }
1946 
1947 /* Start a new compilation unit.  */
1948 
1949 static bfd_boolean
1950 tg_start_compilation_unit (void * p, const char *fname ATTRIBUTE_UNUSED)
1951 {
1952   struct pr_handle *info = (struct pr_handle *) p;
1953 
1954   free (info->filename);
1955   /* Should it be relative? best way to do it here?.  */
1956   info->filename = strdup (fname);
1957 
1958   return TRUE;
1959 }
1960 
1961 /* Start a source file within a compilation unit.  */
1962 
1963 static bfd_boolean
1964 tg_start_source (void *p, const char *fname)
1965 {
1966   struct pr_handle *info = (struct pr_handle *) p;
1967 
1968   free (info->filename);
1969   /* Should it be relative? best way to do it here?.  */
1970   info->filename = strdup (fname);
1971 
1972   return TRUE;
1973 }
1974 
1975 /* Push an enum type onto the type stack.  */
1976 
1977 static bfd_boolean
1978 tg_enum_type (void *p, const char *tag, const char **names,
1979 	      bfd_signed_vma *values)
1980 {
1981   struct pr_handle *info = (struct pr_handle *) p;
1982   unsigned int i;
1983   const char *name;
1984   char ab[20];
1985 
1986   if (! pr_enum_type (p, tag, names, values))
1987     return FALSE;
1988 
1989   name = tag ? tag : "unknown";
1990   /* Generate an entry for the enum.  */
1991   if (tag)
1992     fprintf (info->f, "%s\t%s\t0;\"\tkind:e\ttype:%s\n", tag,
1993 	     info->filename, info->stack->type);
1994 
1995   /* Generate entries for the values.  */
1996   if (names != NULL)
1997     {
1998       for (i = 0; names[i] != NULL; i++)
1999 	{
2000 	  print_vma (values[i], ab, FALSE, FALSE);
2001 	  fprintf (info->f, "%s\t%s\t0;\"\tkind:g\tenum:%s\tvalue:%s\n",
2002 		   names[i], info->filename, name, ab);
2003 	}
2004     }
2005 
2006   return TRUE;
2007 }
2008 
2009 /* Start accumulating a struct type.  */
2010 
2011 static bfd_boolean
2012 tg_start_struct_type (void *p, const char *tag, unsigned int id,
2013 		      bfd_boolean structp,
2014 		      unsigned int size ATTRIBUTE_UNUSED)
2015 {
2016   struct pr_handle *info = (struct pr_handle *) p;
2017   const char *name;
2018   char idbuf[20];
2019 
2020   if (tag != NULL)
2021     name = tag;
2022   else
2023     {
2024       name = idbuf;
2025       sprintf (idbuf, "%%anon%u", id);
2026     }
2027 
2028   if (! push_type (info, name))
2029     return FALSE;
2030 
2031   info->stack->flavor = structp ? "struct" : "union";
2032 
2033   fprintf (info->f, "%s\t%s\t0;\"\tkind:%c\n", name, info->filename,
2034 	   info->stack->flavor[0]);
2035 
2036   info->stack->visibility = DEBUG_VISIBILITY_PUBLIC;
2037 
2038   return indent_type (info);
2039 }
2040 
2041 /* Output the visibility of a field in a struct.  */
2042 
2043 static bfd_boolean
2044 tg_fix_visibility (struct pr_handle *info, enum debug_visibility visibility)
2045 {
2046   assert (info->stack != NULL);
2047 
2048   if (info->stack->visibility == visibility)
2049     return TRUE;
2050 
2051   assert (info->stack->visibility != DEBUG_VISIBILITY_IGNORE);
2052 
2053   info->stack->visibility = visibility;
2054 
2055   return TRUE;
2056 }
2057 
2058 /* Add a field to a struct type.  */
2059 
2060 static bfd_boolean
2061 tg_struct_field (void *p, const char *name, bfd_vma bitpos ATTRIBUTE_UNUSED,
2062 		 bfd_vma bitsize ATTRIBUTE_UNUSED,
2063 		 enum debug_visibility visibility)
2064 {
2065   struct pr_handle *info = (struct pr_handle *) p;
2066   char *t;
2067 
2068   t = pop_type (info);
2069   if (t == NULL)
2070     return FALSE;
2071 
2072   if (! tg_fix_visibility (info, visibility))
2073     return FALSE;
2074 
2075   /* It happens, a bug? */
2076   if (! name[0])
2077     return TRUE;
2078 
2079   fprintf (info->f, "%s\t%s\t0;\"\tkind:m\ttype:%s\t%s:%s\taccess:%s\n",
2080 	   name, info->filename, t, info->stack->flavor, info->stack->type,
2081 	   visibility_name (visibility));
2082 
2083   return TRUE;
2084 }
2085 
2086 /* Finish a struct type.  */
2087 
2088 static bfd_boolean
2089 tg_end_struct_type (void *p ATTRIBUTE_UNUSED)
2090 {
2091   assert (((struct pr_handle *) p)->stack != NULL);
2092 
2093   return TRUE;
2094 }
2095 
2096 /* Start a class type.  */
2097 
2098 static bfd_boolean
2099 tg_start_class_type (void *p, const char *tag, unsigned int id,
2100 		     bfd_boolean structp, unsigned int size,
2101 		     bfd_boolean vptr, bfd_boolean ownvptr)
2102 {
2103   struct pr_handle *info = (struct pr_handle *) p;
2104   char *tv = NULL;
2105   const char *name;
2106 
2107   info->indent += 2;
2108 
2109   if (vptr && ! ownvptr)
2110     {
2111       tv = pop_type (info);
2112       if (tv == NULL)
2113 	return FALSE;
2114     }
2115 
2116   if (tag != NULL)
2117     name = tag;
2118   else
2119     {
2120       char idbuf[20];
2121 
2122       sprintf (idbuf, "%%anon%u", id);
2123       name = idbuf;
2124     }
2125 
2126   if (! push_type (info, name))
2127     return FALSE;
2128 
2129   info->stack->flavor = structp ? "class" : "union class";
2130   info->stack->parents = NULL;
2131   info->stack->num_parents = 0;
2132 
2133   if (size != 0 || vptr || ownvptr || tag != NULL)
2134     {
2135       if (vptr)
2136 	{
2137 	  if (! append_type (info, " vtable "))
2138 	    return FALSE;
2139 	  if (ownvptr)
2140 	    {
2141 	      if (! append_type (info, "self "))
2142 		return FALSE;
2143 	    }
2144 	  else
2145 	    {
2146 	      if (! append_type (info, tv)
2147 		  || ! append_type (info, " "))
2148 		return FALSE;
2149 	    }
2150 	}
2151     }
2152 
2153   info->stack->visibility = DEBUG_VISIBILITY_PRIVATE;
2154 
2155   return TRUE;
2156 }
2157 
2158 /* Add a static member to a class.  */
2159 
2160 static bfd_boolean
2161 tg_class_static_member (void *p, const char *name,
2162 			const char *physname ATTRIBUTE_UNUSED,
2163 			enum debug_visibility visibility)
2164 {
2165   struct pr_handle *info = (struct pr_handle *) p;
2166   char *t;
2167   int len_var, len_class;
2168   char *full_name;
2169 
2170   len_var = strlen (name);
2171   len_class = strlen (info->stack->next->type);
2172   full_name = (char *) xmalloc (len_var + len_class + 3);
2173   if (! full_name)
2174     return FALSE;
2175   sprintf (full_name, "%s::%s", info->stack->next->type, name);
2176 
2177   if (! substitute_type (info, full_name))
2178     return FALSE;
2179 
2180   if (! prepend_type (info, "static "))
2181     return FALSE;
2182 
2183   t = pop_type (info);
2184   if (t == NULL)
2185     return FALSE;
2186 
2187   if (! tg_fix_visibility (info, visibility))
2188     return FALSE;
2189 
2190   fprintf (info->f, "%s\t%s\t0;\"\tkind:x\ttype:%s\tclass:%s\taccess:%s\n",
2191 	   name, info->filename, t, info->stack->type,
2192 	   visibility_name (visibility));
2193   free (t);
2194   free (full_name);
2195 
2196   return TRUE;
2197 }
2198 
2199 /* Add a base class to a class.  */
2200 
2201 static bfd_boolean
2202 tg_class_baseclass (void *p, bfd_vma bitpos ATTRIBUTE_UNUSED,
2203 		    bfd_boolean is_virtual, enum debug_visibility visibility)
2204 {
2205   struct pr_handle *info = (struct pr_handle *) p;
2206   char *t;
2207   const char *prefix;
2208 
2209   assert (info->stack != NULL && info->stack->next != NULL);
2210 
2211   t = pop_type (info);
2212   if (t == NULL)
2213     return FALSE;
2214 
2215   if (CONST_STRNEQ (t, "class "))
2216     t += sizeof "class " - 1;
2217 
2218   /* Push it back on to take advantage of the prepend_type and
2219      append_type routines.  */
2220   if (! push_type (info, t))
2221     return FALSE;
2222 
2223   if (is_virtual)
2224     {
2225       if (! prepend_type (info, "virtual "))
2226 	return FALSE;
2227     }
2228 
2229   switch (visibility)
2230     {
2231     case DEBUG_VISIBILITY_PUBLIC:
2232       prefix = "public ";
2233       break;
2234     case DEBUG_VISIBILITY_PROTECTED:
2235       prefix = "protected ";
2236       break;
2237     case DEBUG_VISIBILITY_PRIVATE:
2238       prefix = "private ";
2239       break;
2240     default:
2241       prefix = "/* unknown visibility */ ";
2242       break;
2243     }
2244 
2245   if (! prepend_type (info, prefix))
2246     return FALSE;
2247 
2248   t = pop_type (info);
2249   if (t == NULL)
2250     return FALSE;
2251 
2252   if (info->stack->num_parents && ! append_parent (info, ", "))
2253     return FALSE;
2254 
2255   if (! append_parent (info, t))
2256     return FALSE;
2257   info->stack->num_parents++;
2258 
2259   free (t);
2260 
2261   return TRUE;
2262 }
2263 
2264 /* Add a variant to a method.  */
2265 
2266 static bfd_boolean
2267 tg_class_method_variant (void *p, const char *physname ATTRIBUTE_UNUSED,
2268 			 enum debug_visibility visibility,
2269 			 bfd_boolean constp, bfd_boolean volatilep,
2270 			 bfd_vma voffset ATTRIBUTE_UNUSED,
2271 			 bfd_boolean context)
2272 {
2273   struct pr_handle *info = (struct pr_handle *) p;
2274   char *method_type;
2275   char *context_type;
2276   char *method_name;
2277 
2278   assert (info->stack != NULL);
2279   assert (info->stack->next != NULL);
2280 
2281   /* Put the const and volatile qualifiers on the type.  */
2282   if (volatilep)
2283     {
2284       if (! append_type (info, " volatile"))
2285 	return FALSE;
2286     }
2287   if (constp)
2288     {
2289       if (! append_type (info, " const"))
2290 	return FALSE;
2291     }
2292 
2293   method_name = strdup (context ? info->stack->next->next->method
2294 			: info->stack->next->method);
2295 
2296   /* Stick the name of the method into its type.  */
2297   if (! substitute_type (info, method_name))
2298     return FALSE;
2299 
2300   /* Get the type.  */
2301   method_type = pop_type (info);
2302   if (method_type == NULL)
2303     return FALSE;
2304 
2305   /* Pull off the context type if there is one.  */
2306   if (! context)
2307     context_type = NULL;
2308   else
2309     {
2310       context_type = pop_type (info);
2311       if (context_type == NULL)
2312 	return FALSE;
2313     }
2314 
2315   /* Now the top of the stack is the class.  */
2316   if (! tg_fix_visibility (info, visibility))
2317     return FALSE;
2318 
2319   fprintf (info->f, "%s\t%s\t0;\"\tkind:p\ttype:%s\tclass:%s\n",
2320 	   method_name, info->filename, method_type, info->stack->type);
2321   free (method_type);
2322   free (method_name);
2323   free (context_type);
2324 
2325   return TRUE;
2326 }
2327 
2328 /* Add a static variant to a method.  */
2329 
2330 static bfd_boolean
2331 tg_class_static_method_variant (void *p,
2332 				const char *physname ATTRIBUTE_UNUSED,
2333 				enum debug_visibility visibility,
2334 				bfd_boolean constp, bfd_boolean volatilep)
2335 {
2336   struct pr_handle *info = (struct pr_handle *) p;
2337   char *method_type;
2338   char *method_name;
2339 
2340   assert (info->stack != NULL);
2341   assert (info->stack->next != NULL);
2342   assert (info->stack->next->method != NULL);
2343 
2344   /* Put the const and volatile qualifiers on the type.  */
2345   if (volatilep)
2346     {
2347       if (! append_type (info, " volatile"))
2348 	return FALSE;
2349     }
2350   if (constp)
2351     {
2352       if (! append_type (info, " const"))
2353 	return FALSE;
2354     }
2355 
2356   /* Mark it as static.  */
2357   if (! prepend_type (info, "static "))
2358     return FALSE;
2359 
2360   method_name = strdup (info->stack->next->method);
2361   /* Stick the name of the method into its type.  */
2362   if (! substitute_type (info, info->stack->next->method))
2363     return FALSE;
2364 
2365   /* Get the type.  */
2366   method_type = pop_type (info);
2367   if (method_type == NULL)
2368     return FALSE;
2369 
2370   /* Now the top of the stack is the class.  */
2371   if (! tg_fix_visibility (info, visibility))
2372     return FALSE;
2373 
2374   fprintf (info->f, "%s\t%s\t0;\"\tkind:p\ttype:%s\tclass:%s\taccess:%s\n",
2375 	   method_name, info->filename, method_type, info->stack->type,
2376 	   visibility_name (visibility));
2377   free (method_type);
2378   free (method_name);
2379 
2380   return TRUE;
2381 }
2382 
2383 /* Finish up a class.  */
2384 
2385 static bfd_boolean
2386 tg_end_class_type (void *p)
2387 {
2388   struct pr_handle *info = (struct pr_handle *) p;
2389 
2390   fprintf (info->f, "%s\t%s\t0;\"\tkind:c\ttype:%s", info->stack->type,
2391 	   info->filename, info->stack->flavor);
2392   if (info->stack->num_parents)
2393     {
2394       fprintf  (info->f, "\tinherits:%s", info->stack->parents);
2395       free (info->stack->parents);
2396     }
2397   fputc ('\n', info->f);
2398 
2399   return tg_end_struct_type (p);
2400 }
2401 
2402 /* Push a type on the stack using a tag name.  */
2403 
2404 static bfd_boolean
2405 tg_tag_type (void *p, const char *name, unsigned int id,
2406 	     enum debug_type_kind kind)
2407 {
2408   struct pr_handle *info = (struct pr_handle *) p;
2409   const char *t, *tag;
2410   char idbuf[20];
2411 
2412   switch (kind)
2413     {
2414     case DEBUG_KIND_STRUCT:
2415       t = "struct ";
2416       break;
2417     case DEBUG_KIND_UNION:
2418       t = "union ";
2419       break;
2420     case DEBUG_KIND_ENUM:
2421       t = "enum ";
2422       break;
2423     case DEBUG_KIND_CLASS:
2424       t = "class ";
2425       break;
2426     case DEBUG_KIND_UNION_CLASS:
2427       t = "union class ";
2428       break;
2429     default:
2430       abort ();
2431       return FALSE;
2432     }
2433 
2434   if (! push_type (info, t))
2435     return FALSE;
2436   if (name != NULL)
2437     tag = name;
2438   else
2439     {
2440       sprintf (idbuf, "%%anon%u", id);
2441       tag = idbuf;
2442     }
2443 
2444   if (! append_type (info, tag))
2445     return FALSE;
2446 
2447   return TRUE;
2448 }
2449 
2450 /* Output a typedef.  */
2451 
2452 static bfd_boolean
2453 tg_typdef (void *p, const char *name)
2454 {
2455   struct pr_handle *info = (struct pr_handle *) p;
2456   char *s;
2457 
2458   s = pop_type (info);
2459   if (s == NULL)
2460     return FALSE;
2461 
2462   fprintf (info->f, "%s\t%s\t0;\"\tkind:t\ttype:%s\n", name,
2463 	   info->filename, s);
2464 
2465   free (s);
2466 
2467   return TRUE;
2468 }
2469 
2470 /* Output a tag.  The tag should already be in the string on the
2471    stack, so all we have to do here is print it out.  */
2472 
2473 static bfd_boolean
2474 tg_tag (void *p ATTRIBUTE_UNUSED, const char *name ATTRIBUTE_UNUSED)
2475 {
2476   struct pr_handle *info = (struct pr_handle *) p;
2477   char *t;
2478 
2479   t = pop_type (info);
2480   if (t == NULL)
2481     return FALSE;
2482   free (t);
2483 
2484   return TRUE;
2485 }
2486 
2487 /* Output an integer constant.  */
2488 
2489 static bfd_boolean
2490 tg_int_constant (void *p, const char *name, bfd_vma val)
2491 {
2492   struct pr_handle *info = (struct pr_handle *) p;
2493   char ab[20];
2494 
2495   indent (info);
2496   print_vma (val, ab, FALSE, FALSE);
2497   fprintf (info->f, "%s\t%s\t0;\"\tkind:v\ttype:const int\tvalue:%s\n",
2498 	   name, info->filename, ab);
2499   return TRUE;
2500 }
2501 
2502 /* Output a floating point constant.  */
2503 
2504 static bfd_boolean
2505 tg_float_constant (void *p, const char *name, double val)
2506 {
2507   struct pr_handle *info = (struct pr_handle *) p;
2508 
2509   indent (info);
2510   fprintf (info->f, "%s\t%s\t0;\"\tkind:v\ttype:const double\tvalue:%g\n",
2511 	   name, info->filename, val);
2512   return TRUE;
2513 }
2514 
2515 /* Output a typed constant.  */
2516 
2517 static bfd_boolean
2518 tg_typed_constant (void *p, const char *name, bfd_vma val)
2519 {
2520   struct pr_handle *info = (struct pr_handle *) p;
2521   char *t;
2522   char ab[20];
2523 
2524   t = pop_type (info);
2525   if (t == NULL)
2526     return FALSE;
2527 
2528   indent (info);
2529   print_vma (val, ab, FALSE, FALSE);
2530   fprintf (info->f, "%s\t%s\t0;\"\tkind:v\ttype:const %s\tvalue:%s\n",
2531 	   name, info->filename, t, ab);
2532 
2533   free (t);
2534 
2535   return TRUE;
2536 }
2537 
2538 /* Output a variable.  */
2539 
2540 static bfd_boolean
2541 tg_variable (void *p, const char *name, enum debug_var_kind kind,
2542 	     bfd_vma val ATTRIBUTE_UNUSED)
2543 {
2544   struct pr_handle *info = (struct pr_handle *) p;
2545   char *t, *dname, *from_class;
2546 
2547   t = pop_type (info);
2548   if (t == NULL)
2549     return FALSE;
2550 
2551   dname = NULL;
2552   if (info->demangler)
2553     dname = info->demangler (info->abfd, name, DMGL_ANSI | DMGL_PARAMS);
2554 
2555   from_class = NULL;
2556   if (dname != NULL)
2557     {
2558       char *sep;
2559       sep = strstr (dname, "::");
2560       if (sep)
2561 	{
2562 	  *sep = 0;
2563 	  name = sep + 2;
2564 	  from_class = dname;
2565 	}
2566       else
2567 	/* Obscure types as vts and type_info nodes.  */
2568 	name = dname;
2569     }
2570 
2571   fprintf (info->f, "%s\t%s\t0;\"\tkind:v\ttype:%s", name, info->filename, t);
2572 
2573   switch (kind)
2574     {
2575     case DEBUG_STATIC:
2576     case DEBUG_LOCAL_STATIC:
2577       fprintf (info->f, "\tfile:");
2578       break;
2579     case DEBUG_REGISTER:
2580       fprintf (info->f, "\tregister:");
2581       break;
2582     default:
2583       break;
2584     }
2585 
2586   if (from_class)
2587     fprintf (info->f, "\tclass:%s", from_class);
2588 
2589   if (dname)
2590     free (dname);
2591 
2592   fprintf (info->f, "\n");
2593 
2594   free (t);
2595 
2596   return TRUE;
2597 }
2598 
2599 /* Start outputting a function.  */
2600 
2601 static bfd_boolean
2602 tg_start_function (void *p, const char *name, bfd_boolean global)
2603 {
2604   struct pr_handle *info = (struct pr_handle *) p;
2605   char *dname;
2606 
2607   if (! global)
2608     info->stack->flavor = "static";
2609   else
2610     info->stack->flavor = NULL;
2611 
2612   dname = NULL;
2613   if (info->demangler)
2614     dname = info->demangler (info->abfd, name, DMGL_ANSI | DMGL_PARAMS);
2615 
2616   if (! substitute_type (info, dname ? dname : name))
2617     return FALSE;
2618 
2619   info->stack->method = NULL;
2620   if (dname != NULL)
2621     {
2622       char *sep;
2623       sep = strstr (dname, "::");
2624       if (sep)
2625 	{
2626 	  info->stack->method = dname;
2627 	  *sep = 0;
2628 	  name = sep + 2;
2629 	}
2630       else
2631 	{
2632 	  info->stack->method = "";
2633 	  name = dname;
2634 	}
2635       sep = strchr (name, '(');
2636       if (sep)
2637 	*sep = 0;
2638       /* Obscure functions as type_info function.  */
2639     }
2640 
2641   info->stack->parents = strdup (name);
2642 
2643   if (! info->stack->method && ! append_type (info, "("))
2644     return FALSE;
2645 
2646   info->parameter = 1;
2647 
2648   return TRUE;
2649 }
2650 
2651 /* Output a function parameter.  */
2652 
2653 static bfd_boolean
2654 tg_function_parameter (void *p, const char *name, enum debug_parm_kind kind,
2655 		       bfd_vma val ATTRIBUTE_UNUSED)
2656 {
2657   struct pr_handle *info = (struct pr_handle *) p;
2658   char *t;
2659 
2660   if (kind == DEBUG_PARM_REFERENCE
2661       || kind == DEBUG_PARM_REF_REG)
2662     {
2663       if (! pr_reference_type (p))
2664 	return FALSE;
2665     }
2666 
2667   if (! substitute_type (info, name))
2668     return FALSE;
2669 
2670   t = pop_type (info);
2671   if (t == NULL)
2672     return FALSE;
2673 
2674   if (! info->stack->method)
2675     {
2676       if (info->parameter != 1 && ! append_type (info, ", "))
2677 	return FALSE;
2678 
2679       if (kind == DEBUG_PARM_REG || kind == DEBUG_PARM_REF_REG)
2680 	if (! append_type (info, "register "))
2681 	  return FALSE;
2682 
2683       if (! append_type (info, t))
2684 	return FALSE;
2685     }
2686 
2687   free (t);
2688 
2689   ++info->parameter;
2690 
2691   return TRUE;
2692 }
2693 
2694 /* Start writing out a block.  */
2695 
2696 static bfd_boolean
2697 tg_start_block (void *p, bfd_vma addr)
2698 {
2699   struct pr_handle *info = (struct pr_handle *) p;
2700   char ab[20], kind, *partof;
2701   char *t;
2702   bfd_boolean local;
2703 
2704   if (info->parameter > 0)
2705     {
2706       info->parameter = 0;
2707 
2708       /* Delayed name.  */
2709       fprintf (info->f, "%s\t%s\t", info->stack->parents, info->filename);
2710       free (info->stack->parents);
2711 
2712       print_vma (addr, ab, TRUE, TRUE);
2713       translate_addresses (info->abfd, ab, info->f, info->syms);
2714       local = info->stack->flavor != NULL;
2715       if (info->stack->method && *info->stack->method)
2716 	{
2717 	  kind = 'm';
2718 	  partof = (char *) info->stack->method;
2719 	}
2720       else
2721 	{
2722 	  kind = 'f';
2723 	  partof = NULL;
2724 	  if (! info->stack->method && ! append_type (info, ")"))
2725 	    return FALSE;
2726 	}
2727       t = pop_type (info);
2728       if (t == NULL)
2729 	return FALSE;
2730       fprintf (info->f, ";\"\tkind:%c\ttype:%s", kind, t);
2731       if (local)
2732 	fputs ("\tfile:", info->f);
2733       if (partof)
2734 	{
2735 	  fprintf (info->f, "\tclass:%s", partof);
2736 	  free (partof);
2737 	}
2738       fputc ('\n', info->f);
2739     }
2740 
2741   return TRUE;
2742 }
2743 
2744 /* Write out line number information.  */
2745 
2746 static bfd_boolean
2747 tg_lineno (void *p ATTRIBUTE_UNUSED, const char *fname ATTRIBUTE_UNUSED,
2748 	   unsigned long lineno ATTRIBUTE_UNUSED,
2749 	   bfd_vma addr ATTRIBUTE_UNUSED)
2750 {
2751   return TRUE;
2752 }
2753 
2754 /* Finish writing out a block.  */
2755 
2756 static bfd_boolean
2757 tg_end_block (void *p ATTRIBUTE_UNUSED, bfd_vma addr ATTRIBUTE_UNUSED)
2758 {
2759   return TRUE;
2760 }
2761 
2762 /* Convert the visibility value into a human readable name.  */
2763 
2764 static const char *
2765 visibility_name (enum debug_visibility visibility)
2766 {
2767   const char *s;
2768 
2769   switch (visibility)
2770     {
2771     case DEBUG_VISIBILITY_PUBLIC:
2772       s = "public";
2773       break;
2774     case DEBUG_VISIBILITY_PRIVATE:
2775       s = "private";
2776       break;
2777     case DEBUG_VISIBILITY_PROTECTED:
2778       s = "protected";
2779       break;
2780     case DEBUG_VISIBILITY_IGNORE:
2781       s = "/* ignore */";
2782       break;
2783     default:
2784       abort ();
2785       return FALSE;
2786     }
2787   return s;
2788 }
2789