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