]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - binutils/ieee.c
daily update
[thirdparty/binutils-gdb.git] / binutils / ieee.c
1 /* ieee.c -- Read and write IEEE-695 debugging information.
2 Copyright 1996, 1998, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
3 Written by Ian Lance Taylor <ian@cygnus.com>.
4
5 This file is part of GNU Binutils.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA. */
21
22 /* This file reads and writes IEEE-695 debugging information. */
23
24 #include <stdio.h>
25 #include <assert.h>
26
27 #include "bfd.h"
28 #include "ieee.h"
29 #include "bucomm.h"
30 #include "libiberty.h"
31 #include "debug.h"
32 #include "budbg.h"
33 #include "filenames.h"
34
35 /* This structure holds an entry on the block stack. */
36
37 struct ieee_block
38 {
39 /* The kind of block. */
40 int kind;
41 /* The source file name, for a BB5 block. */
42 const char *filename;
43 /* The index of the function type, for a BB4 or BB6 block. */
44 unsigned int fnindx;
45 /* TRUE if this function is being skipped. */
46 bfd_boolean skip;
47 };
48
49 /* This structure is the block stack. */
50
51 #define BLOCKSTACK_SIZE (16)
52
53 struct ieee_blockstack
54 {
55 /* The stack pointer. */
56 struct ieee_block *bsp;
57 /* The stack. */
58 struct ieee_block stack[BLOCKSTACK_SIZE];
59 };
60
61 /* This structure holds information for a variable. */
62
63 struct ieee_var
64 {
65 /* Start of name. */
66 const char *name;
67 /* Length of name. */
68 unsigned long namlen;
69 /* Type. */
70 debug_type type;
71 /* Slot if we make an indirect type. */
72 debug_type *pslot;
73 /* Kind of variable or function. */
74 enum
75 {
76 IEEE_UNKNOWN,
77 IEEE_EXTERNAL,
78 IEEE_GLOBAL,
79 IEEE_STATIC,
80 IEEE_LOCAL,
81 IEEE_FUNCTION
82 } kind;
83 };
84
85 /* This structure holds all the variables. */
86
87 struct ieee_vars
88 {
89 /* Number of slots allocated. */
90 unsigned int alloc;
91 /* Variables. */
92 struct ieee_var *vars;
93 };
94
95 /* This structure holds information for a type. We need this because
96 we don't want to represent bitfields as real types. */
97
98 struct ieee_type
99 {
100 /* Type. */
101 debug_type type;
102 /* Slot if this is type is referenced before it is defined. */
103 debug_type *pslot;
104 /* Slots for arguments if we make indirect types for them. */
105 debug_type *arg_slots;
106 /* If this is a bitfield, this is the size in bits. If this is not
107 a bitfield, this is zero. */
108 unsigned long bitsize;
109 };
110
111 /* This structure holds all the type information. */
112
113 struct ieee_types
114 {
115 /* Number of slots allocated. */
116 unsigned int alloc;
117 /* Types. */
118 struct ieee_type *types;
119 /* Builtin types. */
120 #define BUILTIN_TYPE_COUNT (60)
121 debug_type builtins[BUILTIN_TYPE_COUNT];
122 };
123
124 /* This structure holds a linked last of structs with their tag names,
125 so that we can convert them to C++ classes if necessary. */
126
127 struct ieee_tag
128 {
129 /* Next tag. */
130 struct ieee_tag *next;
131 /* This tag name. */
132 const char *name;
133 /* The type of the tag. */
134 debug_type type;
135 /* The tagged type is an indirect type pointing at this slot. */
136 debug_type slot;
137 /* This is an array of slots used when a field type is converted
138 into a indirect type, in case it needs to be later converted into
139 a reference type. */
140 debug_type *fslots;
141 };
142
143 /* This structure holds the information we pass around to the parsing
144 functions. */
145
146 struct ieee_info
147 {
148 /* The debugging handle. */
149 void *dhandle;
150 /* The BFD. */
151 bfd *abfd;
152 /* The start of the bytes to be parsed. */
153 const bfd_byte *bytes;
154 /* The end of the bytes to be parsed. */
155 const bfd_byte *pend;
156 /* The block stack. */
157 struct ieee_blockstack blockstack;
158 /* Whether we have seen a BB1 or BB2. */
159 bfd_boolean saw_filename;
160 /* The variables. */
161 struct ieee_vars vars;
162 /* The global variables, after a global typedef block. */
163 struct ieee_vars *global_vars;
164 /* The types. */
165 struct ieee_types types;
166 /* The global types, after a global typedef block. */
167 struct ieee_types *global_types;
168 /* The list of tagged structs. */
169 struct ieee_tag *tags;
170 };
171
172 /* Basic builtin types, not including the pointers. */
173
174 enum builtin_types
175 {
176 builtin_unknown = 0,
177 builtin_void = 1,
178 builtin_signed_char = 2,
179 builtin_unsigned_char = 3,
180 builtin_signed_short_int = 4,
181 builtin_unsigned_short_int = 5,
182 builtin_signed_long = 6,
183 builtin_unsigned_long = 7,
184 builtin_signed_long_long = 8,
185 builtin_unsigned_long_long = 9,
186 builtin_float = 10,
187 builtin_double = 11,
188 builtin_long_double = 12,
189 builtin_long_long_double = 13,
190 builtin_quoted_string = 14,
191 builtin_instruction_address = 15,
192 builtin_int = 16,
193 builtin_unsigned = 17,
194 builtin_unsigned_int = 18,
195 builtin_char = 19,
196 builtin_long = 20,
197 builtin_short = 21,
198 builtin_unsigned_short = 22,
199 builtin_short_int = 23,
200 builtin_signed_short = 24,
201 builtin_bcd_float = 25
202 };
203
204 /* These are the values found in the derivation flags of a 'b'
205 component record of a 'T' type extension record in a C++ pmisc
206 record. These are bitmasks. */
207
208 /* Set for a private base class, clear for a public base class.
209 Protected base classes are not supported. */
210 #define BASEFLAGS_PRIVATE (0x1)
211 /* Set for a virtual base class. */
212 #define BASEFLAGS_VIRTUAL (0x2)
213 /* Set for a friend class, clear for a base class. */
214 #define BASEFLAGS_FRIEND (0x10)
215
216 /* These are the values found in the specs flags of a 'd', 'm', or 'v'
217 component record of a 'T' type extension record in a C++ pmisc
218 record. The same flags are used for a 'M' record in a C++ pmisc
219 record. */
220
221 /* The lower two bits hold visibility information. */
222 #define CXXFLAGS_VISIBILITY (0x3)
223 /* This value in the lower two bits indicates a public member. */
224 #define CXXFLAGS_VISIBILITY_PUBLIC (0x0)
225 /* This value in the lower two bits indicates a private member. */
226 #define CXXFLAGS_VISIBILITY_PRIVATE (0x1)
227 /* This value in the lower two bits indicates a protected member. */
228 #define CXXFLAGS_VISIBILITY_PROTECTED (0x2)
229 /* Set for a static member. */
230 #define CXXFLAGS_STATIC (0x4)
231 /* Set for a virtual override. */
232 #define CXXFLAGS_OVERRIDE (0x8)
233 /* Set for a friend function. */
234 #define CXXFLAGS_FRIEND (0x10)
235 /* Set for a const function. */
236 #define CXXFLAGS_CONST (0x20)
237 /* Set for a volatile function. */
238 #define CXXFLAGS_VOLATILE (0x40)
239 /* Set for an overloaded function. */
240 #define CXXFLAGS_OVERLOADED (0x80)
241 /* Set for an operator function. */
242 #define CXXFLAGS_OPERATOR (0x100)
243 /* Set for a constructor or destructor. */
244 #define CXXFLAGS_CTORDTOR (0x400)
245 /* Set for a constructor. */
246 #define CXXFLAGS_CTOR (0x200)
247 /* Set for an inline function. */
248 #define CXXFLAGS_INLINE (0x800)
249
250 /* Local functions. */
251
252 static void ieee_error (struct ieee_info *, const bfd_byte *, const char *);
253 static void ieee_eof (struct ieee_info *);
254 static char *savestring (const char *, unsigned long);
255 static bfd_boolean ieee_read_number
256 (struct ieee_info *, const bfd_byte **, bfd_vma *);
257 static bfd_boolean ieee_read_optional_number
258 (struct ieee_info *, const bfd_byte **, bfd_vma *, bfd_boolean *);
259 static bfd_boolean ieee_read_id
260 (struct ieee_info *, const bfd_byte **, const char **, unsigned long *);
261 static bfd_boolean ieee_read_optional_id
262 (struct ieee_info *, const bfd_byte **, const char **, unsigned long *,
263 bfd_boolean *);
264 static bfd_boolean ieee_read_expression
265 (struct ieee_info *, const bfd_byte **, bfd_vma *);
266 static debug_type ieee_builtin_type
267 (struct ieee_info *, const bfd_byte *, unsigned int);
268 static bfd_boolean ieee_alloc_type
269 (struct ieee_info *, unsigned int, bfd_boolean);
270 static bfd_boolean ieee_read_type_index
271 (struct ieee_info *, const bfd_byte **, debug_type *);
272 static int ieee_regno_to_genreg (bfd *, int);
273 static int ieee_genreg_to_regno (bfd *, int);
274 static bfd_boolean parse_ieee_bb (struct ieee_info *, const bfd_byte **);
275 static bfd_boolean parse_ieee_be (struct ieee_info *, const bfd_byte **);
276 static bfd_boolean parse_ieee_nn (struct ieee_info *, const bfd_byte **);
277 static bfd_boolean parse_ieee_ty (struct ieee_info *, const bfd_byte **);
278 static bfd_boolean parse_ieee_atn (struct ieee_info *, const bfd_byte **);
279 static bfd_boolean ieee_read_cxx_misc
280 (struct ieee_info *, const bfd_byte **, unsigned long);
281 static bfd_boolean ieee_read_cxx_class
282 (struct ieee_info *, const bfd_byte **, unsigned long);
283 static bfd_boolean ieee_read_cxx_defaults
284 (struct ieee_info *, const bfd_byte **, unsigned long);
285 static bfd_boolean ieee_read_reference
286 (struct ieee_info *, const bfd_byte **);
287 static bfd_boolean ieee_require_asn
288 (struct ieee_info *, const bfd_byte **, bfd_vma *);
289 static bfd_boolean ieee_require_atn65
290 (struct ieee_info *, const bfd_byte **, const char **, unsigned long *);
291
292 /* Report an error in the IEEE debugging information. */
293
294 static void
295 ieee_error (struct ieee_info *info, const bfd_byte *p, const char *s)
296 {
297 if (p != NULL)
298 fprintf (stderr, "%s: 0x%lx: %s (0x%x)\n", bfd_get_filename (info->abfd),
299 (unsigned long) (p - info->bytes), s, *p);
300 else
301 fprintf (stderr, "%s: %s\n", bfd_get_filename (info->abfd), s);
302 }
303
304 /* Report an unexpected EOF in the IEEE debugging information. */
305
306 static void
307 ieee_eof (struct ieee_info *info)
308 {
309 ieee_error (info, (const bfd_byte *) NULL,
310 _("unexpected end of debugging information"));
311 }
312
313 /* Save a string in memory. */
314
315 static char *
316 savestring (const char *start, unsigned long len)
317 {
318 char *ret;
319
320 ret = (char *) xmalloc (len + 1);
321 memcpy (ret, start, len);
322 ret[len] = '\0';
323 return ret;
324 }
325
326 /* Read a number which must be present in an IEEE file. */
327
328 static bfd_boolean
329 ieee_read_number (struct ieee_info *info, const bfd_byte **pp, bfd_vma *pv)
330 {
331 return ieee_read_optional_number (info, pp, pv, (bfd_boolean *) NULL);
332 }
333
334 /* Read a number in an IEEE file. If ppresent is not NULL, the number
335 need not be there. */
336
337 static bfd_boolean
338 ieee_read_optional_number (struct ieee_info *info, const bfd_byte **pp,
339 bfd_vma *pv, bfd_boolean *ppresent)
340 {
341 ieee_record_enum_type b;
342
343 if (*pp >= info->pend)
344 {
345 if (ppresent != NULL)
346 {
347 *ppresent = FALSE;
348 return TRUE;
349 }
350 ieee_eof (info);
351 return FALSE;
352 }
353
354 b = (ieee_record_enum_type) **pp;
355 ++*pp;
356
357 if (b <= ieee_number_end_enum)
358 {
359 *pv = (bfd_vma) b;
360 if (ppresent != NULL)
361 *ppresent = TRUE;
362 return TRUE;
363 }
364
365 if (b >= ieee_number_repeat_start_enum && b <= ieee_number_repeat_end_enum)
366 {
367 unsigned int i;
368
369 i = (int) b - (int) ieee_number_repeat_start_enum;
370 if (*pp + i - 1 >= info->pend)
371 {
372 ieee_eof (info);
373 return FALSE;
374 }
375
376 *pv = 0;
377 for (; i > 0; i--)
378 {
379 *pv <<= 8;
380 *pv += **pp;
381 ++*pp;
382 }
383
384 if (ppresent != NULL)
385 *ppresent = TRUE;
386
387 return TRUE;
388 }
389
390 if (ppresent != NULL)
391 {
392 --*pp;
393 *ppresent = FALSE;
394 return TRUE;
395 }
396
397 ieee_error (info, *pp - 1, _("invalid number"));
398 return FALSE;
399 }
400
401 /* Read a required string from an IEEE file. */
402
403 static bfd_boolean
404 ieee_read_id (struct ieee_info *info, const bfd_byte **pp,
405 const char **pname, unsigned long *pnamlen)
406 {
407 return ieee_read_optional_id (info, pp, pname, pnamlen, (bfd_boolean *) NULL);
408 }
409
410 /* Read a string from an IEEE file. If ppresent is not NULL, the
411 string is optional. */
412
413 static bfd_boolean
414 ieee_read_optional_id (struct ieee_info *info, const bfd_byte **pp,
415 const char **pname, unsigned long *pnamlen,
416 bfd_boolean *ppresent)
417 {
418 bfd_byte b;
419 unsigned long len;
420
421 if (*pp >= info->pend)
422 {
423 ieee_eof (info);
424 return FALSE;
425 }
426
427 b = **pp;
428 ++*pp;
429
430 if (b <= 0x7f)
431 len = b;
432 else if ((ieee_record_enum_type) b == ieee_extension_length_1_enum)
433 {
434 len = **pp;
435 ++*pp;
436 }
437 else if ((ieee_record_enum_type) b == ieee_extension_length_2_enum)
438 {
439 len = (**pp << 8) + (*pp)[1];
440 *pp += 2;
441 }
442 else
443 {
444 if (ppresent != NULL)
445 {
446 --*pp;
447 *ppresent = FALSE;
448 return TRUE;
449 }
450 ieee_error (info, *pp - 1, _("invalid string length"));
451 return FALSE;
452 }
453
454 if ((unsigned long) (info->pend - *pp) < len)
455 {
456 ieee_eof (info);
457 return FALSE;
458 }
459
460 *pname = (const char *) *pp;
461 *pnamlen = len;
462 *pp += len;
463
464 if (ppresent != NULL)
465 *ppresent = TRUE;
466
467 return TRUE;
468 }
469
470 /* Read an expression from an IEEE file. Since this code is only used
471 to parse debugging information, I haven't bothered to write a full
472 blown IEEE expression parser. I've only thrown in the things I've
473 seen in debugging information. This can be easily extended if
474 necessary. */
475
476 static bfd_boolean
477 ieee_read_expression (struct ieee_info *info, const bfd_byte **pp,
478 bfd_vma *pv)
479 {
480 const bfd_byte *expr_start;
481 #define EXPR_STACK_SIZE (10)
482 bfd_vma expr_stack[EXPR_STACK_SIZE];
483 bfd_vma *esp;
484
485 expr_start = *pp;
486
487 esp = expr_stack;
488
489 while (1)
490 {
491 const bfd_byte *start;
492 bfd_vma val;
493 bfd_boolean present;
494 ieee_record_enum_type c;
495
496 start = *pp;
497
498 if (! ieee_read_optional_number (info, pp, &val, &present))
499 return FALSE;
500
501 if (present)
502 {
503 if (esp - expr_stack >= EXPR_STACK_SIZE)
504 {
505 ieee_error (info, start, _("expression stack overflow"));
506 return FALSE;
507 }
508 *esp++ = val;
509 continue;
510 }
511
512 c = (ieee_record_enum_type) **pp;
513
514 if (c >= ieee_module_beginning_enum)
515 break;
516
517 ++*pp;
518
519 if (c == ieee_comma)
520 break;
521
522 switch (c)
523 {
524 default:
525 ieee_error (info, start, _("unsupported IEEE expression operator"));
526 break;
527
528 case ieee_variable_R_enum:
529 {
530 bfd_vma indx;
531 asection *s;
532
533 if (! ieee_read_number (info, pp, &indx))
534 return FALSE;
535 for (s = info->abfd->sections; s != NULL; s = s->next)
536 if ((bfd_vma) s->target_index == indx)
537 break;
538 if (s == NULL)
539 {
540 ieee_error (info, start, _("unknown section"));
541 return FALSE;
542 }
543
544 if (esp - expr_stack >= EXPR_STACK_SIZE)
545 {
546 ieee_error (info, start, _("expression stack overflow"));
547 return FALSE;
548 }
549
550 *esp++ = bfd_get_section_vma (info->abfd, s);
551 }
552 break;
553
554 case ieee_function_plus_enum:
555 case ieee_function_minus_enum:
556 {
557 bfd_vma v1, v2;
558
559 if (esp - expr_stack < 2)
560 {
561 ieee_error (info, start, _("expression stack underflow"));
562 return FALSE;
563 }
564
565 v1 = *--esp;
566 v2 = *--esp;
567 *esp++ = v1 + v2;
568 }
569 break;
570 }
571 }
572
573 if (esp - 1 != expr_stack)
574 {
575 ieee_error (info, expr_start, _("expression stack mismatch"));
576 return FALSE;
577 }
578
579 *pv = *--esp;
580
581 return TRUE;
582 }
583
584 /* Return an IEEE builtin type. */
585
586 static debug_type
587 ieee_builtin_type (struct ieee_info *info, const bfd_byte *p,
588 unsigned int indx)
589 {
590 void *dhandle;
591 debug_type type;
592 const char *name;
593
594 if (indx < BUILTIN_TYPE_COUNT
595 && info->types.builtins[indx] != DEBUG_TYPE_NULL)
596 return info->types.builtins[indx];
597
598 dhandle = info->dhandle;
599
600 if (indx >= 32 && indx < 64)
601 {
602 type = debug_make_pointer_type (dhandle,
603 ieee_builtin_type (info, p, indx - 32));
604 assert (indx < BUILTIN_TYPE_COUNT);
605 info->types.builtins[indx] = type;
606 return type;
607 }
608
609 switch ((enum builtin_types) indx)
610 {
611 default:
612 ieee_error (info, p, _("unknown builtin type"));
613 return NULL;
614
615 case builtin_unknown:
616 type = debug_make_void_type (dhandle);
617 name = NULL;
618 break;
619
620 case builtin_void:
621 type = debug_make_void_type (dhandle);
622 name = "void";
623 break;
624
625 case builtin_signed_char:
626 type = debug_make_int_type (dhandle, 1, FALSE);
627 name = "signed char";
628 break;
629
630 case builtin_unsigned_char:
631 type = debug_make_int_type (dhandle, 1, TRUE);
632 name = "unsigned char";
633 break;
634
635 case builtin_signed_short_int:
636 type = debug_make_int_type (dhandle, 2, FALSE);
637 name = "signed short int";
638 break;
639
640 case builtin_unsigned_short_int:
641 type = debug_make_int_type (dhandle, 2, TRUE);
642 name = "unsigned short int";
643 break;
644
645 case builtin_signed_long:
646 type = debug_make_int_type (dhandle, 4, FALSE);
647 name = "signed long";
648 break;
649
650 case builtin_unsigned_long:
651 type = debug_make_int_type (dhandle, 4, TRUE);
652 name = "unsigned long";
653 break;
654
655 case builtin_signed_long_long:
656 type = debug_make_int_type (dhandle, 8, FALSE);
657 name = "signed long long";
658 break;
659
660 case builtin_unsigned_long_long:
661 type = debug_make_int_type (dhandle, 8, TRUE);
662 name = "unsigned long long";
663 break;
664
665 case builtin_float:
666 type = debug_make_float_type (dhandle, 4);
667 name = "float";
668 break;
669
670 case builtin_double:
671 type = debug_make_float_type (dhandle, 8);
672 name = "double";
673 break;
674
675 case builtin_long_double:
676 /* FIXME: The size for this type should depend upon the
677 processor. */
678 type = debug_make_float_type (dhandle, 12);
679 name = "long double";
680 break;
681
682 case builtin_long_long_double:
683 type = debug_make_float_type (dhandle, 16);
684 name = "long long double";
685 break;
686
687 case builtin_quoted_string:
688 type = debug_make_array_type (dhandle,
689 ieee_builtin_type (info, p,
690 ((unsigned int)
691 builtin_char)),
692 ieee_builtin_type (info, p,
693 ((unsigned int)
694 builtin_int)),
695 0, -1, TRUE);
696 name = "QUOTED STRING";
697 break;
698
699 case builtin_instruction_address:
700 /* FIXME: This should be a code address. */
701 type = debug_make_int_type (dhandle, 4, TRUE);
702 name = "instruction address";
703 break;
704
705 case builtin_int:
706 /* FIXME: The size for this type should depend upon the
707 processor. */
708 type = debug_make_int_type (dhandle, 4, FALSE);
709 name = "int";
710 break;
711
712 case builtin_unsigned:
713 /* FIXME: The size for this type should depend upon the
714 processor. */
715 type = debug_make_int_type (dhandle, 4, TRUE);
716 name = "unsigned";
717 break;
718
719 case builtin_unsigned_int:
720 /* FIXME: The size for this type should depend upon the
721 processor. */
722 type = debug_make_int_type (dhandle, 4, TRUE);
723 name = "unsigned int";
724 break;
725
726 case builtin_char:
727 type = debug_make_int_type (dhandle, 1, FALSE);
728 name = "char";
729 break;
730
731 case builtin_long:
732 type = debug_make_int_type (dhandle, 4, FALSE);
733 name = "long";
734 break;
735
736 case builtin_short:
737 type = debug_make_int_type (dhandle, 2, FALSE);
738 name = "short";
739 break;
740
741 case builtin_unsigned_short:
742 type = debug_make_int_type (dhandle, 2, TRUE);
743 name = "unsigned short";
744 break;
745
746 case builtin_short_int:
747 type = debug_make_int_type (dhandle, 2, FALSE);
748 name = "short int";
749 break;
750
751 case builtin_signed_short:
752 type = debug_make_int_type (dhandle, 2, FALSE);
753 name = "signed short";
754 break;
755
756 case builtin_bcd_float:
757 ieee_error (info, p, _("BCD float type not supported"));
758 return DEBUG_TYPE_NULL;
759 }
760
761 if (name != NULL)
762 type = debug_name_type (dhandle, name, type);
763
764 assert (indx < BUILTIN_TYPE_COUNT);
765
766 info->types.builtins[indx] = type;
767
768 return type;
769 }
770
771 /* Allocate more space in the type table. If ref is TRUE, this is a
772 reference to the type; if it is not already defined, we should set
773 up an indirect type. */
774
775 static bfd_boolean
776 ieee_alloc_type (struct ieee_info *info, unsigned int indx, bfd_boolean ref)
777 {
778 unsigned int nalloc;
779 register struct ieee_type *t;
780 struct ieee_type *tend;
781
782 if (indx >= info->types.alloc)
783 {
784 nalloc = info->types.alloc;
785 if (nalloc == 0)
786 nalloc = 4;
787 while (indx >= nalloc)
788 nalloc *= 2;
789
790 info->types.types = ((struct ieee_type *)
791 xrealloc (info->types.types,
792 nalloc * sizeof *info->types.types));
793
794 memset (info->types.types + info->types.alloc, 0,
795 (nalloc - info->types.alloc) * sizeof *info->types.types);
796
797 tend = info->types.types + nalloc;
798 for (t = info->types.types + info->types.alloc; t < tend; t++)
799 t->type = DEBUG_TYPE_NULL;
800
801 info->types.alloc = nalloc;
802 }
803
804 if (ref)
805 {
806 t = info->types.types + indx;
807 if (t->type == NULL)
808 {
809 t->pslot = (debug_type *) xmalloc (sizeof *t->pslot);
810 *t->pslot = DEBUG_TYPE_NULL;
811 t->type = debug_make_indirect_type (info->dhandle, t->pslot,
812 (const char *) NULL);
813 if (t->type == NULL)
814 return FALSE;
815 }
816 }
817
818 return TRUE;
819 }
820
821 /* Read a type index and return the corresponding type. */
822
823 static bfd_boolean
824 ieee_read_type_index (struct ieee_info *info, const bfd_byte **pp,
825 debug_type *ptype)
826 {
827 const bfd_byte *start;
828 bfd_vma indx;
829
830 start = *pp;
831
832 if (! ieee_read_number (info, pp, &indx))
833 return FALSE;
834
835 if (indx < 256)
836 {
837 *ptype = ieee_builtin_type (info, start, indx);
838 if (*ptype == NULL)
839 return FALSE;
840 return TRUE;
841 }
842
843 indx -= 256;
844 if (! ieee_alloc_type (info, indx, TRUE))
845 return FALSE;
846
847 *ptype = info->types.types[indx].type;
848
849 return TRUE;
850 }
851
852 /* Parse IEEE debugging information for a file. This is passed the
853 bytes which compose the Debug Information Part of an IEEE file. */
854
855 bfd_boolean
856 parse_ieee (void *dhandle, bfd *abfd, const bfd_byte *bytes, bfd_size_type len)
857 {
858 struct ieee_info info;
859 unsigned int i;
860 const bfd_byte *p, *pend;
861
862 info.dhandle = dhandle;
863 info.abfd = abfd;
864 info.bytes = bytes;
865 info.pend = bytes + len;
866 info.blockstack.bsp = info.blockstack.stack;
867 info.saw_filename = FALSE;
868 info.vars.alloc = 0;
869 info.vars.vars = NULL;
870 info.global_vars = NULL;
871 info.types.alloc = 0;
872 info.types.types = NULL;
873 info.global_types = NULL;
874 info.tags = NULL;
875 for (i = 0; i < BUILTIN_TYPE_COUNT; i++)
876 info.types.builtins[i] = DEBUG_TYPE_NULL;
877
878 p = bytes;
879 pend = info.pend;
880 while (p < pend)
881 {
882 const bfd_byte *record_start;
883 ieee_record_enum_type c;
884
885 record_start = p;
886
887 c = (ieee_record_enum_type) *p++;
888
889 if (c == ieee_at_record_enum)
890 c = (ieee_record_enum_type) (((unsigned int) c << 8) | *p++);
891
892 if (c <= ieee_number_repeat_end_enum)
893 {
894 ieee_error (&info, record_start, _("unexpected number"));
895 return FALSE;
896 }
897
898 switch (c)
899 {
900 default:
901 ieee_error (&info, record_start, _("unexpected record type"));
902 return FALSE;
903
904 case ieee_bb_record_enum:
905 if (! parse_ieee_bb (&info, &p))
906 return FALSE;
907 break;
908
909 case ieee_be_record_enum:
910 if (! parse_ieee_be (&info, &p))
911 return FALSE;
912 break;
913
914 case ieee_nn_record:
915 if (! parse_ieee_nn (&info, &p))
916 return FALSE;
917 break;
918
919 case ieee_ty_record_enum:
920 if (! parse_ieee_ty (&info, &p))
921 return FALSE;
922 break;
923
924 case ieee_atn_record_enum:
925 if (! parse_ieee_atn (&info, &p))
926 return FALSE;
927 break;
928 }
929 }
930
931 if (info.blockstack.bsp != info.blockstack.stack)
932 {
933 ieee_error (&info, (const bfd_byte *) NULL,
934 _("blocks left on stack at end"));
935 return FALSE;
936 }
937
938 return TRUE;
939 }
940
941 /* Handle an IEEE BB record. */
942
943 static bfd_boolean
944 parse_ieee_bb (struct ieee_info *info, const bfd_byte **pp)
945 {
946 const bfd_byte *block_start;
947 bfd_byte b;
948 bfd_vma size;
949 const char *name;
950 unsigned long namlen;
951 char *namcopy = NULL;
952 unsigned int fnindx;
953 bfd_boolean skip;
954
955 block_start = *pp;
956
957 b = **pp;
958 ++*pp;
959
960 if (! ieee_read_number (info, pp, &size)
961 || ! ieee_read_id (info, pp, &name, &namlen))
962 return FALSE;
963
964 fnindx = (unsigned int) -1;
965 skip = FALSE;
966
967 switch (b)
968 {
969 case 1:
970 /* BB1: Type definitions local to a module. */
971 namcopy = savestring (name, namlen);
972 if (namcopy == NULL)
973 return FALSE;
974 if (! debug_set_filename (info->dhandle, namcopy))
975 return FALSE;
976 info->saw_filename = TRUE;
977
978 /* Discard any variables or types we may have seen before. */
979 if (info->vars.vars != NULL)
980 free (info->vars.vars);
981 info->vars.vars = NULL;
982 info->vars.alloc = 0;
983 if (info->types.types != NULL)
984 free (info->types.types);
985 info->types.types = NULL;
986 info->types.alloc = 0;
987
988 /* Initialize the types to the global types. */
989 if (info->global_types != NULL)
990 {
991 info->types.alloc = info->global_types->alloc;
992 info->types.types = ((struct ieee_type *)
993 xmalloc (info->types.alloc
994 * sizeof (*info->types.types)));
995 memcpy (info->types.types, info->global_types->types,
996 info->types.alloc * sizeof (*info->types.types));
997 }
998
999 break;
1000
1001 case 2:
1002 /* BB2: Global type definitions. The name is supposed to be
1003 empty, but we don't check. */
1004 if (! debug_set_filename (info->dhandle, "*global*"))
1005 return FALSE;
1006 info->saw_filename = TRUE;
1007 break;
1008
1009 case 3:
1010 /* BB3: High level module block begin. We don't have to do
1011 anything here. The name is supposed to be the same as for
1012 the BB1, but we don't check. */
1013 break;
1014
1015 case 4:
1016 /* BB4: Global function. */
1017 {
1018 bfd_vma stackspace, typindx, offset;
1019 debug_type return_type;
1020
1021 if (! ieee_read_number (info, pp, &stackspace)
1022 || ! ieee_read_number (info, pp, &typindx)
1023 || ! ieee_read_expression (info, pp, &offset))
1024 return FALSE;
1025
1026 /* We have no way to record the stack space. FIXME. */
1027
1028 if (typindx < 256)
1029 {
1030 return_type = ieee_builtin_type (info, block_start, typindx);
1031 if (return_type == DEBUG_TYPE_NULL)
1032 return FALSE;
1033 }
1034 else
1035 {
1036 typindx -= 256;
1037 if (! ieee_alloc_type (info, typindx, TRUE))
1038 return FALSE;
1039 fnindx = typindx;
1040 return_type = info->types.types[typindx].type;
1041 if (debug_get_type_kind (info->dhandle, return_type)
1042 == DEBUG_KIND_FUNCTION)
1043 return_type = debug_get_return_type (info->dhandle,
1044 return_type);
1045 }
1046
1047 namcopy = savestring (name, namlen);
1048 if (namcopy == NULL)
1049 return FALSE;
1050 if (! debug_record_function (info->dhandle, namcopy, return_type,
1051 TRUE, offset))
1052 return FALSE;
1053 }
1054 break;
1055
1056 case 5:
1057 /* BB5: File name for source line numbers. */
1058 {
1059 unsigned int i;
1060
1061 /* We ignore the date and time. FIXME. */
1062 for (i = 0; i < 6; i++)
1063 {
1064 bfd_vma ignore;
1065 bfd_boolean present;
1066
1067 if (! ieee_read_optional_number (info, pp, &ignore, &present))
1068 return FALSE;
1069 if (! present)
1070 break;
1071 }
1072
1073 namcopy = savestring (name, namlen);
1074 if (namcopy == NULL)
1075 return FALSE;
1076 if (! debug_start_source (info->dhandle, namcopy))
1077 return FALSE;
1078 }
1079 break;
1080
1081 case 6:
1082 /* BB6: Local function or block. */
1083 {
1084 bfd_vma stackspace, typindx, offset;
1085
1086 if (! ieee_read_number (info, pp, &stackspace)
1087 || ! ieee_read_number (info, pp, &typindx)
1088 || ! ieee_read_expression (info, pp, &offset))
1089 return FALSE;
1090
1091 /* We have no way to record the stack space. FIXME. */
1092
1093 if (namlen == 0)
1094 {
1095 if (! debug_start_block (info->dhandle, offset))
1096 return FALSE;
1097 /* Change b to indicate that this is a block
1098 rather than a function. */
1099 b = 0x86;
1100 }
1101 else
1102 {
1103 /* The MRI C++ compiler will output a fake function named
1104 __XRYCPP to hold C++ debugging information. We skip
1105 that function. This is not crucial, but it makes
1106 converting from IEEE to other debug formats work
1107 better. */
1108 if (strncmp (name, "__XRYCPP", namlen) == 0)
1109 skip = TRUE;
1110 else
1111 {
1112 debug_type return_type;
1113
1114 if (typindx < 256)
1115 {
1116 return_type = ieee_builtin_type (info, block_start,
1117 typindx);
1118 if (return_type == NULL)
1119 return FALSE;
1120 }
1121 else
1122 {
1123 typindx -= 256;
1124 if (! ieee_alloc_type (info, typindx, TRUE))
1125 return FALSE;
1126 fnindx = typindx;
1127 return_type = info->types.types[typindx].type;
1128 if (debug_get_type_kind (info->dhandle, return_type)
1129 == DEBUG_KIND_FUNCTION)
1130 return_type = debug_get_return_type (info->dhandle,
1131 return_type);
1132 }
1133
1134 namcopy = savestring (name, namlen);
1135 if (namcopy == NULL)
1136 return FALSE;
1137 if (! debug_record_function (info->dhandle, namcopy,
1138 return_type, FALSE, offset))
1139 return FALSE;
1140 }
1141 }
1142 }
1143 break;
1144
1145 case 10:
1146 /* BB10: Assembler module scope. In the normal case, we
1147 completely ignore all this information. FIXME. */
1148 {
1149 const char *inam, *vstr;
1150 unsigned long inamlen, vstrlen;
1151 bfd_vma tool_type;
1152 bfd_boolean present;
1153 unsigned int i;
1154
1155 if (! info->saw_filename)
1156 {
1157 namcopy = savestring (name, namlen);
1158 if (namcopy == NULL)
1159 return FALSE;
1160 if (! debug_set_filename (info->dhandle, namcopy))
1161 return FALSE;
1162 info->saw_filename = TRUE;
1163 }
1164
1165 if (! ieee_read_id (info, pp, &inam, &inamlen)
1166 || ! ieee_read_number (info, pp, &tool_type)
1167 || ! ieee_read_optional_id (info, pp, &vstr, &vstrlen, &present))
1168 return FALSE;
1169 for (i = 0; i < 6; i++)
1170 {
1171 bfd_vma ignore;
1172
1173 if (! ieee_read_optional_number (info, pp, &ignore, &present))
1174 return FALSE;
1175 if (! present)
1176 break;
1177 }
1178 }
1179 break;
1180
1181 case 11:
1182 /* BB11: Module section. We completely ignore all this
1183 information. FIXME. */
1184 {
1185 bfd_vma sectype, secindx, offset, map;
1186 bfd_boolean present;
1187
1188 if (! ieee_read_number (info, pp, &sectype)
1189 || ! ieee_read_number (info, pp, &secindx)
1190 || ! ieee_read_expression (info, pp, &offset)
1191 || ! ieee_read_optional_number (info, pp, &map, &present))
1192 return FALSE;
1193 }
1194 break;
1195
1196 default:
1197 ieee_error (info, block_start, _("unknown BB type"));
1198 return FALSE;
1199 }
1200
1201
1202 /* Push this block on the block stack. */
1203
1204 if (info->blockstack.bsp >= info->blockstack.stack + BLOCKSTACK_SIZE)
1205 {
1206 ieee_error (info, (const bfd_byte *) NULL, _("stack overflow"));
1207 return FALSE;
1208 }
1209
1210 info->blockstack.bsp->kind = b;
1211 if (b == 5)
1212 info->blockstack.bsp->filename = namcopy;
1213 info->blockstack.bsp->fnindx = fnindx;
1214 info->blockstack.bsp->skip = skip;
1215 ++info->blockstack.bsp;
1216
1217 return TRUE;
1218 }
1219
1220 /* Handle an IEEE BE record. */
1221
1222 static bfd_boolean
1223 parse_ieee_be (struct ieee_info *info, const bfd_byte **pp)
1224 {
1225 bfd_vma offset;
1226
1227 if (info->blockstack.bsp <= info->blockstack.stack)
1228 {
1229 ieee_error (info, *pp, _("stack underflow"));
1230 return FALSE;
1231 }
1232 --info->blockstack.bsp;
1233
1234 switch (info->blockstack.bsp->kind)
1235 {
1236 case 2:
1237 /* When we end the global typedefs block, we copy out the
1238 contents of info->vars. This is because the variable indices
1239 may be reused in the local blocks. However, we need to
1240 preserve them so that we can locate a function returning a
1241 reference variable whose type is named in the global typedef
1242 block. */
1243 info->global_vars = ((struct ieee_vars *)
1244 xmalloc (sizeof *info->global_vars));
1245 info->global_vars->alloc = info->vars.alloc;
1246 info->global_vars->vars = ((struct ieee_var *)
1247 xmalloc (info->vars.alloc
1248 * sizeof (*info->vars.vars)));
1249 memcpy (info->global_vars->vars, info->vars.vars,
1250 info->vars.alloc * sizeof (*info->vars.vars));
1251
1252 /* We also copy out the non builtin parts of info->types, since
1253 the types are discarded when we start a new block. */
1254 info->global_types = ((struct ieee_types *)
1255 xmalloc (sizeof *info->global_types));
1256 info->global_types->alloc = info->types.alloc;
1257 info->global_types->types = ((struct ieee_type *)
1258 xmalloc (info->types.alloc
1259 * sizeof (*info->types.types)));
1260 memcpy (info->global_types->types, info->types.types,
1261 info->types.alloc * sizeof (*info->types.types));
1262 memset (info->global_types->builtins, 0,
1263 sizeof (info->global_types->builtins));
1264
1265 break;
1266
1267 case 4:
1268 case 6:
1269 if (! ieee_read_expression (info, pp, &offset))
1270 return FALSE;
1271 if (! info->blockstack.bsp->skip)
1272 {
1273 if (! debug_end_function (info->dhandle, offset + 1))
1274 return FALSE;
1275 }
1276 break;
1277
1278 case 0x86:
1279 /* This is BE6 when BB6 started a block rather than a local
1280 function. */
1281 if (! ieee_read_expression (info, pp, &offset))
1282 return FALSE;
1283 if (! debug_end_block (info->dhandle, offset + 1))
1284 return FALSE;
1285 break;
1286
1287 case 5:
1288 /* When we end a BB5, we look up the stack for the last BB5, if
1289 there is one, so that we can call debug_start_source. */
1290 if (info->blockstack.bsp > info->blockstack.stack)
1291 {
1292 struct ieee_block *bl;
1293
1294 bl = info->blockstack.bsp;
1295 do
1296 {
1297 --bl;
1298 if (bl->kind == 5)
1299 {
1300 if (! debug_start_source (info->dhandle, bl->filename))
1301 return FALSE;
1302 break;
1303 }
1304 }
1305 while (bl != info->blockstack.stack);
1306 }
1307 break;
1308
1309 case 11:
1310 if (! ieee_read_expression (info, pp, &offset))
1311 return FALSE;
1312 /* We just ignore the module size. FIXME. */
1313 break;
1314
1315 default:
1316 /* Other block types do not have any trailing information. */
1317 break;
1318 }
1319
1320 return TRUE;
1321 }
1322
1323 /* Parse an NN record. */
1324
1325 static bfd_boolean
1326 parse_ieee_nn (struct ieee_info *info, const bfd_byte **pp)
1327 {
1328 const bfd_byte *nn_start;
1329 bfd_vma varindx;
1330 const char *name;
1331 unsigned long namlen;
1332
1333 nn_start = *pp;
1334
1335 if (! ieee_read_number (info, pp, &varindx)
1336 || ! ieee_read_id (info, pp, &name, &namlen))
1337 return FALSE;
1338
1339 if (varindx < 32)
1340 {
1341 ieee_error (info, nn_start, _("illegal variable index"));
1342 return FALSE;
1343 }
1344 varindx -= 32;
1345
1346 if (varindx >= info->vars.alloc)
1347 {
1348 unsigned int alloc;
1349
1350 alloc = info->vars.alloc;
1351 if (alloc == 0)
1352 alloc = 4;
1353 while (varindx >= alloc)
1354 alloc *= 2;
1355 info->vars.vars = ((struct ieee_var *)
1356 xrealloc (info->vars.vars,
1357 alloc * sizeof *info->vars.vars));
1358 memset (info->vars.vars + info->vars.alloc, 0,
1359 (alloc - info->vars.alloc) * sizeof *info->vars.vars);
1360 info->vars.alloc = alloc;
1361 }
1362
1363 info->vars.vars[varindx].name = name;
1364 info->vars.vars[varindx].namlen = namlen;
1365
1366 return TRUE;
1367 }
1368
1369 /* Parse a TY record. */
1370
1371 static bfd_boolean
1372 parse_ieee_ty (struct ieee_info *info, const bfd_byte **pp)
1373 {
1374 const bfd_byte *ty_start, *ty_var_start, *ty_code_start;
1375 bfd_vma typeindx, varindx, tc;
1376 void *dhandle;
1377 bfd_boolean tag, typdef;
1378 debug_type *arg_slots;
1379 unsigned long type_bitsize;
1380 debug_type type;
1381
1382 ty_start = *pp;
1383
1384 if (! ieee_read_number (info, pp, &typeindx))
1385 return FALSE;
1386
1387 if (typeindx < 256)
1388 {
1389 ieee_error (info, ty_start, _("illegal type index"));
1390 return FALSE;
1391 }
1392
1393 typeindx -= 256;
1394 if (! ieee_alloc_type (info, typeindx, FALSE))
1395 return FALSE;
1396
1397 if (**pp != 0xce)
1398 {
1399 ieee_error (info, *pp, _("unknown TY code"));
1400 return FALSE;
1401 }
1402 ++*pp;
1403
1404 ty_var_start = *pp;
1405
1406 if (! ieee_read_number (info, pp, &varindx))
1407 return FALSE;
1408
1409 if (varindx < 32)
1410 {
1411 ieee_error (info, ty_var_start, _("illegal variable index"));
1412 return FALSE;
1413 }
1414 varindx -= 32;
1415
1416 if (varindx >= info->vars.alloc || info->vars.vars[varindx].name == NULL)
1417 {
1418 ieee_error (info, ty_var_start, _("undefined variable in TY"));
1419 return FALSE;
1420 }
1421
1422 ty_code_start = *pp;
1423
1424 if (! ieee_read_number (info, pp, &tc))
1425 return FALSE;
1426
1427 dhandle = info->dhandle;
1428
1429 tag = FALSE;
1430 typdef = FALSE;
1431 arg_slots = NULL;
1432 type_bitsize = 0;
1433 switch (tc)
1434 {
1435 default:
1436 ieee_error (info, ty_code_start, _("unknown TY code"));
1437 return FALSE;
1438
1439 case '!':
1440 /* Unknown type, with size. We treat it as int. FIXME. */
1441 {
1442 bfd_vma size;
1443
1444 if (! ieee_read_number (info, pp, &size))
1445 return FALSE;
1446 type = debug_make_int_type (dhandle, size, FALSE);
1447 }
1448 break;
1449
1450 case 'A': /* Array. */
1451 case 'a': /* FORTRAN array in column/row order. FIXME: Not
1452 distinguished from normal array. */
1453 {
1454 debug_type ele_type;
1455 bfd_vma lower, upper;
1456
1457 if (! ieee_read_type_index (info, pp, &ele_type)
1458 || ! ieee_read_number (info, pp, &lower)
1459 || ! ieee_read_number (info, pp, &upper))
1460 return FALSE;
1461 type = debug_make_array_type (dhandle, ele_type,
1462 ieee_builtin_type (info, ty_code_start,
1463 ((unsigned int)
1464 builtin_int)),
1465 (bfd_signed_vma) lower,
1466 (bfd_signed_vma) upper,
1467 FALSE);
1468 }
1469 break;
1470
1471 case 'E':
1472 /* Simple enumeration. */
1473 {
1474 bfd_vma size;
1475 unsigned int alloc;
1476 const char **names;
1477 unsigned int c;
1478 bfd_signed_vma *vals;
1479 unsigned int i;
1480
1481 if (! ieee_read_number (info, pp, &size))
1482 return FALSE;
1483 /* FIXME: we ignore the enumeration size. */
1484
1485 alloc = 10;
1486 names = (const char **) xmalloc (alloc * sizeof *names);
1487 memset (names, 0, alloc * sizeof *names);
1488 c = 0;
1489 while (1)
1490 {
1491 const char *name;
1492 unsigned long namlen;
1493 bfd_boolean present;
1494
1495 if (! ieee_read_optional_id (info, pp, &name, &namlen, &present))
1496 return FALSE;
1497 if (! present)
1498 break;
1499
1500 if (c + 1 >= alloc)
1501 {
1502 alloc += 10;
1503 names = ((const char **)
1504 xrealloc (names, alloc * sizeof *names));
1505 }
1506
1507 names[c] = savestring (name, namlen);
1508 if (names[c] == NULL)
1509 return FALSE;
1510 ++c;
1511 }
1512
1513 names[c] = NULL;
1514
1515 vals = (bfd_signed_vma *) xmalloc (c * sizeof *vals);
1516 for (i = 0; i < c; i++)
1517 vals[i] = i;
1518
1519 type = debug_make_enum_type (dhandle, names, vals);
1520 tag = TRUE;
1521 }
1522 break;
1523
1524 case 'G':
1525 /* Struct with bit fields. */
1526 {
1527 bfd_vma size;
1528 unsigned int alloc;
1529 debug_field *fields;
1530 unsigned int c;
1531
1532 if (! ieee_read_number (info, pp, &size))
1533 return FALSE;
1534
1535 alloc = 10;
1536 fields = (debug_field *) xmalloc (alloc * sizeof *fields);
1537 c = 0;
1538 while (1)
1539 {
1540 const char *name;
1541 unsigned long namlen;
1542 bfd_boolean present;
1543 debug_type ftype;
1544 bfd_vma bitpos, bitsize;
1545
1546 if (! ieee_read_optional_id (info, pp, &name, &namlen, &present))
1547 return FALSE;
1548 if (! present)
1549 break;
1550 if (! ieee_read_type_index (info, pp, &ftype)
1551 || ! ieee_read_number (info, pp, &bitpos)
1552 || ! ieee_read_number (info, pp, &bitsize))
1553 return FALSE;
1554
1555 if (c + 1 >= alloc)
1556 {
1557 alloc += 10;
1558 fields = ((debug_field *)
1559 xrealloc (fields, alloc * sizeof *fields));
1560 }
1561
1562 fields[c] = debug_make_field (dhandle, savestring (name, namlen),
1563 ftype, bitpos, bitsize,
1564 DEBUG_VISIBILITY_PUBLIC);
1565 if (fields[c] == NULL)
1566 return FALSE;
1567 ++c;
1568 }
1569
1570 fields[c] = NULL;
1571
1572 type = debug_make_struct_type (dhandle, TRUE, size, fields);
1573 tag = TRUE;
1574 }
1575 break;
1576
1577 case 'N':
1578 /* Enumeration. */
1579 {
1580 unsigned int alloc;
1581 const char **names;
1582 bfd_signed_vma *vals;
1583 unsigned int c;
1584
1585 alloc = 10;
1586 names = (const char **) xmalloc (alloc * sizeof *names);
1587 vals = (bfd_signed_vma *) xmalloc (alloc * sizeof *names);
1588 c = 0;
1589 while (1)
1590 {
1591 const char *name;
1592 unsigned long namlen;
1593 bfd_boolean present;
1594 bfd_vma val;
1595
1596 if (! ieee_read_optional_id (info, pp, &name, &namlen, &present))
1597 return FALSE;
1598 if (! present)
1599 break;
1600 if (! ieee_read_number (info, pp, &val))
1601 return FALSE;
1602
1603 /* If the length of the name is zero, then the value is
1604 actually the size of the enum. We ignore this
1605 information. FIXME. */
1606 if (namlen == 0)
1607 continue;
1608
1609 if (c + 1 >= alloc)
1610 {
1611 alloc += 10;
1612 names = ((const char **)
1613 xrealloc (names, alloc * sizeof *names));
1614 vals = ((bfd_signed_vma *)
1615 xrealloc (vals, alloc * sizeof *vals));
1616 }
1617
1618 names[c] = savestring (name, namlen);
1619 if (names[c] == NULL)
1620 return FALSE;
1621 vals[c] = (bfd_signed_vma) val;
1622 ++c;
1623 }
1624
1625 names[c] = NULL;
1626
1627 type = debug_make_enum_type (dhandle, names, vals);
1628 tag = TRUE;
1629 }
1630 break;
1631
1632 case 'O': /* Small pointer. We don't distinguish small and large
1633 pointers. FIXME. */
1634 case 'P': /* Large pointer. */
1635 {
1636 debug_type t;
1637
1638 if (! ieee_read_type_index (info, pp, &t))
1639 return FALSE;
1640 type = debug_make_pointer_type (dhandle, t);
1641 }
1642 break;
1643
1644 case 'R':
1645 /* Range. */
1646 {
1647 bfd_vma low, high, signedp, size;
1648
1649 if (! ieee_read_number (info, pp, &low)
1650 || ! ieee_read_number (info, pp, &high)
1651 || ! ieee_read_number (info, pp, &signedp)
1652 || ! ieee_read_number (info, pp, &size))
1653 return FALSE;
1654
1655 type = debug_make_range_type (dhandle,
1656 debug_make_int_type (dhandle, size,
1657 ! signedp),
1658 (bfd_signed_vma) low,
1659 (bfd_signed_vma) high);
1660 }
1661 break;
1662
1663 case 'S': /* Struct. */
1664 case 'U': /* Union. */
1665 {
1666 bfd_vma size;
1667 unsigned int alloc;
1668 debug_field *fields;
1669 unsigned int c;
1670
1671 if (! ieee_read_number (info, pp, &size))
1672 return FALSE;
1673
1674 alloc = 10;
1675 fields = (debug_field *) xmalloc (alloc * sizeof *fields);
1676 c = 0;
1677 while (1)
1678 {
1679 const char *name;
1680 unsigned long namlen;
1681 bfd_boolean present;
1682 bfd_vma tindx;
1683 bfd_vma offset;
1684 debug_type ftype;
1685 bfd_vma bitsize;
1686
1687 if (! ieee_read_optional_id (info, pp, &name, &namlen, &present))
1688 return FALSE;
1689 if (! present)
1690 break;
1691 if (! ieee_read_number (info, pp, &tindx)
1692 || ! ieee_read_number (info, pp, &offset))
1693 return FALSE;
1694
1695 if (tindx < 256)
1696 {
1697 ftype = ieee_builtin_type (info, ty_code_start, tindx);
1698 bitsize = 0;
1699 offset *= 8;
1700 }
1701 else
1702 {
1703 struct ieee_type *t;
1704
1705 tindx -= 256;
1706 if (! ieee_alloc_type (info, tindx, TRUE))
1707 return FALSE;
1708 t = info->types.types + tindx;
1709 ftype = t->type;
1710 bitsize = t->bitsize;
1711 if (bitsize == 0)
1712 offset *= 8;
1713 }
1714
1715 if (c + 1 >= alloc)
1716 {
1717 alloc += 10;
1718 fields = ((debug_field *)
1719 xrealloc (fields, alloc * sizeof *fields));
1720 }
1721
1722 fields[c] = debug_make_field (dhandle, savestring (name, namlen),
1723 ftype, offset, bitsize,
1724 DEBUG_VISIBILITY_PUBLIC);
1725 if (fields[c] == NULL)
1726 return FALSE;
1727 ++c;
1728 }
1729
1730 fields[c] = NULL;
1731
1732 type = debug_make_struct_type (dhandle, tc == 'S', size, fields);
1733 tag = TRUE;
1734 }
1735 break;
1736
1737 case 'T':
1738 /* Typedef. */
1739 if (! ieee_read_type_index (info, pp, &type))
1740 return FALSE;
1741 typdef = TRUE;
1742 break;
1743
1744 case 'X':
1745 /* Procedure. FIXME: This is an extern declaration, which we
1746 have no way of representing. */
1747 {
1748 bfd_vma attr;
1749 debug_type rtype;
1750 bfd_vma nargs;
1751 bfd_boolean present;
1752 struct ieee_var *pv;
1753
1754 /* FIXME: We ignore the attribute and the argument names. */
1755
1756 if (! ieee_read_number (info, pp, &attr)
1757 || ! ieee_read_type_index (info, pp, &rtype)
1758 || ! ieee_read_number (info, pp, &nargs))
1759 return FALSE;
1760 do
1761 {
1762 const char *name;
1763 unsigned long namlen;
1764
1765 if (! ieee_read_optional_id (info, pp, &name, &namlen, &present))
1766 return FALSE;
1767 }
1768 while (present);
1769
1770 pv = info->vars.vars + varindx;
1771 pv->kind = IEEE_EXTERNAL;
1772 if (pv->namlen > 0
1773 && debug_get_type_kind (dhandle, rtype) == DEBUG_KIND_POINTER)
1774 {
1775 /* Set up the return type as an indirect type pointing to
1776 the variable slot, so that we can change it to a
1777 reference later if appropriate. */
1778 pv->pslot = (debug_type *) xmalloc (sizeof *pv->pslot);
1779 *pv->pslot = rtype;
1780 rtype = debug_make_indirect_type (dhandle, pv->pslot,
1781 (const char *) NULL);
1782 }
1783
1784 type = debug_make_function_type (dhandle, rtype, (debug_type *) NULL,
1785 FALSE);
1786 }
1787 break;
1788
1789 case 'V':
1790 /* Void. This is not documented, but the MRI compiler emits it. */
1791 type = debug_make_void_type (dhandle);
1792 break;
1793
1794 case 'Z':
1795 /* Array with 0 lower bound. */
1796 {
1797 debug_type etype;
1798 bfd_vma high;
1799
1800 if (! ieee_read_type_index (info, pp, &etype)
1801 || ! ieee_read_number (info, pp, &high))
1802 return FALSE;
1803
1804 type = debug_make_array_type (dhandle, etype,
1805 ieee_builtin_type (info, ty_code_start,
1806 ((unsigned int)
1807 builtin_int)),
1808 0, (bfd_signed_vma) high, FALSE);
1809 }
1810 break;
1811
1812 case 'c': /* Complex. */
1813 case 'd': /* Double complex. */
1814 {
1815 const char *name;
1816 unsigned long namlen;
1817
1818 /* FIXME: I don't know what the name means. */
1819
1820 if (! ieee_read_id (info, pp, &name, &namlen))
1821 return FALSE;
1822
1823 type = debug_make_complex_type (dhandle, tc == 'c' ? 4 : 8);
1824 }
1825 break;
1826
1827 case 'f':
1828 /* Pascal file name. FIXME. */
1829 ieee_error (info, ty_code_start, _("Pascal file name not supported"));
1830 return FALSE;
1831
1832 case 'g':
1833 /* Bitfield type. */
1834 {
1835 bfd_vma signedp, bitsize, dummy;
1836 const bfd_byte *hold;
1837 bfd_boolean present;
1838
1839 if (! ieee_read_number (info, pp, &signedp)
1840 || ! ieee_read_number (info, pp, &bitsize))
1841 return FALSE;
1842
1843 /* I think the documentation says that there is a type index,
1844 but some actual files do not have one. */
1845 hold = *pp;
1846 if (! ieee_read_optional_number (info, pp, &dummy, &present))
1847 return FALSE;
1848 if (! present)
1849 {
1850 /* FIXME: This is just a guess. */
1851 type = debug_make_int_type (dhandle, 4,
1852 signedp ? FALSE : TRUE);
1853 }
1854 else
1855 {
1856 *pp = hold;
1857 if (! ieee_read_type_index (info, pp, &type))
1858 return FALSE;
1859 }
1860 type_bitsize = bitsize;
1861 }
1862 break;
1863
1864 case 'n':
1865 /* Qualifier. */
1866 {
1867 bfd_vma kind;
1868 debug_type t;
1869
1870 if (! ieee_read_number (info, pp, &kind)
1871 || ! ieee_read_type_index (info, pp, &t))
1872 return FALSE;
1873
1874 switch (kind)
1875 {
1876 default:
1877 ieee_error (info, ty_start, _("unsupported qualifier"));
1878 return FALSE;
1879
1880 case 1:
1881 type = debug_make_const_type (dhandle, t);
1882 break;
1883
1884 case 2:
1885 type = debug_make_volatile_type (dhandle, t);
1886 break;
1887 }
1888 }
1889 break;
1890
1891 case 's':
1892 /* Set. */
1893 {
1894 bfd_vma size;
1895 debug_type etype;
1896
1897 if (! ieee_read_number (info, pp, &size)
1898 || ! ieee_read_type_index (info, pp, &etype))
1899 return FALSE;
1900
1901 /* FIXME: We ignore the size. */
1902
1903 type = debug_make_set_type (dhandle, etype, FALSE);
1904 }
1905 break;
1906
1907 case 'x':
1908 /* Procedure with compiler dependencies. */
1909 {
1910 struct ieee_var *pv;
1911 bfd_vma attr, frame_type, push_mask, nargs, level, father;
1912 debug_type rtype;
1913 debug_type *arg_types;
1914 bfd_boolean varargs;
1915 bfd_boolean present;
1916
1917 /* FIXME: We ignore some of this information. */
1918
1919 pv = info->vars.vars + varindx;
1920
1921 if (! ieee_read_number (info, pp, &attr)
1922 || ! ieee_read_number (info, pp, &frame_type)
1923 || ! ieee_read_number (info, pp, &push_mask)
1924 || ! ieee_read_type_index (info, pp, &rtype)
1925 || ! ieee_read_number (info, pp, &nargs))
1926 return FALSE;
1927 if (nargs == (bfd_vma) -1)
1928 {
1929 arg_types = NULL;
1930 varargs = FALSE;
1931 }
1932 else
1933 {
1934 unsigned int i;
1935
1936 arg_types = ((debug_type *)
1937 xmalloc ((nargs + 1) * sizeof *arg_types));
1938 for (i = 0; i < nargs; i++)
1939 if (! ieee_read_type_index (info, pp, arg_types + i))
1940 return FALSE;
1941
1942 /* If the last type is pointer to void, this is really a
1943 varargs function. */
1944 varargs = FALSE;
1945 if (nargs > 0)
1946 {
1947 debug_type last;
1948
1949 last = arg_types[nargs - 1];
1950 if (debug_get_type_kind (dhandle, last) == DEBUG_KIND_POINTER
1951 && (debug_get_type_kind (dhandle,
1952 debug_get_target_type (dhandle,
1953 last))
1954 == DEBUG_KIND_VOID))
1955 {
1956 --nargs;
1957 varargs = TRUE;
1958 }
1959 }
1960
1961 /* If there are any pointer arguments, turn them into
1962 indirect types in case we later need to convert them to
1963 reference types. */
1964 for (i = 0; i < nargs; i++)
1965 {
1966 if (debug_get_type_kind (dhandle, arg_types[i])
1967 == DEBUG_KIND_POINTER)
1968 {
1969 if (arg_slots == NULL)
1970 {
1971 arg_slots = ((debug_type *)
1972 xmalloc (nargs * sizeof *arg_slots));
1973 memset (arg_slots, 0, nargs * sizeof *arg_slots);
1974 }
1975 arg_slots[i] = arg_types[i];
1976 arg_types[i] =
1977 debug_make_indirect_type (dhandle,
1978 arg_slots + i,
1979 (const char *) NULL);
1980 }
1981 }
1982
1983 arg_types[nargs] = DEBUG_TYPE_NULL;
1984 }
1985 if (! ieee_read_number (info, pp, &level)
1986 || ! ieee_read_optional_number (info, pp, &father, &present))
1987 return FALSE;
1988
1989 /* We can't distinguish between a global function and a static
1990 function. */
1991 pv->kind = IEEE_FUNCTION;
1992
1993 if (pv->namlen > 0
1994 && debug_get_type_kind (dhandle, rtype) == DEBUG_KIND_POINTER)
1995 {
1996 /* Set up the return type as an indirect type pointing to
1997 the variable slot, so that we can change it to a
1998 reference later if appropriate. */
1999 pv->pslot = (debug_type *) xmalloc (sizeof *pv->pslot);
2000 *pv->pslot = rtype;
2001 rtype = debug_make_indirect_type (dhandle, pv->pslot,
2002 (const char *) NULL);
2003 }
2004
2005 type = debug_make_function_type (dhandle, rtype, arg_types, varargs);
2006 }
2007 break;
2008 }
2009
2010 /* Record the type in the table. */
2011
2012 if (type == DEBUG_TYPE_NULL)
2013 return FALSE;
2014
2015 info->vars.vars[varindx].type = type;
2016
2017 if ((tag || typdef)
2018 && info->vars.vars[varindx].namlen > 0)
2019 {
2020 const char *name;
2021
2022 name = savestring (info->vars.vars[varindx].name,
2023 info->vars.vars[varindx].namlen);
2024 if (typdef)
2025 type = debug_name_type (dhandle, name, type);
2026 else if (tc == 'E' || tc == 'N')
2027 type = debug_tag_type (dhandle, name, type);
2028 else
2029 {
2030 struct ieee_tag *it;
2031
2032 /* We must allocate all struct tags as indirect types, so
2033 that if we later see a definition of the tag as a C++
2034 record we can update the indirect slot and automatically
2035 change all the existing references. */
2036 it = (struct ieee_tag *) xmalloc (sizeof *it);
2037 memset (it, 0, sizeof *it);
2038 it->next = info->tags;
2039 info->tags = it;
2040 it->name = name;
2041 it->slot = type;
2042
2043 type = debug_make_indirect_type (dhandle, &it->slot, name);
2044 type = debug_tag_type (dhandle, name, type);
2045
2046 it->type = type;
2047 }
2048 if (type == NULL)
2049 return FALSE;
2050 }
2051
2052 info->types.types[typeindx].type = type;
2053 info->types.types[typeindx].arg_slots = arg_slots;
2054 info->types.types[typeindx].bitsize = type_bitsize;
2055
2056 /* We may have already allocated type as an indirect type pointing
2057 to slot. It does no harm to replace the indirect type with the
2058 real type. Filling in slot as well handles the indirect types
2059 which are already hanging around. */
2060 if (info->types.types[typeindx].pslot != NULL)
2061 *info->types.types[typeindx].pslot = type;
2062
2063 return TRUE;
2064 }
2065
2066 /* Parse an ATN record. */
2067
2068 static bfd_boolean
2069 parse_ieee_atn (struct ieee_info *info, const bfd_byte **pp)
2070 {
2071 const bfd_byte *atn_start, *atn_code_start;
2072 bfd_vma varindx;
2073 struct ieee_var *pvar;
2074 debug_type type;
2075 bfd_vma atn_code;
2076 void *dhandle;
2077 bfd_vma v, v2, v3, v4, v5;
2078 const char *name;
2079 unsigned long namlen;
2080 char *namcopy;
2081 bfd_boolean present;
2082 int blocktype;
2083
2084 atn_start = *pp;
2085
2086 if (! ieee_read_number (info, pp, &varindx)
2087 || ! ieee_read_type_index (info, pp, &type))
2088 return FALSE;
2089
2090 atn_code_start = *pp;
2091
2092 if (! ieee_read_number (info, pp, &atn_code))
2093 return FALSE;
2094
2095 if (varindx == 0)
2096 {
2097 pvar = NULL;
2098 name = "";
2099 namlen = 0;
2100 }
2101 else if (varindx < 32)
2102 {
2103 /* The MRI compiler reportedly sometimes emits variable lifetime
2104 information for a register. We just ignore it. */
2105 if (atn_code == 9)
2106 return ieee_read_number (info, pp, &v);
2107
2108 ieee_error (info, atn_start, _("illegal variable index"));
2109 return FALSE;
2110 }
2111 else
2112 {
2113 varindx -= 32;
2114 if (varindx >= info->vars.alloc
2115 || info->vars.vars[varindx].name == NULL)
2116 {
2117 /* The MRI compiler or linker sometimes omits the NN record
2118 for a pmisc record. */
2119 if (atn_code == 62)
2120 {
2121 if (varindx >= info->vars.alloc)
2122 {
2123 unsigned int alloc;
2124
2125 alloc = info->vars.alloc;
2126 if (alloc == 0)
2127 alloc = 4;
2128 while (varindx >= alloc)
2129 alloc *= 2;
2130 info->vars.vars = ((struct ieee_var *)
2131 xrealloc (info->vars.vars,
2132 (alloc
2133 * sizeof *info->vars.vars)));
2134 memset (info->vars.vars + info->vars.alloc, 0,
2135 ((alloc - info->vars.alloc)
2136 * sizeof *info->vars.vars));
2137 info->vars.alloc = alloc;
2138 }
2139
2140 pvar = info->vars.vars + varindx;
2141 pvar->name = "";
2142 pvar->namlen = 0;
2143 }
2144 else
2145 {
2146 ieee_error (info, atn_start, _("undefined variable in ATN"));
2147 return FALSE;
2148 }
2149 }
2150
2151 pvar = info->vars.vars + varindx;
2152
2153 pvar->type = type;
2154
2155 name = pvar->name;
2156 namlen = pvar->namlen;
2157 }
2158
2159 dhandle = info->dhandle;
2160
2161 /* If we are going to call debug_record_variable with a pointer
2162 type, change the type to an indirect type so that we can later
2163 change it to a reference type if we encounter a C++ pmisc 'R'
2164 record. */
2165 if (pvar != NULL
2166 && type != DEBUG_TYPE_NULL
2167 && debug_get_type_kind (dhandle, type) == DEBUG_KIND_POINTER)
2168 {
2169 switch (atn_code)
2170 {
2171 case 1:
2172 case 2:
2173 case 3:
2174 case 5:
2175 case 8:
2176 case 10:
2177 pvar->pslot = (debug_type *) xmalloc (sizeof *pvar->pslot);
2178 *pvar->pslot = type;
2179 type = debug_make_indirect_type (dhandle, pvar->pslot,
2180 (const char *) NULL);
2181 pvar->type = type;
2182 break;
2183 }
2184 }
2185
2186 switch (atn_code)
2187 {
2188 default:
2189 ieee_error (info, atn_code_start, _("unknown ATN type"));
2190 return FALSE;
2191
2192 case 1:
2193 /* Automatic variable. */
2194 if (! ieee_read_number (info, pp, &v))
2195 return FALSE;
2196 namcopy = savestring (name, namlen);
2197 if (type == NULL)
2198 type = debug_make_void_type (dhandle);
2199 if (pvar != NULL)
2200 pvar->kind = IEEE_LOCAL;
2201 return debug_record_variable (dhandle, namcopy, type, DEBUG_LOCAL, v);
2202
2203 case 2:
2204 /* Register variable. */
2205 if (! ieee_read_number (info, pp, &v))
2206 return FALSE;
2207 namcopy = savestring (name, namlen);
2208 if (type == NULL)
2209 type = debug_make_void_type (dhandle);
2210 if (pvar != NULL)
2211 pvar->kind = IEEE_LOCAL;
2212 return debug_record_variable (dhandle, namcopy, type, DEBUG_REGISTER,
2213 ieee_regno_to_genreg (info->abfd, v));
2214
2215 case 3:
2216 /* Static variable. */
2217 if (! ieee_require_asn (info, pp, &v))
2218 return FALSE;
2219 namcopy = savestring (name, namlen);
2220 if (type == NULL)
2221 type = debug_make_void_type (dhandle);
2222 if (info->blockstack.bsp <= info->blockstack.stack)
2223 blocktype = 0;
2224 else
2225 blocktype = info->blockstack.bsp[-1].kind;
2226 if (pvar != NULL)
2227 {
2228 if (blocktype == 4 || blocktype == 6)
2229 pvar->kind = IEEE_LOCAL;
2230 else
2231 pvar->kind = IEEE_STATIC;
2232 }
2233 return debug_record_variable (dhandle, namcopy, type,
2234 (blocktype == 4 || blocktype == 6
2235 ? DEBUG_LOCAL_STATIC
2236 : DEBUG_STATIC),
2237 v);
2238
2239 case 4:
2240 /* External function. We don't currently record these. FIXME. */
2241 if (pvar != NULL)
2242 pvar->kind = IEEE_EXTERNAL;
2243 return TRUE;
2244
2245 case 5:
2246 /* External variable. We don't currently record these. FIXME. */
2247 if (pvar != NULL)
2248 pvar->kind = IEEE_EXTERNAL;
2249 return TRUE;
2250
2251 case 7:
2252 if (! ieee_read_number (info, pp, &v)
2253 || ! ieee_read_number (info, pp, &v2)
2254 || ! ieee_read_optional_number (info, pp, &v3, &present))
2255 return FALSE;
2256 if (present)
2257 {
2258 if (! ieee_read_optional_number (info, pp, &v4, &present))
2259 return FALSE;
2260 }
2261
2262 /* We just ignore the two optional fields in v3 and v4, since
2263 they are not defined. */
2264
2265 if (! ieee_require_asn (info, pp, &v3))
2266 return FALSE;
2267
2268 /* We have no way to record the column number. FIXME. */
2269
2270 return debug_record_line (dhandle, v, v3);
2271
2272 case 8:
2273 /* Global variable. */
2274 if (! ieee_require_asn (info, pp, &v))
2275 return FALSE;
2276 namcopy = savestring (name, namlen);
2277 if (type == NULL)
2278 type = debug_make_void_type (dhandle);
2279 if (pvar != NULL)
2280 pvar->kind = IEEE_GLOBAL;
2281 return debug_record_variable (dhandle, namcopy, type, DEBUG_GLOBAL, v);
2282
2283 case 9:
2284 /* Variable lifetime information. */
2285 if (! ieee_read_number (info, pp, &v))
2286 return FALSE;
2287
2288 /* We have no way to record this information. FIXME. */
2289 return TRUE;
2290
2291 case 10:
2292 /* Locked register. The spec says that there are two required
2293 fields, but at least on occasion the MRI compiler only emits
2294 one. */
2295 if (! ieee_read_number (info, pp, &v)
2296 || ! ieee_read_optional_number (info, pp, &v2, &present))
2297 return FALSE;
2298
2299 /* I think this means a variable that is both in a register and
2300 a frame slot. We ignore the frame slot. FIXME. */
2301
2302 namcopy = savestring (name, namlen);
2303 if (type == NULL)
2304 type = debug_make_void_type (dhandle);
2305 if (pvar != NULL)
2306 pvar->kind = IEEE_LOCAL;
2307 return debug_record_variable (dhandle, namcopy, type, DEBUG_REGISTER, v);
2308
2309 case 11:
2310 /* Reserved for FORTRAN common. */
2311 ieee_error (info, atn_code_start, _("unsupported ATN11"));
2312
2313 /* Return TRUE to keep going. */
2314 return TRUE;
2315
2316 case 12:
2317 /* Based variable. */
2318 v3 = 0;
2319 v4 = 0x80;
2320 v5 = 0;
2321 if (! ieee_read_number (info, pp, &v)
2322 || ! ieee_read_number (info, pp, &v2)
2323 || ! ieee_read_optional_number (info, pp, &v3, &present))
2324 return FALSE;
2325 if (present)
2326 {
2327 if (! ieee_read_optional_number (info, pp, &v4, &present))
2328 return FALSE;
2329 if (present)
2330 {
2331 if (! ieee_read_optional_number (info, pp, &v5, &present))
2332 return FALSE;
2333 }
2334 }
2335
2336 /* We have no way to record this information. FIXME. */
2337
2338 ieee_error (info, atn_code_start, _("unsupported ATN12"));
2339
2340 /* Return TRUE to keep going. */
2341 return TRUE;
2342
2343 case 16:
2344 /* Constant. The description of this that I have is ambiguous,
2345 so I'm not going to try to implement it. */
2346 if (! ieee_read_number (info, pp, &v)
2347 || ! ieee_read_optional_number (info, pp, &v2, &present))
2348 return FALSE;
2349 if (present)
2350 {
2351 if (! ieee_read_optional_number (info, pp, &v2, &present))
2352 return FALSE;
2353 if (present)
2354 {
2355 if (! ieee_read_optional_id (info, pp, &name, &namlen, &present))
2356 return FALSE;
2357 }
2358 }
2359
2360 if ((ieee_record_enum_type) **pp == ieee_e2_first_byte_enum)
2361 {
2362 if (! ieee_require_asn (info, pp, &v3))
2363 return FALSE;
2364 }
2365
2366 return TRUE;
2367
2368 case 19:
2369 /* Static variable from assembler. */
2370 v2 = 0;
2371 if (! ieee_read_number (info, pp, &v)
2372 || ! ieee_read_optional_number (info, pp, &v2, &present)
2373 || ! ieee_require_asn (info, pp, &v3))
2374 return FALSE;
2375 namcopy = savestring (name, namlen);
2376 /* We don't really handle this correctly. FIXME. */
2377 return debug_record_variable (dhandle, namcopy,
2378 debug_make_void_type (dhandle),
2379 v2 != 0 ? DEBUG_GLOBAL : DEBUG_STATIC,
2380 v3);
2381
2382 case 62:
2383 /* Procedure miscellaneous information. */
2384 case 63:
2385 /* Variable miscellaneous information. */
2386 case 64:
2387 /* Module miscellaneous information. */
2388 if (! ieee_read_number (info, pp, &v)
2389 || ! ieee_read_number (info, pp, &v2)
2390 || ! ieee_read_optional_id (info, pp, &name, &namlen, &present))
2391 return FALSE;
2392
2393 if (atn_code == 62 && v == 80)
2394 {
2395 if (present)
2396 {
2397 ieee_error (info, atn_code_start,
2398 _("unexpected string in C++ misc"));
2399 return FALSE;
2400 }
2401 return ieee_read_cxx_misc (info, pp, v2);
2402 }
2403
2404 /* We just ignore all of this stuff. FIXME. */
2405
2406 for (; v2 > 0; --v2)
2407 {
2408 switch ((ieee_record_enum_type) **pp)
2409 {
2410 default:
2411 ieee_error (info, *pp, _("bad misc record"));
2412 return FALSE;
2413
2414 case ieee_at_record_enum:
2415 if (! ieee_require_atn65 (info, pp, &name, &namlen))
2416 return FALSE;
2417 break;
2418
2419 case ieee_e2_first_byte_enum:
2420 if (! ieee_require_asn (info, pp, &v3))
2421 return FALSE;
2422 break;
2423 }
2424 }
2425
2426 return TRUE;
2427 }
2428
2429 /*NOTREACHED*/
2430 }
2431
2432 /* Handle C++ debugging miscellaneous records. This is called for
2433 procedure miscellaneous records of type 80. */
2434
2435 static bfd_boolean
2436 ieee_read_cxx_misc (struct ieee_info *info, const bfd_byte **pp,
2437 unsigned long count)
2438 {
2439 const bfd_byte *start;
2440 bfd_vma category;
2441
2442 start = *pp;
2443
2444 /* Get the category of C++ misc record. */
2445 if (! ieee_require_asn (info, pp, &category))
2446 return FALSE;
2447 --count;
2448
2449 switch (category)
2450 {
2451 default:
2452 ieee_error (info, start, _("unrecognized C++ misc record"));
2453 return FALSE;
2454
2455 case 'T':
2456 if (! ieee_read_cxx_class (info, pp, count))
2457 return FALSE;
2458 break;
2459
2460 case 'M':
2461 {
2462 bfd_vma flags;
2463 const char *name;
2464 unsigned long namlen;
2465
2466 /* The IEEE spec indicates that the 'M' record only has a
2467 flags field. The MRI compiler also emits the name of the
2468 function. */
2469
2470 if (! ieee_require_asn (info, pp, &flags))
2471 return FALSE;
2472 if (*pp < info->pend
2473 && (ieee_record_enum_type) **pp == ieee_at_record_enum)
2474 {
2475 if (! ieee_require_atn65 (info, pp, &name, &namlen))
2476 return FALSE;
2477 }
2478
2479 /* This is emitted for method functions, but I don't think we
2480 care very much. It might help if it told us useful
2481 information like the class with which this function is
2482 associated, but it doesn't, so it isn't helpful. */
2483 }
2484 break;
2485
2486 case 'B':
2487 if (! ieee_read_cxx_defaults (info, pp, count))
2488 return FALSE;
2489 break;
2490
2491 case 'z':
2492 {
2493 const char *name, *mangled, *class;
2494 unsigned long namlen, mangledlen, classlen;
2495 bfd_vma control;
2496
2497 /* Pointer to member. */
2498
2499 if (! ieee_require_atn65 (info, pp, &name, &namlen)
2500 || ! ieee_require_atn65 (info, pp, &mangled, &mangledlen)
2501 || ! ieee_require_atn65 (info, pp, &class, &classlen)
2502 || ! ieee_require_asn (info, pp, &control))
2503 return FALSE;
2504
2505 /* FIXME: We should now track down name and change its type. */
2506 }
2507 break;
2508
2509 case 'R':
2510 if (! ieee_read_reference (info, pp))
2511 return FALSE;
2512 break;
2513 }
2514
2515 return TRUE;
2516 }
2517
2518 /* Read a C++ class definition. This is a pmisc type 80 record of
2519 category 'T'. */
2520
2521 static bfd_boolean
2522 ieee_read_cxx_class (struct ieee_info *info, const bfd_byte **pp,
2523 unsigned long count)
2524 {
2525 const bfd_byte *start;
2526 bfd_vma class;
2527 const char *tag;
2528 unsigned long taglen;
2529 struct ieee_tag *it;
2530 void *dhandle;
2531 debug_field *fields;
2532 unsigned int field_count, field_alloc;
2533 debug_baseclass *baseclasses;
2534 unsigned int baseclasses_count, baseclasses_alloc;
2535 const debug_field *structfields;
2536 struct ieee_method
2537 {
2538 const char *name;
2539 unsigned long namlen;
2540 debug_method_variant *variants;
2541 unsigned count;
2542 unsigned int alloc;
2543 } *methods;
2544 unsigned int methods_count, methods_alloc;
2545 debug_type vptrbase;
2546 bfd_boolean ownvptr;
2547 debug_method *dmethods;
2548
2549 start = *pp;
2550
2551 if (! ieee_require_asn (info, pp, &class))
2552 return FALSE;
2553 --count;
2554
2555 if (! ieee_require_atn65 (info, pp, &tag, &taglen))
2556 return FALSE;
2557 --count;
2558
2559 /* Find the C struct with this name. */
2560 for (it = info->tags; it != NULL; it = it->next)
2561 if (it->name[0] == tag[0]
2562 && strncmp (it->name, tag, taglen) == 0
2563 && strlen (it->name) == taglen)
2564 break;
2565 if (it == NULL)
2566 {
2567 ieee_error (info, start, _("undefined C++ object"));
2568 return FALSE;
2569 }
2570
2571 dhandle = info->dhandle;
2572
2573 fields = NULL;
2574 field_count = 0;
2575 field_alloc = 0;
2576 baseclasses = NULL;
2577 baseclasses_count = 0;
2578 baseclasses_alloc = 0;
2579 methods = NULL;
2580 methods_count = 0;
2581 methods_alloc = 0;
2582 vptrbase = DEBUG_TYPE_NULL;
2583 ownvptr = FALSE;
2584
2585 structfields = debug_get_fields (dhandle, it->type);
2586
2587 while (count > 0)
2588 {
2589 bfd_vma id;
2590 const bfd_byte *spec_start;
2591
2592 spec_start = *pp;
2593
2594 if (! ieee_require_asn (info, pp, &id))
2595 return FALSE;
2596 --count;
2597
2598 switch (id)
2599 {
2600 default:
2601 ieee_error (info, spec_start, _("unrecognized C++ object spec"));
2602 return FALSE;
2603
2604 case 'b':
2605 {
2606 bfd_vma flags, cinline;
2607 const char *basename, *fieldname;
2608 unsigned long baselen, fieldlen;
2609 char *basecopy;
2610 debug_type basetype;
2611 bfd_vma bitpos;
2612 bfd_boolean virtualp;
2613 enum debug_visibility visibility;
2614 debug_baseclass baseclass;
2615
2616 /* This represents a base or friend class. */
2617
2618 if (! ieee_require_asn (info, pp, &flags)
2619 || ! ieee_require_atn65 (info, pp, &basename, &baselen)
2620 || ! ieee_require_asn (info, pp, &cinline)
2621 || ! ieee_require_atn65 (info, pp, &fieldname, &fieldlen))
2622 return FALSE;
2623 count -= 4;
2624
2625 /* We have no way of recording friend information, so we
2626 just ignore it. */
2627 if ((flags & BASEFLAGS_FRIEND) != 0)
2628 break;
2629
2630 /* I assume that either all of the members of the
2631 baseclass are included in the object, starting at the
2632 beginning of the object, or that none of them are
2633 included. */
2634
2635 if ((fieldlen == 0) == (cinline == 0))
2636 {
2637 ieee_error (info, start, _("unsupported C++ object type"));
2638 return FALSE;
2639 }
2640
2641 basecopy = savestring (basename, baselen);
2642 basetype = debug_find_tagged_type (dhandle, basecopy,
2643 DEBUG_KIND_ILLEGAL);
2644 free (basecopy);
2645 if (basetype == DEBUG_TYPE_NULL)
2646 {
2647 ieee_error (info, start, _("C++ base class not defined"));
2648 return FALSE;
2649 }
2650
2651 if (fieldlen == 0)
2652 bitpos = 0;
2653 else
2654 {
2655 const debug_field *pf;
2656
2657 if (structfields == NULL)
2658 {
2659 ieee_error (info, start, _("C++ object has no fields"));
2660 return FALSE;
2661 }
2662
2663 for (pf = structfields; *pf != DEBUG_FIELD_NULL; pf++)
2664 {
2665 const char *fname;
2666
2667 fname = debug_get_field_name (dhandle, *pf);
2668 if (fname == NULL)
2669 return FALSE;
2670 if (fname[0] == fieldname[0]
2671 && strncmp (fname, fieldname, fieldlen) == 0
2672 && strlen (fname) == fieldlen)
2673 break;
2674 }
2675 if (*pf == DEBUG_FIELD_NULL)
2676 {
2677 ieee_error (info, start,
2678 _("C++ base class not found in container"));
2679 return FALSE;
2680 }
2681
2682 bitpos = debug_get_field_bitpos (dhandle, *pf);
2683 }
2684
2685 if ((flags & BASEFLAGS_VIRTUAL) != 0)
2686 virtualp = TRUE;
2687 else
2688 virtualp = FALSE;
2689 if ((flags & BASEFLAGS_PRIVATE) != 0)
2690 visibility = DEBUG_VISIBILITY_PRIVATE;
2691 else
2692 visibility = DEBUG_VISIBILITY_PUBLIC;
2693
2694 baseclass = debug_make_baseclass (dhandle, basetype, bitpos,
2695 virtualp, visibility);
2696 if (baseclass == DEBUG_BASECLASS_NULL)
2697 return FALSE;
2698
2699 if (baseclasses_count + 1 >= baseclasses_alloc)
2700 {
2701 baseclasses_alloc += 10;
2702 baseclasses = ((debug_baseclass *)
2703 xrealloc (baseclasses,
2704 (baseclasses_alloc
2705 * sizeof *baseclasses)));
2706 }
2707
2708 baseclasses[baseclasses_count] = baseclass;
2709 ++baseclasses_count;
2710 baseclasses[baseclasses_count] = DEBUG_BASECLASS_NULL;
2711 }
2712 break;
2713
2714 case 'd':
2715 {
2716 bfd_vma flags;
2717 const char *fieldname, *mangledname;
2718 unsigned long fieldlen, mangledlen;
2719 char *fieldcopy;
2720 bfd_boolean staticp;
2721 debug_type ftype;
2722 const debug_field *pf = NULL;
2723 enum debug_visibility visibility;
2724 debug_field field;
2725
2726 /* This represents a data member. */
2727
2728 if (! ieee_require_asn (info, pp, &flags)
2729 || ! ieee_require_atn65 (info, pp, &fieldname, &fieldlen)
2730 || ! ieee_require_atn65 (info, pp, &mangledname, &mangledlen))
2731 return FALSE;
2732 count -= 3;
2733
2734 fieldcopy = savestring (fieldname, fieldlen);
2735
2736 staticp = (flags & CXXFLAGS_STATIC) != 0 ? TRUE : FALSE;
2737
2738 if (staticp)
2739 {
2740 struct ieee_var *pv, *pvend;
2741
2742 /* See if we can find a definition for this variable. */
2743 pv = info->vars.vars;
2744 pvend = pv + info->vars.alloc;
2745 for (; pv < pvend; pv++)
2746 if (pv->namlen == mangledlen
2747 && strncmp (pv->name, mangledname, mangledlen) == 0)
2748 break;
2749 if (pv < pvend)
2750 ftype = pv->type;
2751 else
2752 {
2753 /* This can happen if the variable is never used. */
2754 ftype = ieee_builtin_type (info, start,
2755 (unsigned int) builtin_void);
2756 }
2757 }
2758 else
2759 {
2760 unsigned int findx;
2761
2762 if (structfields == NULL)
2763 {
2764 ieee_error (info, start, _("C++ object has no fields"));
2765 return FALSE;
2766 }
2767
2768 for (pf = structfields, findx = 0;
2769 *pf != DEBUG_FIELD_NULL;
2770 pf++, findx++)
2771 {
2772 const char *fname;
2773
2774 fname = debug_get_field_name (dhandle, *pf);
2775 if (fname == NULL)
2776 return FALSE;
2777 if (fname[0] == mangledname[0]
2778 && strncmp (fname, mangledname, mangledlen) == 0
2779 && strlen (fname) == mangledlen)
2780 break;
2781 }
2782 if (*pf == DEBUG_FIELD_NULL)
2783 {
2784 ieee_error (info, start,
2785 _("C++ data member not found in container"));
2786 return FALSE;
2787 }
2788
2789 ftype = debug_get_field_type (dhandle, *pf);
2790
2791 if (debug_get_type_kind (dhandle, ftype) == DEBUG_KIND_POINTER)
2792 {
2793 /* We might need to convert this field into a
2794 reference type later on, so make it an indirect
2795 type. */
2796 if (it->fslots == NULL)
2797 {
2798 unsigned int fcnt;
2799 const debug_field *pfcnt;
2800
2801 fcnt = 0;
2802 for (pfcnt = structfields;
2803 *pfcnt != DEBUG_FIELD_NULL;
2804 pfcnt++)
2805 ++fcnt;
2806 it->fslots = ((debug_type *)
2807 xmalloc (fcnt * sizeof *it->fslots));
2808 memset (it->fslots, 0,
2809 fcnt * sizeof *it->fslots);
2810 }
2811
2812 if (ftype == DEBUG_TYPE_NULL)
2813 return FALSE;
2814 it->fslots[findx] = ftype;
2815 ftype = debug_make_indirect_type (dhandle,
2816 it->fslots + findx,
2817 (const char *) NULL);
2818 }
2819 }
2820 if (ftype == DEBUG_TYPE_NULL)
2821 return FALSE;
2822
2823 switch (flags & CXXFLAGS_VISIBILITY)
2824 {
2825 default:
2826 ieee_error (info, start, _("unknown C++ visibility"));
2827 return FALSE;
2828
2829 case CXXFLAGS_VISIBILITY_PUBLIC:
2830 visibility = DEBUG_VISIBILITY_PUBLIC;
2831 break;
2832
2833 case CXXFLAGS_VISIBILITY_PRIVATE:
2834 visibility = DEBUG_VISIBILITY_PRIVATE;
2835 break;
2836
2837 case CXXFLAGS_VISIBILITY_PROTECTED:
2838 visibility = DEBUG_VISIBILITY_PROTECTED;
2839 break;
2840 }
2841
2842 if (staticp)
2843 {
2844 char *mangledcopy;
2845
2846 mangledcopy = savestring (mangledname, mangledlen);
2847
2848 field = debug_make_static_member (dhandle, fieldcopy,
2849 ftype, mangledcopy,
2850 visibility);
2851 }
2852 else
2853 {
2854 bfd_vma bitpos, bitsize;
2855
2856 bitpos = debug_get_field_bitpos (dhandle, *pf);
2857 bitsize = debug_get_field_bitsize (dhandle, *pf);
2858 if (bitpos == (bfd_vma) -1 || bitsize == (bfd_vma) -1)
2859 {
2860 ieee_error (info, start, _("bad C++ field bit pos or size"));
2861 return FALSE;
2862 }
2863 field = debug_make_field (dhandle, fieldcopy, ftype, bitpos,
2864 bitsize, visibility);
2865 }
2866
2867 if (field == DEBUG_FIELD_NULL)
2868 return FALSE;
2869
2870 if (field_count + 1 >= field_alloc)
2871 {
2872 field_alloc += 10;
2873 fields = ((debug_field *)
2874 xrealloc (fields, field_alloc * sizeof *fields));
2875 }
2876
2877 fields[field_count] = field;
2878 ++field_count;
2879 fields[field_count] = DEBUG_FIELD_NULL;
2880 }
2881 break;
2882
2883 case 'm':
2884 case 'v':
2885 {
2886 bfd_vma flags, voffset, control;
2887 const char *name, *mangled;
2888 unsigned long namlen, mangledlen;
2889 struct ieee_var *pv, *pvend;
2890 debug_type type;
2891 enum debug_visibility visibility;
2892 bfd_boolean constp, volatilep;
2893 char *mangledcopy;
2894 debug_method_variant mv;
2895 struct ieee_method *meth;
2896 unsigned int im;
2897
2898 if (! ieee_require_asn (info, pp, &flags)
2899 || ! ieee_require_atn65 (info, pp, &name, &namlen)
2900 || ! ieee_require_atn65 (info, pp, &mangled, &mangledlen))
2901 return FALSE;
2902 count -= 3;
2903 if (id != 'v')
2904 voffset = 0;
2905 else
2906 {
2907 if (! ieee_require_asn (info, pp, &voffset))
2908 return FALSE;
2909 --count;
2910 }
2911 if (! ieee_require_asn (info, pp, &control))
2912 return FALSE;
2913 --count;
2914
2915 /* We just ignore the control information. */
2916
2917 /* We have no way to represent friend information, so we
2918 just ignore it. */
2919 if ((flags & CXXFLAGS_FRIEND) != 0)
2920 break;
2921
2922 /* We should already have seen a type for the function. */
2923 pv = info->vars.vars;
2924 pvend = pv + info->vars.alloc;
2925 for (; pv < pvend; pv++)
2926 if (pv->namlen == mangledlen
2927 && strncmp (pv->name, mangled, mangledlen) == 0)
2928 break;
2929
2930 if (pv >= pvend)
2931 {
2932 /* We won't have type information for this function if
2933 it is not included in this file. We don't try to
2934 handle this case. FIXME. */
2935 type = (debug_make_function_type
2936 (dhandle,
2937 ieee_builtin_type (info, start,
2938 (unsigned int) builtin_void),
2939 (debug_type *) NULL,
2940 FALSE));
2941 }
2942 else
2943 {
2944 debug_type return_type;
2945 const debug_type *arg_types;
2946 bfd_boolean varargs;
2947
2948 if (debug_get_type_kind (dhandle, pv->type)
2949 != DEBUG_KIND_FUNCTION)
2950 {
2951 ieee_error (info, start,
2952 _("bad type for C++ method function"));
2953 return FALSE;
2954 }
2955
2956 return_type = debug_get_return_type (dhandle, pv->type);
2957 arg_types = debug_get_parameter_types (dhandle, pv->type,
2958 &varargs);
2959 if (return_type == DEBUG_TYPE_NULL || arg_types == NULL)
2960 {
2961 ieee_error (info, start,
2962 _("no type information for C++ method function"));
2963 return FALSE;
2964 }
2965
2966 type = debug_make_method_type (dhandle, return_type, it->type,
2967 (debug_type *) arg_types,
2968 varargs);
2969 }
2970 if (type == DEBUG_TYPE_NULL)
2971 return FALSE;
2972
2973 switch (flags & CXXFLAGS_VISIBILITY)
2974 {
2975 default:
2976 ieee_error (info, start, _("unknown C++ visibility"));
2977 return FALSE;
2978
2979 case CXXFLAGS_VISIBILITY_PUBLIC:
2980 visibility = DEBUG_VISIBILITY_PUBLIC;
2981 break;
2982
2983 case CXXFLAGS_VISIBILITY_PRIVATE:
2984 visibility = DEBUG_VISIBILITY_PRIVATE;
2985 break;
2986
2987 case CXXFLAGS_VISIBILITY_PROTECTED:
2988 visibility = DEBUG_VISIBILITY_PROTECTED;
2989 break;
2990 }
2991
2992 constp = (flags & CXXFLAGS_CONST) != 0 ? TRUE : FALSE;
2993 volatilep = (flags & CXXFLAGS_VOLATILE) != 0 ? TRUE : FALSE;
2994
2995 mangledcopy = savestring (mangled, mangledlen);
2996
2997 if ((flags & CXXFLAGS_STATIC) != 0)
2998 {
2999 if (id == 'v')
3000 {
3001 ieee_error (info, start, _("C++ static virtual method"));
3002 return FALSE;
3003 }
3004 mv = debug_make_static_method_variant (dhandle, mangledcopy,
3005 type, visibility,
3006 constp, volatilep);
3007 }
3008 else
3009 {
3010 debug_type vcontext;
3011
3012 if (id != 'v')
3013 vcontext = DEBUG_TYPE_NULL;
3014 else
3015 {
3016 /* FIXME: How can we calculate this correctly? */
3017 vcontext = it->type;
3018 }
3019 mv = debug_make_method_variant (dhandle, mangledcopy, type,
3020 visibility, constp,
3021 volatilep, voffset,
3022 vcontext);
3023 }
3024 if (mv == DEBUG_METHOD_VARIANT_NULL)
3025 return FALSE;
3026
3027 for (meth = methods, im = 0; im < methods_count; meth++, im++)
3028 if (meth->namlen == namlen
3029 && strncmp (meth->name, name, namlen) == 0)
3030 break;
3031 if (im >= methods_count)
3032 {
3033 if (methods_count >= methods_alloc)
3034 {
3035 methods_alloc += 10;
3036 methods = ((struct ieee_method *)
3037 xrealloc (methods,
3038 methods_alloc * sizeof *methods));
3039 }
3040 methods[methods_count].name = name;
3041 methods[methods_count].namlen = namlen;
3042 methods[methods_count].variants = NULL;
3043 methods[methods_count].count = 0;
3044 methods[methods_count].alloc = 0;
3045 meth = methods + methods_count;
3046 ++methods_count;
3047 }
3048
3049 if (meth->count + 1 >= meth->alloc)
3050 {
3051 meth->alloc += 10;
3052 meth->variants = ((debug_method_variant *)
3053 xrealloc (meth->variants,
3054 (meth->alloc
3055 * sizeof *meth->variants)));
3056 }
3057
3058 meth->variants[meth->count] = mv;
3059 ++meth->count;
3060 meth->variants[meth->count] = DEBUG_METHOD_VARIANT_NULL;
3061 }
3062 break;
3063
3064 case 'o':
3065 {
3066 bfd_vma spec;
3067
3068 /* We have no way to store this information, so we just
3069 ignore it. */
3070 if (! ieee_require_asn (info, pp, &spec))
3071 return FALSE;
3072 --count;
3073 if ((spec & 4) != 0)
3074 {
3075 const char *filename;
3076 unsigned long filenamlen;
3077 bfd_vma lineno;
3078
3079 if (! ieee_require_atn65 (info, pp, &filename, &filenamlen)
3080 || ! ieee_require_asn (info, pp, &lineno))
3081 return FALSE;
3082 count -= 2;
3083 }
3084 else if ((spec & 8) != 0)
3085 {
3086 const char *mangled;
3087 unsigned long mangledlen;
3088
3089 if (! ieee_require_atn65 (info, pp, &mangled, &mangledlen))
3090 return FALSE;
3091 --count;
3092 }
3093 else
3094 {
3095 ieee_error (info, start,
3096 _("unrecognized C++ object overhead spec"));
3097 return FALSE;
3098 }
3099 }
3100 break;
3101
3102 case 'z':
3103 {
3104 const char *vname, *basename;
3105 unsigned long vnamelen, baselen;
3106 bfd_vma vsize, control;
3107
3108 /* A virtual table pointer. */
3109
3110 if (! ieee_require_atn65 (info, pp, &vname, &vnamelen)
3111 || ! ieee_require_asn (info, pp, &vsize)
3112 || ! ieee_require_atn65 (info, pp, &basename, &baselen)
3113 || ! ieee_require_asn (info, pp, &control))
3114 return FALSE;
3115 count -= 4;
3116
3117 /* We just ignore the control number. We don't care what
3118 the virtual table name is. We have no way to store the
3119 virtual table size, and I don't think we care anyhow. */
3120
3121 /* FIXME: We can't handle multiple virtual table pointers. */
3122
3123 if (baselen == 0)
3124 ownvptr = TRUE;
3125 else
3126 {
3127 char *basecopy;
3128
3129 basecopy = savestring (basename, baselen);
3130 vptrbase = debug_find_tagged_type (dhandle, basecopy,
3131 DEBUG_KIND_ILLEGAL);
3132 free (basecopy);
3133 if (vptrbase == DEBUG_TYPE_NULL)
3134 {
3135 ieee_error (info, start, _("undefined C++ vtable"));
3136 return FALSE;
3137 }
3138 }
3139 }
3140 break;
3141 }
3142 }
3143
3144 /* Now that we have seen all the method variants, we can call
3145 debug_make_method for each one. */
3146
3147 if (methods_count == 0)
3148 dmethods = NULL;
3149 else
3150 {
3151 unsigned int i;
3152
3153 dmethods = ((debug_method *)
3154 xmalloc ((methods_count + 1) * sizeof *dmethods));
3155 for (i = 0; i < methods_count; i++)
3156 {
3157 char *namcopy;
3158
3159 namcopy = savestring (methods[i].name, methods[i].namlen);
3160 dmethods[i] = debug_make_method (dhandle, namcopy,
3161 methods[i].variants);
3162 if (dmethods[i] == DEBUG_METHOD_NULL)
3163 return FALSE;
3164 }
3165 dmethods[i] = DEBUG_METHOD_NULL;
3166 free (methods);
3167 }
3168
3169 /* The struct type was created as an indirect type pointing at
3170 it->slot. We update it->slot to automatically update all
3171 references to this struct. */
3172 it->slot = debug_make_object_type (dhandle,
3173 class != 'u',
3174 debug_get_type_size (dhandle,
3175 it->slot),
3176 fields, baseclasses, dmethods,
3177 vptrbase, ownvptr);
3178 if (it->slot == DEBUG_TYPE_NULL)
3179 return FALSE;
3180
3181 return TRUE;
3182 }
3183
3184 /* Read C++ default argument value and reference type information. */
3185
3186 static bfd_boolean
3187 ieee_read_cxx_defaults (struct ieee_info *info, const bfd_byte **pp,
3188 unsigned long count)
3189 {
3190 const bfd_byte *start;
3191 const char *fnname;
3192 unsigned long fnlen;
3193 bfd_vma defcount;
3194
3195 start = *pp;
3196
3197 /* Giving the function name before the argument count is an addendum
3198 to the spec. The function name is demangled, though, so this
3199 record must always refer to the current function. */
3200
3201 if (info->blockstack.bsp <= info->blockstack.stack
3202 || info->blockstack.bsp[-1].fnindx == (unsigned int) -1)
3203 {
3204 ieee_error (info, start, _("C++ default values not in a function"));
3205 return FALSE;
3206 }
3207
3208 if (! ieee_require_atn65 (info, pp, &fnname, &fnlen)
3209 || ! ieee_require_asn (info, pp, &defcount))
3210 return FALSE;
3211 count -= 2;
3212
3213 while (defcount-- > 0)
3214 {
3215 bfd_vma type, val;
3216 const char *strval;
3217 unsigned long strvallen;
3218
3219 if (! ieee_require_asn (info, pp, &type))
3220 return FALSE;
3221 --count;
3222
3223 switch (type)
3224 {
3225 case 0:
3226 case 4:
3227 break;
3228
3229 case 1:
3230 case 2:
3231 if (! ieee_require_asn (info, pp, &val))
3232 return FALSE;
3233 --count;
3234 break;
3235
3236 case 3:
3237 case 7:
3238 if (! ieee_require_atn65 (info, pp, &strval, &strvallen))
3239 return FALSE;
3240 --count;
3241 break;
3242
3243 default:
3244 ieee_error (info, start, _("unrecognized C++ default type"));
3245 return FALSE;
3246 }
3247
3248 /* We have no way to record the default argument values, so we
3249 just ignore them. FIXME. */
3250 }
3251
3252 /* Any remaining arguments are indices of parameters that are really
3253 reference type. */
3254 if (count > 0)
3255 {
3256 void *dhandle;
3257 debug_type *arg_slots;
3258
3259 dhandle = info->dhandle;
3260 arg_slots = info->types.types[info->blockstack.bsp[-1].fnindx].arg_slots;
3261 while (count-- > 0)
3262 {
3263 bfd_vma indx;
3264 debug_type target;
3265
3266 if (! ieee_require_asn (info, pp, &indx))
3267 return FALSE;
3268 /* The index is 1 based. */
3269 --indx;
3270 if (arg_slots == NULL
3271 || arg_slots[indx] == DEBUG_TYPE_NULL
3272 || (debug_get_type_kind (dhandle, arg_slots[indx])
3273 != DEBUG_KIND_POINTER))
3274 {
3275 ieee_error (info, start, _("reference parameter is not a pointer"));
3276 return FALSE;
3277 }
3278
3279 target = debug_get_target_type (dhandle, arg_slots[indx]);
3280 arg_slots[indx] = debug_make_reference_type (dhandle, target);
3281 if (arg_slots[indx] == DEBUG_TYPE_NULL)
3282 return FALSE;
3283 }
3284 }
3285
3286 return TRUE;
3287 }
3288
3289 /* Read a C++ reference definition. */
3290
3291 static bfd_boolean
3292 ieee_read_reference (struct ieee_info *info, const bfd_byte **pp)
3293 {
3294 const bfd_byte *start;
3295 bfd_vma flags;
3296 const char *class, *name;
3297 unsigned long classlen, namlen;
3298 debug_type *pslot;
3299 debug_type target;
3300
3301 start = *pp;
3302
3303 if (! ieee_require_asn (info, pp, &flags))
3304 return FALSE;
3305
3306 /* Giving the class name before the member name is in an addendum to
3307 the spec. */
3308 if (flags == 3)
3309 {
3310 if (! ieee_require_atn65 (info, pp, &class, &classlen))
3311 return FALSE;
3312 }
3313
3314 if (! ieee_require_atn65 (info, pp, &name, &namlen))
3315 return FALSE;
3316
3317 pslot = NULL;
3318 if (flags != 3)
3319 {
3320 int pass;
3321
3322 /* We search from the last variable indices to the first in
3323 hopes of finding local variables correctly. We search the
3324 local variables on the first pass, and the global variables
3325 on the second. FIXME: This probably won't work in all cases.
3326 On the other hand, I don't know what will. */
3327 for (pass = 0; pass < 2; pass++)
3328 {
3329 struct ieee_vars *vars;
3330 int i;
3331 struct ieee_var *pv = NULL;
3332
3333 if (pass == 0)
3334 vars = &info->vars;
3335 else
3336 {
3337 vars = info->global_vars;
3338 if (vars == NULL)
3339 break;
3340 }
3341
3342 for (i = (int) vars->alloc - 1; i >= 0; i--)
3343 {
3344 bfd_boolean found;
3345
3346 pv = vars->vars + i;
3347
3348 if (pv->pslot == NULL
3349 || pv->namlen != namlen
3350 || strncmp (pv->name, name, namlen) != 0)
3351 continue;
3352
3353 found = FALSE;
3354 switch (flags)
3355 {
3356 default:
3357 ieee_error (info, start,
3358 _("unrecognized C++ reference type"));
3359 return FALSE;
3360
3361 case 0:
3362 /* Global variable or function. */
3363 if (pv->kind == IEEE_GLOBAL
3364 || pv->kind == IEEE_EXTERNAL
3365 || pv->kind == IEEE_FUNCTION)
3366 found = TRUE;
3367 break;
3368
3369 case 1:
3370 /* Global static variable or function. */
3371 if (pv->kind == IEEE_STATIC
3372 || pv->kind == IEEE_FUNCTION)
3373 found = TRUE;
3374 break;
3375
3376 case 2:
3377 /* Local variable. */
3378 if (pv->kind == IEEE_LOCAL)
3379 found = TRUE;
3380 break;
3381 }
3382
3383 if (found)
3384 break;
3385 }
3386
3387 if (i >= 0)
3388 {
3389 pslot = pv->pslot;
3390 break;
3391 }
3392 }
3393 }
3394 else
3395 {
3396 struct ieee_tag *it;
3397
3398 for (it = info->tags; it != NULL; it = it->next)
3399 {
3400 if (it->name[0] == class[0]
3401 && strncmp (it->name, class, classlen) == 0
3402 && strlen (it->name) == classlen)
3403 {
3404 if (it->fslots != NULL)
3405 {
3406 const debug_field *pf;
3407 unsigned int findx;
3408
3409 pf = debug_get_fields (info->dhandle, it->type);
3410 if (pf == NULL)
3411 {
3412 ieee_error (info, start,
3413 "C++ reference in class with no fields");
3414 return FALSE;
3415 }
3416
3417 for (findx = 0; *pf != DEBUG_FIELD_NULL; pf++, findx++)
3418 {
3419 const char *fname;
3420
3421 fname = debug_get_field_name (info->dhandle, *pf);
3422 if (fname == NULL)
3423 return FALSE;
3424 if (strncmp (fname, name, namlen) == 0
3425 && strlen (fname) == namlen)
3426 {
3427 pslot = it->fslots + findx;
3428 break;
3429 }
3430 }
3431 }
3432
3433 break;
3434 }
3435 }
3436 }
3437
3438 if (pslot == NULL)
3439 {
3440 ieee_error (info, start, _("C++ reference not found"));
3441 return FALSE;
3442 }
3443
3444 /* We allocated the type of the object as an indirect type pointing
3445 to *pslot, which we can now update to be a reference type. */
3446 if (debug_get_type_kind (info->dhandle, *pslot) != DEBUG_KIND_POINTER)
3447 {
3448 ieee_error (info, start, _("C++ reference is not pointer"));
3449 return FALSE;
3450 }
3451
3452 target = debug_get_target_type (info->dhandle, *pslot);
3453 *pslot = debug_make_reference_type (info->dhandle, target);
3454 if (*pslot == DEBUG_TYPE_NULL)
3455 return FALSE;
3456
3457 return TRUE;
3458 }
3459
3460 /* Require an ASN record. */
3461
3462 static bfd_boolean
3463 ieee_require_asn (struct ieee_info *info, const bfd_byte **pp, bfd_vma *pv)
3464 {
3465 const bfd_byte *start;
3466 ieee_record_enum_type c;
3467 bfd_vma varindx;
3468
3469 start = *pp;
3470
3471 c = (ieee_record_enum_type) **pp;
3472 if (c != ieee_e2_first_byte_enum)
3473 {
3474 ieee_error (info, start, _("missing required ASN"));
3475 return FALSE;
3476 }
3477 ++*pp;
3478
3479 c = (ieee_record_enum_type) (((unsigned int) c << 8) | **pp);
3480 if (c != ieee_asn_record_enum)
3481 {
3482 ieee_error (info, start, _("missing required ASN"));
3483 return FALSE;
3484 }
3485 ++*pp;
3486
3487 /* Just ignore the variable index. */
3488 if (! ieee_read_number (info, pp, &varindx))
3489 return FALSE;
3490
3491 return ieee_read_expression (info, pp, pv);
3492 }
3493
3494 /* Require an ATN65 record. */
3495
3496 static bfd_boolean
3497 ieee_require_atn65 (struct ieee_info *info, const bfd_byte **pp,
3498 const char **pname, unsigned long *pnamlen)
3499 {
3500 const bfd_byte *start;
3501 ieee_record_enum_type c;
3502 bfd_vma name_indx, type_indx, atn_code;
3503
3504 start = *pp;
3505
3506 c = (ieee_record_enum_type) **pp;
3507 if (c != ieee_at_record_enum)
3508 {
3509 ieee_error (info, start, _("missing required ATN65"));
3510 return FALSE;
3511 }
3512 ++*pp;
3513
3514 c = (ieee_record_enum_type) (((unsigned int) c << 8) | **pp);
3515 if (c != ieee_atn_record_enum)
3516 {
3517 ieee_error (info, start, _("missing required ATN65"));
3518 return FALSE;
3519 }
3520 ++*pp;
3521
3522 if (! ieee_read_number (info, pp, &name_indx)
3523 || ! ieee_read_number (info, pp, &type_indx)
3524 || ! ieee_read_number (info, pp, &atn_code))
3525 return FALSE;
3526
3527 /* Just ignore name_indx. */
3528
3529 if (type_indx != 0 || atn_code != 65)
3530 {
3531 ieee_error (info, start, _("bad ATN65 record"));
3532 return FALSE;
3533 }
3534
3535 return ieee_read_id (info, pp, pname, pnamlen);
3536 }
3537 \f
3538 /* Convert a register number in IEEE debugging information into a
3539 generic register number. */
3540
3541 static int
3542 ieee_regno_to_genreg (bfd *abfd, int r)
3543 {
3544 switch (bfd_get_arch (abfd))
3545 {
3546 case bfd_arch_m68k:
3547 /* For some reasons stabs adds 2 to the floating point register
3548 numbers. */
3549 if (r >= 16)
3550 r += 2;
3551 break;
3552
3553 case bfd_arch_i960:
3554 /* Stabs uses 0 to 15 for r0 to r15, 16 to 31 for g0 to g15, and
3555 32 to 35 for fp0 to fp3. */
3556 --r;
3557 break;
3558
3559 default:
3560 break;
3561 }
3562
3563 return r;
3564 }
3565
3566 /* Convert a generic register number to an IEEE specific one. */
3567
3568 static int
3569 ieee_genreg_to_regno (bfd *abfd, int r)
3570 {
3571 switch (bfd_get_arch (abfd))
3572 {
3573 case bfd_arch_m68k:
3574 /* For some reason stabs add 2 to the floating point register
3575 numbers. */
3576 if (r >= 18)
3577 r -= 2;
3578 break;
3579
3580 case bfd_arch_i960:
3581 /* Stabs uses 0 to 15 for r0 to r15, 16 to 31 for g0 to g15, and
3582 32 to 35 for fp0 to fp3. */
3583 ++r;
3584 break;
3585
3586 default:
3587 break;
3588 }
3589
3590 return r;
3591 }
3592 \f
3593 /* These routines build IEEE debugging information out of the generic
3594 debugging information. */
3595
3596 /* We build the IEEE debugging information byte by byte. Rather than
3597 waste time copying data around, we use a linked list of buffers to
3598 hold the data. */
3599
3600 #define IEEE_BUFSIZE (490)
3601
3602 struct ieee_buf
3603 {
3604 /* Next buffer. */
3605 struct ieee_buf *next;
3606 /* Number of data bytes in this buffer. */
3607 unsigned int c;
3608 /* Bytes. */
3609 bfd_byte buf[IEEE_BUFSIZE];
3610 };
3611
3612 /* A list of buffers. */
3613
3614 struct ieee_buflist
3615 {
3616 /* Head of list. */
3617 struct ieee_buf *head;
3618 /* Tail--last buffer on list. */
3619 struct ieee_buf *tail;
3620 };
3621
3622 /* In order to generate the BB11 blocks required by the HP emulator,
3623 we keep track of ranges of addresses which correspond to a given
3624 compilation unit. */
3625
3626 struct ieee_range
3627 {
3628 /* Next range. */
3629 struct ieee_range *next;
3630 /* Low address. */
3631 bfd_vma low;
3632 /* High address. */
3633 bfd_vma high;
3634 };
3635
3636 /* This structure holds information for a class on the type stack. */
3637
3638 struct ieee_type_class
3639 {
3640 /* The name index in the debugging information. */
3641 unsigned int indx;
3642 /* The pmisc records for the class. */
3643 struct ieee_buflist pmiscbuf;
3644 /* The number of pmisc records. */
3645 unsigned int pmisccount;
3646 /* The name of the class holding the virtual table, if not this
3647 class. */
3648 const char *vclass;
3649 /* Whether this class holds its own virtual table. */
3650 bfd_boolean ownvptr;
3651 /* The largest virtual table offset seen so far. */
3652 bfd_vma voffset;
3653 /* The current method. */
3654 const char *method;
3655 /* Additional pmisc records used to record fields of reference type. */
3656 struct ieee_buflist refs;
3657 };
3658
3659 /* This is how we store types for the writing routines. Most types
3660 are simply represented by a type index. */
3661
3662 struct ieee_write_type
3663 {
3664 /* Type index. */
3665 unsigned int indx;
3666 /* The size of the type, if known. */
3667 unsigned int size;
3668 /* The name of the type, if any. */
3669 const char *name;
3670 /* If this is a function or method type, we build the type here, and
3671 only add it to the output buffers if we need it. */
3672 struct ieee_buflist fndef;
3673 /* If this is a struct, this is where the struct definition is
3674 built. */
3675 struct ieee_buflist strdef;
3676 /* If this is a class, this is where the class information is built. */
3677 struct ieee_type_class *classdef;
3678 /* Whether the type is unsigned. */
3679 unsigned int unsignedp : 1;
3680 /* Whether this is a reference type. */
3681 unsigned int referencep : 1;
3682 /* Whether this is in the local type block. */
3683 unsigned int localp : 1;
3684 /* Whether this is a duplicate struct definition which we are
3685 ignoring. */
3686 unsigned int ignorep : 1;
3687 };
3688
3689 /* This is the type stack used by the debug writing routines. FIXME:
3690 We could generate more efficient output if we remembered when we
3691 have output a particular type before. */
3692
3693 struct ieee_type_stack
3694 {
3695 /* Next entry on stack. */
3696 struct ieee_type_stack *next;
3697 /* Type information. */
3698 struct ieee_write_type type;
3699 };
3700
3701 /* This is a list of associations between a name and some types.
3702 These are used for typedefs and tags. */
3703
3704 struct ieee_name_type
3705 {
3706 /* Next type for this name. */
3707 struct ieee_name_type *next;
3708 /* ID number. For a typedef, this is the index of the type to which
3709 this name is typedefed. */
3710 unsigned int id;
3711 /* Type. */
3712 struct ieee_write_type type;
3713 /* If this is a tag which has not yet been defined, this is the
3714 kind. If the tag has been defined, this is DEBUG_KIND_ILLEGAL. */
3715 enum debug_type_kind kind;
3716 };
3717
3718 /* We use a hash table to associate names and types. */
3719
3720 struct ieee_name_type_hash_table
3721 {
3722 struct bfd_hash_table root;
3723 };
3724
3725 struct ieee_name_type_hash_entry
3726 {
3727 struct bfd_hash_entry root;
3728 /* Information for this name. */
3729 struct ieee_name_type *types;
3730 };
3731
3732 /* This is a list of enums. */
3733
3734 struct ieee_defined_enum
3735 {
3736 /* Next enum. */
3737 struct ieee_defined_enum *next;
3738 /* Type index. */
3739 unsigned int indx;
3740 /* Whether this enum has been defined. */
3741 bfd_boolean defined;
3742 /* Tag. */
3743 const char *tag;
3744 /* Names. */
3745 const char **names;
3746 /* Values. */
3747 bfd_signed_vma *vals;
3748 };
3749
3750 /* We keep a list of modified versions of types, so that we don't
3751 output them more than once. */
3752
3753 struct ieee_modified_type
3754 {
3755 /* Pointer to this type. */
3756 unsigned int pointer;
3757 /* Function with unknown arguments returning this type. */
3758 unsigned int function;
3759 /* Const version of this type. */
3760 unsigned int const_qualified;
3761 /* Volatile version of this type. */
3762 unsigned int volatile_qualified;
3763 /* List of arrays of this type of various bounds. */
3764 struct ieee_modified_array_type *arrays;
3765 };
3766
3767 /* A list of arrays bounds. */
3768
3769 struct ieee_modified_array_type
3770 {
3771 /* Next array bounds. */
3772 struct ieee_modified_array_type *next;
3773 /* Type index with these bounds. */
3774 unsigned int indx;
3775 /* Low bound. */
3776 bfd_signed_vma low;
3777 /* High bound. */
3778 bfd_signed_vma high;
3779 };
3780
3781 /* This is a list of pending function parameter information. We don't
3782 output them until we see the first block. */
3783
3784 struct ieee_pending_parm
3785 {
3786 /* Next pending parameter. */
3787 struct ieee_pending_parm *next;
3788 /* Name. */
3789 const char *name;
3790 /* Type index. */
3791 unsigned int type;
3792 /* Whether the type is a reference. */
3793 bfd_boolean referencep;
3794 /* Kind. */
3795 enum debug_parm_kind kind;
3796 /* Value. */
3797 bfd_vma val;
3798 };
3799
3800 /* This is the handle passed down by debug_write. */
3801
3802 struct ieee_handle
3803 {
3804 /* BFD we are writing to. */
3805 bfd *abfd;
3806 /* Whether we got an error in a subroutine called via traverse or
3807 map_over_sections. */
3808 bfd_boolean error;
3809 /* Current data buffer list. */
3810 struct ieee_buflist *current;
3811 /* Current data buffer. */
3812 struct ieee_buf *curbuf;
3813 /* Filename of current compilation unit. */
3814 const char *filename;
3815 /* Module name of current compilation unit. */
3816 const char *modname;
3817 /* List of buffer for global types. */
3818 struct ieee_buflist global_types;
3819 /* List of finished data buffers. */
3820 struct ieee_buflist data;
3821 /* List of buffers for typedefs in the current compilation unit. */
3822 struct ieee_buflist types;
3823 /* List of buffers for variables and functions in the current
3824 compilation unit. */
3825 struct ieee_buflist vars;
3826 /* List of buffers for C++ class definitions in the current
3827 compilation unit. */
3828 struct ieee_buflist cxx;
3829 /* List of buffers for line numbers in the current compilation unit. */
3830 struct ieee_buflist linenos;
3831 /* Ranges for the current compilation unit. */
3832 struct ieee_range *ranges;
3833 /* Ranges for all debugging information. */
3834 struct ieee_range *global_ranges;
3835 /* Nested pending ranges. */
3836 struct ieee_range *pending_ranges;
3837 /* Type stack. */
3838 struct ieee_type_stack *type_stack;
3839 /* Next unallocated type index. */
3840 unsigned int type_indx;
3841 /* Next unallocated name index. */
3842 unsigned int name_indx;
3843 /* Typedefs. */
3844 struct ieee_name_type_hash_table typedefs;
3845 /* Tags. */
3846 struct ieee_name_type_hash_table tags;
3847 /* Enums. */
3848 struct ieee_defined_enum *enums;
3849 /* Modified versions of types. */
3850 struct ieee_modified_type *modified;
3851 /* Number of entries allocated in modified. */
3852 unsigned int modified_alloc;
3853 /* 4 byte complex type. */
3854 unsigned int complex_float_index;
3855 /* 8 byte complex type. */
3856 unsigned int complex_double_index;
3857 /* The depth of block nesting. This is 0 outside a function, and 1
3858 just after start_function is called. */
3859 unsigned int block_depth;
3860 /* The name of the current function. */
3861 const char *fnname;
3862 /* List of buffers for the type of the function we are currently
3863 writing out. */
3864 struct ieee_buflist fntype;
3865 /* List of buffers for the parameters of the function we are
3866 currently writing out. */
3867 struct ieee_buflist fnargs;
3868 /* Number of arguments written to fnargs. */
3869 unsigned int fnargcount;
3870 /* Pending function parameters. */
3871 struct ieee_pending_parm *pending_parms;
3872 /* Current line number filename. */
3873 const char *lineno_filename;
3874 /* Line number name index. */
3875 unsigned int lineno_name_indx;
3876 /* Filename of pending line number. */
3877 const char *pending_lineno_filename;
3878 /* Pending line number. */
3879 unsigned long pending_lineno;
3880 /* Address of pending line number. */
3881 bfd_vma pending_lineno_addr;
3882 /* Highest address seen at end of procedure. */
3883 bfd_vma highaddr;
3884 };
3885
3886 static bfd_boolean ieee_init_buffer
3887 (struct ieee_handle *, struct ieee_buflist *);
3888 static bfd_boolean ieee_change_buffer
3889 (struct ieee_handle *, struct ieee_buflist *);
3890 static bfd_boolean ieee_append_buffer
3891 (struct ieee_handle *, struct ieee_buflist *, struct ieee_buflist *);
3892 static bfd_boolean ieee_real_write_byte (struct ieee_handle *, int);
3893 static bfd_boolean ieee_write_2bytes (struct ieee_handle *, int);
3894 static bfd_boolean ieee_write_number (struct ieee_handle *, bfd_vma);
3895 static bfd_boolean ieee_write_id (struct ieee_handle *, const char *);
3896 static bfd_boolean ieee_write_asn
3897 (struct ieee_handle *, unsigned int, bfd_vma);
3898 static bfd_boolean ieee_write_atn65
3899 (struct ieee_handle *, unsigned int, const char *);
3900 static bfd_boolean ieee_push_type
3901 (struct ieee_handle *, unsigned int, unsigned int, bfd_boolean,
3902 bfd_boolean);
3903 static unsigned int ieee_pop_type (struct ieee_handle *);
3904 static void ieee_pop_unused_type (struct ieee_handle *);
3905 static unsigned int ieee_pop_type_used (struct ieee_handle *, bfd_boolean);
3906 static bfd_boolean ieee_add_range
3907 (struct ieee_handle *, bfd_boolean, bfd_vma, bfd_vma);
3908 static bfd_boolean ieee_start_range (struct ieee_handle *, bfd_vma);
3909 static bfd_boolean ieee_end_range (struct ieee_handle *, bfd_vma);
3910 static bfd_boolean ieee_define_type
3911 (struct ieee_handle *, unsigned int, bfd_boolean, bfd_boolean);
3912 static bfd_boolean ieee_define_named_type
3913 (struct ieee_handle *, const char *, unsigned int, unsigned int,
3914 bfd_boolean, bfd_boolean, struct ieee_buflist *);
3915 static struct ieee_modified_type *ieee_get_modified_info
3916 (struct ieee_handle *, unsigned int);
3917 static struct bfd_hash_entry *ieee_name_type_newfunc
3918 (struct bfd_hash_entry *, struct bfd_hash_table *, const char *);
3919 static bfd_boolean ieee_write_undefined_tag
3920 (struct ieee_name_type_hash_entry *, void *);
3921 static bfd_boolean ieee_finish_compilation_unit (struct ieee_handle *);
3922 static void ieee_add_bb11_blocks (bfd *, asection *, void *);
3923 static bfd_boolean ieee_add_bb11
3924 (struct ieee_handle *, asection *, bfd_vma, bfd_vma);
3925 static bfd_boolean ieee_output_pending_parms (struct ieee_handle *);
3926 static unsigned int ieee_vis_to_flags (enum debug_visibility);
3927 static bfd_boolean ieee_class_method_var
3928 (struct ieee_handle *, const char *, enum debug_visibility, bfd_boolean,
3929 bfd_boolean, bfd_boolean, bfd_vma, bfd_boolean);
3930
3931 static bfd_boolean ieee_start_compilation_unit (void *, const char *);
3932 static bfd_boolean ieee_start_source (void *, const char *);
3933 static bfd_boolean ieee_empty_type (void *);
3934 static bfd_boolean ieee_void_type (void *);
3935 static bfd_boolean ieee_int_type (void *, unsigned int, bfd_boolean);
3936 static bfd_boolean ieee_float_type (void *, unsigned int);
3937 static bfd_boolean ieee_complex_type (void *, unsigned int);
3938 static bfd_boolean ieee_bool_type (void *, unsigned int);
3939 static bfd_boolean ieee_enum_type
3940 (void *, const char *, const char **, bfd_signed_vma *);
3941 static bfd_boolean ieee_pointer_type (void *);
3942 static bfd_boolean ieee_function_type (void *, int, bfd_boolean);
3943 static bfd_boolean ieee_reference_type (void *);
3944 static bfd_boolean ieee_range_type (void *, bfd_signed_vma, bfd_signed_vma);
3945 static bfd_boolean ieee_array_type
3946 (void *, bfd_signed_vma, bfd_signed_vma, bfd_boolean);
3947 static bfd_boolean ieee_set_type (void *, bfd_boolean);
3948 static bfd_boolean ieee_offset_type (void *);
3949 static bfd_boolean ieee_method_type (void *, bfd_boolean, int, bfd_boolean);
3950 static bfd_boolean ieee_const_type (void *);
3951 static bfd_boolean ieee_volatile_type (void *);
3952 static bfd_boolean ieee_start_struct_type
3953 (void *, const char *, unsigned int, bfd_boolean, unsigned int);
3954 static bfd_boolean ieee_struct_field
3955 (void *, const char *, bfd_vma, bfd_vma, enum debug_visibility);
3956 static bfd_boolean ieee_end_struct_type (void *);
3957 static bfd_boolean ieee_start_class_type
3958 (void *, const char *, unsigned int, bfd_boolean, unsigned int, bfd_boolean,
3959 bfd_boolean);
3960 static bfd_boolean ieee_class_static_member
3961 (void *, const char *, const char *, enum debug_visibility);
3962 static bfd_boolean ieee_class_baseclass
3963 (void *, bfd_vma, bfd_boolean, enum debug_visibility);
3964 static bfd_boolean ieee_class_start_method (void *, const char *);
3965 static bfd_boolean ieee_class_method_variant
3966 (void *, const char *, enum debug_visibility, bfd_boolean, bfd_boolean,
3967 bfd_vma, bfd_boolean);
3968 static bfd_boolean ieee_class_static_method_variant
3969 (void *, const char *, enum debug_visibility, bfd_boolean, bfd_boolean);
3970 static bfd_boolean ieee_class_end_method (void *);
3971 static bfd_boolean ieee_end_class_type (void *);
3972 static bfd_boolean ieee_typedef_type (void *, const char *);
3973 static bfd_boolean ieee_tag_type
3974 (void *, const char *, unsigned int, enum debug_type_kind);
3975 static bfd_boolean ieee_typdef (void *, const char *);
3976 static bfd_boolean ieee_tag (void *, const char *);
3977 static bfd_boolean ieee_int_constant (void *, const char *, bfd_vma);
3978 static bfd_boolean ieee_float_constant (void *, const char *, double);
3979 static bfd_boolean ieee_typed_constant (void *, const char *, bfd_vma);
3980 static bfd_boolean ieee_variable
3981 (void *, const char *, enum debug_var_kind, bfd_vma);
3982 static bfd_boolean ieee_start_function (void *, const char *, bfd_boolean);
3983 static bfd_boolean ieee_function_parameter
3984 (void *, const char *, enum debug_parm_kind, bfd_vma);
3985 static bfd_boolean ieee_start_block (void *, bfd_vma);
3986 static bfd_boolean ieee_end_block (void *, bfd_vma);
3987 static bfd_boolean ieee_end_function (void *);
3988 static bfd_boolean ieee_lineno (void *, const char *, unsigned long, bfd_vma);
3989
3990 static const struct debug_write_fns ieee_fns =
3991 {
3992 ieee_start_compilation_unit,
3993 ieee_start_source,
3994 ieee_empty_type,
3995 ieee_void_type,
3996 ieee_int_type,
3997 ieee_float_type,
3998 ieee_complex_type,
3999 ieee_bool_type,
4000 ieee_enum_type,
4001 ieee_pointer_type,
4002 ieee_function_type,
4003 ieee_reference_type,
4004 ieee_range_type,
4005 ieee_array_type,
4006 ieee_set_type,
4007 ieee_offset_type,
4008 ieee_method_type,
4009 ieee_const_type,
4010 ieee_volatile_type,
4011 ieee_start_struct_type,
4012 ieee_struct_field,
4013 ieee_end_struct_type,
4014 ieee_start_class_type,
4015 ieee_class_static_member,
4016 ieee_class_baseclass,
4017 ieee_class_start_method,
4018 ieee_class_method_variant,
4019 ieee_class_static_method_variant,
4020 ieee_class_end_method,
4021 ieee_end_class_type,
4022 ieee_typedef_type,
4023 ieee_tag_type,
4024 ieee_typdef,
4025 ieee_tag,
4026 ieee_int_constant,
4027 ieee_float_constant,
4028 ieee_typed_constant,
4029 ieee_variable,
4030 ieee_start_function,
4031 ieee_function_parameter,
4032 ieee_start_block,
4033 ieee_end_block,
4034 ieee_end_function,
4035 ieee_lineno
4036 };
4037
4038 /* Initialize a buffer to be empty. */
4039
4040 static bfd_boolean
4041 ieee_init_buffer (struct ieee_handle *info ATTRIBUTE_UNUSED,
4042 struct ieee_buflist *buflist)
4043 {
4044 buflist->head = NULL;
4045 buflist->tail = NULL;
4046 return TRUE;
4047 }
4048
4049 /* See whether a buffer list has any data. */
4050
4051 #define ieee_buffer_emptyp(buflist) ((buflist)->head == NULL)
4052
4053 /* Change the current buffer to a specified buffer chain. */
4054
4055 static bfd_boolean
4056 ieee_change_buffer (struct ieee_handle *info, struct ieee_buflist *buflist)
4057 {
4058 if (buflist->head == NULL)
4059 {
4060 struct ieee_buf *buf;
4061
4062 buf = (struct ieee_buf *) xmalloc (sizeof *buf);
4063 buf->next = NULL;
4064 buf->c = 0;
4065 buflist->head = buf;
4066 buflist->tail = buf;
4067 }
4068
4069 info->current = buflist;
4070 info->curbuf = buflist->tail;
4071
4072 return TRUE;
4073 }
4074
4075 /* Append a buffer chain. */
4076
4077 static bfd_boolean
4078 ieee_append_buffer (struct ieee_handle *info ATTRIBUTE_UNUSED,
4079 struct ieee_buflist *mainbuf,
4080 struct ieee_buflist *newbuf)
4081 {
4082 if (newbuf->head != NULL)
4083 {
4084 if (mainbuf->head == NULL)
4085 mainbuf->head = newbuf->head;
4086 else
4087 mainbuf->tail->next = newbuf->head;
4088 mainbuf->tail = newbuf->tail;
4089 }
4090 return TRUE;
4091 }
4092
4093 /* Write a byte into the buffer. We use a macro for speed and a
4094 function for the complex cases. */
4095
4096 #define ieee_write_byte(info, b) \
4097 ((info)->curbuf->c < IEEE_BUFSIZE \
4098 ? ((info)->curbuf->buf[(info)->curbuf->c++] = (b), TRUE) \
4099 : ieee_real_write_byte ((info), (b)))
4100
4101 static bfd_boolean
4102 ieee_real_write_byte (struct ieee_handle *info, int b)
4103 {
4104 if (info->curbuf->c >= IEEE_BUFSIZE)
4105 {
4106 struct ieee_buf *n;
4107
4108 n = (struct ieee_buf *) xmalloc (sizeof *n);
4109 n->next = NULL;
4110 n->c = 0;
4111 if (info->current->head == NULL)
4112 info->current->head = n;
4113 else
4114 info->current->tail->next = n;
4115 info->current->tail = n;
4116 info->curbuf = n;
4117 }
4118
4119 info->curbuf->buf[info->curbuf->c] = b;
4120 ++info->curbuf->c;
4121
4122 return TRUE;
4123 }
4124
4125 /* Write out two bytes. */
4126
4127 static bfd_boolean
4128 ieee_write_2bytes (struct ieee_handle *info, int i)
4129 {
4130 return (ieee_write_byte (info, i >> 8)
4131 && ieee_write_byte (info, i & 0xff));
4132 }
4133
4134 /* Write out an integer. */
4135
4136 static bfd_boolean
4137 ieee_write_number (struct ieee_handle *info, bfd_vma v)
4138 {
4139 bfd_vma t;
4140 bfd_byte ab[20];
4141 bfd_byte *p;
4142 unsigned int c;
4143
4144 if (v <= (bfd_vma) ieee_number_end_enum)
4145 return ieee_write_byte (info, (int) v);
4146
4147 t = v;
4148 p = ab + sizeof ab;
4149 while (t != 0)
4150 {
4151 *--p = t & 0xff;
4152 t >>= 8;
4153 }
4154 c = (ab + 20) - p;
4155
4156 if (c > (unsigned int) (ieee_number_repeat_end_enum
4157 - ieee_number_repeat_start_enum))
4158 {
4159 fprintf (stderr, _("IEEE numeric overflow: 0x"));
4160 fprintf_vma (stderr, v);
4161 fprintf (stderr, "\n");
4162 return FALSE;
4163 }
4164
4165 if (! ieee_write_byte (info, (int) ieee_number_repeat_start_enum + c))
4166 return FALSE;
4167 for (; c > 0; --c, ++p)
4168 {
4169 if (! ieee_write_byte (info, *p))
4170 return FALSE;
4171 }
4172
4173 return TRUE;
4174 }
4175
4176 /* Write out a string. */
4177
4178 static bfd_boolean
4179 ieee_write_id (struct ieee_handle *info, const char *s)
4180 {
4181 unsigned int len;
4182
4183 len = strlen (s);
4184 if (len <= 0x7f)
4185 {
4186 if (! ieee_write_byte (info, len))
4187 return FALSE;
4188 }
4189 else if (len <= 0xff)
4190 {
4191 if (! ieee_write_byte (info, (int) ieee_extension_length_1_enum)
4192 || ! ieee_write_byte (info, len))
4193 return FALSE;
4194 }
4195 else if (len <= 0xffff)
4196 {
4197 if (! ieee_write_byte (info, (int) ieee_extension_length_2_enum)
4198 || ! ieee_write_2bytes (info, len))
4199 return FALSE;
4200 }
4201 else
4202 {
4203 fprintf (stderr, _("IEEE string length overflow: %u\n"), len);
4204 return FALSE;
4205 }
4206
4207 for (; *s != '\0'; s++)
4208 if (! ieee_write_byte (info, *s))
4209 return FALSE;
4210
4211 return TRUE;
4212 }
4213
4214 /* Write out an ASN record. */
4215
4216 static bfd_boolean
4217 ieee_write_asn (struct ieee_handle *info, unsigned int indx, bfd_vma val)
4218 {
4219 return (ieee_write_2bytes (info, (int) ieee_asn_record_enum)
4220 && ieee_write_number (info, indx)
4221 && ieee_write_number (info, val));
4222 }
4223
4224 /* Write out an ATN65 record. */
4225
4226 static bfd_boolean
4227 ieee_write_atn65 (struct ieee_handle *info, unsigned int indx, const char *s)
4228 {
4229 return (ieee_write_2bytes (info, (int) ieee_atn_record_enum)
4230 && ieee_write_number (info, indx)
4231 && ieee_write_number (info, 0)
4232 && ieee_write_number (info, 65)
4233 && ieee_write_id (info, s));
4234 }
4235
4236 /* Push a type index onto the type stack. */
4237
4238 static bfd_boolean
4239 ieee_push_type (struct ieee_handle *info, unsigned int indx,
4240 unsigned int size, bfd_boolean unsignedp, bfd_boolean localp)
4241 {
4242 struct ieee_type_stack *ts;
4243
4244 ts = (struct ieee_type_stack *) xmalloc (sizeof *ts);
4245 memset (ts, 0, sizeof *ts);
4246
4247 ts->type.indx = indx;
4248 ts->type.size = size;
4249 ts->type.unsignedp = unsignedp;
4250 ts->type.localp = localp;
4251
4252 ts->next = info->type_stack;
4253 info->type_stack = ts;
4254
4255 return TRUE;
4256 }
4257
4258 /* Pop a type index off the type stack. */
4259
4260 static unsigned int
4261 ieee_pop_type (struct ieee_handle *info)
4262 {
4263 return ieee_pop_type_used (info, TRUE);
4264 }
4265
4266 /* Pop an unused type index off the type stack. */
4267
4268 static void
4269 ieee_pop_unused_type (struct ieee_handle *info)
4270 {
4271 (void) ieee_pop_type_used (info, FALSE);
4272 }
4273
4274 /* Pop a used or unused type index off the type stack. */
4275
4276 static unsigned int
4277 ieee_pop_type_used (struct ieee_handle *info, bfd_boolean used)
4278 {
4279 struct ieee_type_stack *ts;
4280 unsigned int ret;
4281
4282 ts = info->type_stack;
4283 assert (ts != NULL);
4284
4285 /* If this is a function type, and we need it, we need to append the
4286 actual definition to the typedef block now. */
4287 if (used && ! ieee_buffer_emptyp (&ts->type.fndef))
4288 {
4289 struct ieee_buflist *buflist;
4290
4291 if (ts->type.localp)
4292 {
4293 /* Make sure we have started the types block. */
4294 if (ieee_buffer_emptyp (&info->types))
4295 {
4296 if (! ieee_change_buffer (info, &info->types)
4297 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4298 || ! ieee_write_byte (info, 1)
4299 || ! ieee_write_number (info, 0)
4300 || ! ieee_write_id (info, info->modname))
4301 return FALSE;
4302 }
4303 buflist = &info->types;
4304 }
4305 else
4306 {
4307 /* Make sure we started the global type block. */
4308 if (ieee_buffer_emptyp (&info->global_types))
4309 {
4310 if (! ieee_change_buffer (info, &info->global_types)
4311 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4312 || ! ieee_write_byte (info, 2)
4313 || ! ieee_write_number (info, 0)
4314 || ! ieee_write_id (info, ""))
4315 return FALSE;
4316 }
4317 buflist = &info->global_types;
4318 }
4319
4320 if (! ieee_append_buffer (info, buflist, &ts->type.fndef))
4321 return FALSE;
4322 }
4323
4324 ret = ts->type.indx;
4325 info->type_stack = ts->next;
4326 free (ts);
4327 return ret;
4328 }
4329
4330 /* Add a range of bytes included in the current compilation unit. */
4331
4332 static bfd_boolean
4333 ieee_add_range (struct ieee_handle *info, bfd_boolean global, bfd_vma low,
4334 bfd_vma high)
4335 {
4336 struct ieee_range **plist, *r, **pr;
4337
4338 if (low == (bfd_vma) -1 || high == (bfd_vma) -1 || low == high)
4339 return TRUE;
4340
4341 if (global)
4342 plist = &info->global_ranges;
4343 else
4344 plist = &info->ranges;
4345
4346 for (r = *plist; r != NULL; r = r->next)
4347 {
4348 if (high >= r->low && low <= r->high)
4349 {
4350 /* The new range overlaps r. */
4351 if (low < r->low)
4352 r->low = low;
4353 if (high > r->high)
4354 r->high = high;
4355 pr = &r->next;
4356 while (*pr != NULL && (*pr)->low <= r->high)
4357 {
4358 struct ieee_range *n;
4359
4360 if ((*pr)->high > r->high)
4361 r->high = (*pr)->high;
4362 n = (*pr)->next;
4363 free (*pr);
4364 *pr = n;
4365 }
4366 return TRUE;
4367 }
4368 }
4369
4370 r = (struct ieee_range *) xmalloc (sizeof *r);
4371 memset (r, 0, sizeof *r);
4372
4373 r->low = low;
4374 r->high = high;
4375
4376 /* Store the ranges sorted by address. */
4377 for (pr = plist; *pr != NULL; pr = &(*pr)->next)
4378 if ((*pr)->low > high)
4379 break;
4380 r->next = *pr;
4381 *pr = r;
4382
4383 return TRUE;
4384 }
4385
4386 /* Start a new range for which we only have the low address. */
4387
4388 static bfd_boolean
4389 ieee_start_range (struct ieee_handle *info, bfd_vma low)
4390 {
4391 struct ieee_range *r;
4392
4393 r = (struct ieee_range *) xmalloc (sizeof *r);
4394 memset (r, 0, sizeof *r);
4395 r->low = low;
4396 r->next = info->pending_ranges;
4397 info->pending_ranges = r;
4398 return TRUE;
4399 }
4400
4401 /* Finish a range started by ieee_start_range. */
4402
4403 static bfd_boolean
4404 ieee_end_range (struct ieee_handle *info, bfd_vma high)
4405 {
4406 struct ieee_range *r;
4407 bfd_vma low;
4408
4409 assert (info->pending_ranges != NULL);
4410 r = info->pending_ranges;
4411 low = r->low;
4412 info->pending_ranges = r->next;
4413 free (r);
4414 return ieee_add_range (info, FALSE, low, high);
4415 }
4416
4417 /* Start defining a type. */
4418
4419 static bfd_boolean
4420 ieee_define_type (struct ieee_handle *info, unsigned int size,
4421 bfd_boolean unsignedp, bfd_boolean localp)
4422 {
4423 return ieee_define_named_type (info, (const char *) NULL,
4424 (unsigned int) -1, size, unsignedp,
4425 localp, (struct ieee_buflist *) NULL);
4426 }
4427
4428 /* Start defining a named type. */
4429
4430 static bfd_boolean
4431 ieee_define_named_type (struct ieee_handle *info, const char *name,
4432 unsigned int indx, unsigned int size,
4433 bfd_boolean unsignedp, bfd_boolean localp,
4434 struct ieee_buflist *buflist)
4435 {
4436 unsigned int type_indx;
4437 unsigned int name_indx;
4438
4439 if (indx != (unsigned int) -1)
4440 type_indx = indx;
4441 else
4442 {
4443 type_indx = info->type_indx;
4444 ++info->type_indx;
4445 }
4446
4447 name_indx = info->name_indx;
4448 ++info->name_indx;
4449
4450 if (name == NULL)
4451 name = "";
4452
4453 /* If we were given a buffer, use it; otherwise, use either the
4454 local or the global type information, and make sure that the type
4455 block is started. */
4456 if (buflist != NULL)
4457 {
4458 if (! ieee_change_buffer (info, buflist))
4459 return FALSE;
4460 }
4461 else if (localp)
4462 {
4463 if (! ieee_buffer_emptyp (&info->types))
4464 {
4465 if (! ieee_change_buffer (info, &info->types))
4466 return FALSE;
4467 }
4468 else
4469 {
4470 if (! ieee_change_buffer (info, &info->types)
4471 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4472 || ! ieee_write_byte (info, 1)
4473 || ! ieee_write_number (info, 0)
4474 || ! ieee_write_id (info, info->modname))
4475 return FALSE;
4476 }
4477 }
4478 else
4479 {
4480 if (! ieee_buffer_emptyp (&info->global_types))
4481 {
4482 if (! ieee_change_buffer (info, &info->global_types))
4483 return FALSE;
4484 }
4485 else
4486 {
4487 if (! ieee_change_buffer (info, &info->global_types)
4488 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4489 || ! ieee_write_byte (info, 2)
4490 || ! ieee_write_number (info, 0)
4491 || ! ieee_write_id (info, ""))
4492 return FALSE;
4493 }
4494 }
4495
4496 /* Push the new type on the type stack, write out an NN record, and
4497 write out the start of a TY record. The caller will then finish
4498 the TY record. */
4499 if (! ieee_push_type (info, type_indx, size, unsignedp, localp))
4500 return FALSE;
4501
4502 return (ieee_write_byte (info, (int) ieee_nn_record)
4503 && ieee_write_number (info, name_indx)
4504 && ieee_write_id (info, name)
4505 && ieee_write_byte (info, (int) ieee_ty_record_enum)
4506 && ieee_write_number (info, type_indx)
4507 && ieee_write_byte (info, 0xce)
4508 && ieee_write_number (info, name_indx));
4509 }
4510
4511 /* Get an entry to the list of modified versions of a type. */
4512
4513 static struct ieee_modified_type *
4514 ieee_get_modified_info (struct ieee_handle *info, unsigned int indx)
4515 {
4516 if (indx >= info->modified_alloc)
4517 {
4518 unsigned int nalloc;
4519
4520 nalloc = info->modified_alloc;
4521 if (nalloc == 0)
4522 nalloc = 16;
4523 while (indx >= nalloc)
4524 nalloc *= 2;
4525 info->modified = ((struct ieee_modified_type *)
4526 xrealloc (info->modified,
4527 nalloc * sizeof *info->modified));
4528 memset (info->modified + info->modified_alloc, 0,
4529 (nalloc - info->modified_alloc) * sizeof *info->modified);
4530 info->modified_alloc = nalloc;
4531 }
4532
4533 return info->modified + indx;
4534 }
4535 \f
4536 /* Routines for the hash table mapping names to types. */
4537
4538 /* Initialize an entry in the hash table. */
4539
4540 static struct bfd_hash_entry *
4541 ieee_name_type_newfunc (struct bfd_hash_entry *entry,
4542 struct bfd_hash_table *table, const char *string)
4543 {
4544 struct ieee_name_type_hash_entry *ret =
4545 (struct ieee_name_type_hash_entry *) entry;
4546
4547 /* Allocate the structure if it has not already been allocated by a
4548 subclass. */
4549 if (ret == NULL)
4550 ret = ((struct ieee_name_type_hash_entry *)
4551 bfd_hash_allocate (table, sizeof *ret));
4552 if (ret == NULL)
4553 return NULL;
4554
4555 /* Call the allocation method of the superclass. */
4556 ret = ((struct ieee_name_type_hash_entry *)
4557 bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string));
4558 if (ret)
4559 {
4560 /* Set local fields. */
4561 ret->types = NULL;
4562 }
4563
4564 return (struct bfd_hash_entry *) ret;
4565 }
4566
4567 /* Look up an entry in the hash table. */
4568
4569 #define ieee_name_type_hash_lookup(table, string, create, copy) \
4570 ((struct ieee_name_type_hash_entry *) \
4571 bfd_hash_lookup (&(table)->root, (string), (create), (copy)))
4572
4573 /* Traverse the hash table. */
4574
4575 #define ieee_name_type_hash_traverse(table, func, info) \
4576 (bfd_hash_traverse \
4577 (&(table)->root, \
4578 (bfd_boolean (*) (struct bfd_hash_entry *, void *)) (func), \
4579 (info)))
4580 \f
4581 /* The general routine to write out IEEE debugging information. */
4582
4583 bfd_boolean
4584 write_ieee_debugging_info (bfd *abfd, void *dhandle)
4585 {
4586 struct ieee_handle info;
4587 asection *s;
4588 const char *err;
4589 struct ieee_buf *b;
4590
4591 memset (&info, 0, sizeof info);
4592 info.abfd = abfd;
4593 info.type_indx = 256;
4594 info.name_indx = 32;
4595
4596 if (! bfd_hash_table_init (&info.typedefs.root, ieee_name_type_newfunc)
4597 || ! bfd_hash_table_init (&info.tags.root, ieee_name_type_newfunc))
4598 return FALSE;
4599
4600 if (! ieee_init_buffer (&info, &info.global_types)
4601 || ! ieee_init_buffer (&info, &info.data)
4602 || ! ieee_init_buffer (&info, &info.types)
4603 || ! ieee_init_buffer (&info, &info.vars)
4604 || ! ieee_init_buffer (&info, &info.cxx)
4605 || ! ieee_init_buffer (&info, &info.linenos)
4606 || ! ieee_init_buffer (&info, &info.fntype)
4607 || ! ieee_init_buffer (&info, &info.fnargs))
4608 return FALSE;
4609
4610 if (! debug_write (dhandle, &ieee_fns, (void *) &info))
4611 return FALSE;
4612
4613 if (info.filename != NULL)
4614 {
4615 if (! ieee_finish_compilation_unit (&info))
4616 return FALSE;
4617 }
4618
4619 /* Put any undefined tags in the global typedef information. */
4620 info.error = FALSE;
4621 ieee_name_type_hash_traverse (&info.tags,
4622 ieee_write_undefined_tag,
4623 (void *) &info);
4624 if (info.error)
4625 return FALSE;
4626
4627 /* Prepend the global typedef information to the other data. */
4628 if (! ieee_buffer_emptyp (&info.global_types))
4629 {
4630 /* The HP debugger seems to have a bug in which it ignores the
4631 last entry in the global types, so we add a dummy entry. */
4632 if (! ieee_change_buffer (&info, &info.global_types)
4633 || ! ieee_write_byte (&info, (int) ieee_nn_record)
4634 || ! ieee_write_number (&info, info.name_indx)
4635 || ! ieee_write_id (&info, "")
4636 || ! ieee_write_byte (&info, (int) ieee_ty_record_enum)
4637 || ! ieee_write_number (&info, info.type_indx)
4638 || ! ieee_write_byte (&info, 0xce)
4639 || ! ieee_write_number (&info, info.name_indx)
4640 || ! ieee_write_number (&info, 'P')
4641 || ! ieee_write_number (&info, (int) builtin_void + 32)
4642 || ! ieee_write_byte (&info, (int) ieee_be_record_enum))
4643 return FALSE;
4644
4645 if (! ieee_append_buffer (&info, &info.global_types, &info.data))
4646 return FALSE;
4647 info.data = info.global_types;
4648 }
4649
4650 /* Make sure that we have declare BB11 blocks for each range in the
4651 file. They are added to info->vars. */
4652 info.error = FALSE;
4653 if (! ieee_init_buffer (&info, &info.vars))
4654 return FALSE;
4655 bfd_map_over_sections (abfd, ieee_add_bb11_blocks, (void *) &info);
4656 if (info.error)
4657 return FALSE;
4658 if (! ieee_buffer_emptyp (&info.vars))
4659 {
4660 if (! ieee_change_buffer (&info, &info.vars)
4661 || ! ieee_write_byte (&info, (int) ieee_be_record_enum))
4662 return FALSE;
4663
4664 if (! ieee_append_buffer (&info, &info.data, &info.vars))
4665 return FALSE;
4666 }
4667
4668 /* Now all the data is in info.data. Write it out to the BFD. We
4669 normally would need to worry about whether all the other sections
4670 are set up yet, but the IEEE backend will handle this particular
4671 case correctly regardless. */
4672 if (ieee_buffer_emptyp (&info.data))
4673 {
4674 /* There is no debugging information. */
4675 return TRUE;
4676 }
4677 err = NULL;
4678 s = bfd_make_section (abfd, ".debug");
4679 if (s == NULL)
4680 err = "bfd_make_section";
4681 if (err == NULL)
4682 {
4683 if (! bfd_set_section_flags (abfd, s, SEC_DEBUGGING | SEC_HAS_CONTENTS))
4684 err = "bfd_set_section_flags";
4685 }
4686 if (err == NULL)
4687 {
4688 bfd_size_type size;
4689
4690 size = 0;
4691 for (b = info.data.head; b != NULL; b = b->next)
4692 size += b->c;
4693 if (! bfd_set_section_size (abfd, s, size))
4694 err = "bfd_set_section_size";
4695 }
4696 if (err == NULL)
4697 {
4698 file_ptr offset;
4699
4700 offset = 0;
4701 for (b = info.data.head; b != NULL; b = b->next)
4702 {
4703 if (! bfd_set_section_contents (abfd, s, b->buf, offset, b->c))
4704 {
4705 err = "bfd_set_section_contents";
4706 break;
4707 }
4708 offset += b->c;
4709 }
4710 }
4711
4712 if (err != NULL)
4713 {
4714 fprintf (stderr, "%s: %s: %s\n", bfd_get_filename (abfd), err,
4715 bfd_errmsg (bfd_get_error ()));
4716 return FALSE;
4717 }
4718
4719 bfd_hash_table_free (&info.typedefs.root);
4720 bfd_hash_table_free (&info.tags.root);
4721
4722 return TRUE;
4723 }
4724
4725 /* Write out information for an undefined tag. This is called via
4726 ieee_name_type_hash_traverse. */
4727
4728 static bfd_boolean
4729 ieee_write_undefined_tag (struct ieee_name_type_hash_entry *h, void *p)
4730 {
4731 struct ieee_handle *info = (struct ieee_handle *) p;
4732 struct ieee_name_type *nt;
4733
4734 for (nt = h->types; nt != NULL; nt = nt->next)
4735 {
4736 unsigned int name_indx;
4737 char code;
4738
4739 if (nt->kind == DEBUG_KIND_ILLEGAL)
4740 continue;
4741
4742 if (ieee_buffer_emptyp (&info->global_types))
4743 {
4744 if (! ieee_change_buffer (info, &info->global_types)
4745 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4746 || ! ieee_write_byte (info, 2)
4747 || ! ieee_write_number (info, 0)
4748 || ! ieee_write_id (info, ""))
4749 {
4750 info->error = TRUE;
4751 return FALSE;
4752 }
4753 }
4754 else
4755 {
4756 if (! ieee_change_buffer (info, &info->global_types))
4757 {
4758 info->error = TRUE;
4759 return FALSE;
4760 }
4761 }
4762
4763 name_indx = info->name_indx;
4764 ++info->name_indx;
4765 if (! ieee_write_byte (info, (int) ieee_nn_record)
4766 || ! ieee_write_number (info, name_indx)
4767 || ! ieee_write_id (info, nt->type.name)
4768 || ! ieee_write_byte (info, (int) ieee_ty_record_enum)
4769 || ! ieee_write_number (info, nt->type.indx)
4770 || ! ieee_write_byte (info, 0xce)
4771 || ! ieee_write_number (info, name_indx))
4772 {
4773 info->error = TRUE;
4774 return FALSE;
4775 }
4776
4777 switch (nt->kind)
4778 {
4779 default:
4780 abort ();
4781 info->error = TRUE;
4782 return FALSE;
4783 case DEBUG_KIND_STRUCT:
4784 case DEBUG_KIND_CLASS:
4785 code = 'S';
4786 break;
4787 case DEBUG_KIND_UNION:
4788 case DEBUG_KIND_UNION_CLASS:
4789 code = 'U';
4790 break;
4791 case DEBUG_KIND_ENUM:
4792 code = 'E';
4793 break;
4794 }
4795 if (! ieee_write_number (info, code)
4796 || ! ieee_write_number (info, 0))
4797 {
4798 info->error = TRUE;
4799 return FALSE;
4800 }
4801 }
4802
4803 return TRUE;
4804 }
4805
4806 /* Start writing out information for a compilation unit. */
4807
4808 static bfd_boolean
4809 ieee_start_compilation_unit (void *p, const char *filename)
4810 {
4811 struct ieee_handle *info = (struct ieee_handle *) p;
4812 const char *modname;
4813 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
4814 const char *backslash;
4815 #endif
4816 char *c, *s;
4817 unsigned int nindx;
4818
4819 if (info->filename != NULL)
4820 {
4821 if (! ieee_finish_compilation_unit (info))
4822 return FALSE;
4823 }
4824
4825 info->filename = filename;
4826 modname = strrchr (filename, '/');
4827 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
4828 /* We could have a mixed forward/back slash case. */
4829 backslash = strrchr (filename, '\\');
4830 if (modname == NULL || (backslash != NULL && backslash > modname))
4831 modname = backslash;
4832 #endif
4833
4834 if (modname != NULL)
4835 ++modname;
4836 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
4837 else if (filename[0] && filename[1] == ':')
4838 modname = filename + 2;
4839 #endif
4840 else
4841 modname = filename;
4842
4843 c = xstrdup (modname);
4844 s = strrchr (c, '.');
4845 if (s != NULL)
4846 *s = '\0';
4847 info->modname = c;
4848
4849 if (! ieee_init_buffer (info, &info->types)
4850 || ! ieee_init_buffer (info, &info->vars)
4851 || ! ieee_init_buffer (info, &info->cxx)
4852 || ! ieee_init_buffer (info, &info->linenos))
4853 return FALSE;
4854 info->ranges = NULL;
4855
4856 /* Always include a BB1 and a BB3 block. That is what the output of
4857 the MRI linker seems to look like. */
4858 if (! ieee_change_buffer (info, &info->types)
4859 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4860 || ! ieee_write_byte (info, 1)
4861 || ! ieee_write_number (info, 0)
4862 || ! ieee_write_id (info, info->modname))
4863 return FALSE;
4864
4865 nindx = info->name_indx;
4866 ++info->name_indx;
4867 if (! ieee_change_buffer (info, &info->vars)
4868 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4869 || ! ieee_write_byte (info, 3)
4870 || ! ieee_write_number (info, 0)
4871 || ! ieee_write_id (info, info->modname))
4872 return FALSE;
4873
4874 return TRUE;
4875 }
4876
4877 /* Finish up a compilation unit. */
4878
4879 static bfd_boolean
4880 ieee_finish_compilation_unit (struct ieee_handle *info)
4881 {
4882 struct ieee_range *r;
4883
4884 if (! ieee_buffer_emptyp (&info->types))
4885 {
4886 if (! ieee_change_buffer (info, &info->types)
4887 || ! ieee_write_byte (info, (int) ieee_be_record_enum))
4888 return FALSE;
4889 }
4890
4891 if (! ieee_buffer_emptyp (&info->cxx))
4892 {
4893 /* Append any C++ information to the global function and
4894 variable information. */
4895 assert (! ieee_buffer_emptyp (&info->vars));
4896 if (! ieee_change_buffer (info, &info->vars))
4897 return FALSE;
4898
4899 /* We put the pmisc records in a dummy procedure, just as the
4900 MRI compiler does. */
4901 if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
4902 || ! ieee_write_byte (info, 6)
4903 || ! ieee_write_number (info, 0)
4904 || ! ieee_write_id (info, "__XRYCPP")
4905 || ! ieee_write_number (info, 0)
4906 || ! ieee_write_number (info, 0)
4907 || ! ieee_write_number (info, info->highaddr - 1)
4908 || ! ieee_append_buffer (info, &info->vars, &info->cxx)
4909 || ! ieee_change_buffer (info, &info->vars)
4910 || ! ieee_write_byte (info, (int) ieee_be_record_enum)
4911 || ! ieee_write_number (info, info->highaddr - 1))
4912 return FALSE;
4913 }
4914
4915 if (! ieee_buffer_emptyp (&info->vars))
4916 {
4917 if (! ieee_change_buffer (info, &info->vars)
4918 || ! ieee_write_byte (info, (int) ieee_be_record_enum))
4919 return FALSE;
4920 }
4921
4922 if (info->pending_lineno_filename != NULL)
4923 {
4924 /* Force out the pending line number. */
4925 if (! ieee_lineno ((void *) info, (const char *) NULL, 0, (bfd_vma) -1))
4926 return FALSE;
4927 }
4928 if (! ieee_buffer_emptyp (&info->linenos))
4929 {
4930 if (! ieee_change_buffer (info, &info->linenos)
4931 || ! ieee_write_byte (info, (int) ieee_be_record_enum))
4932 return FALSE;
4933 if (strcmp (info->filename, info->lineno_filename) != 0)
4934 {
4935 /* We were not in the main file. We just closed the
4936 included line number block, and now we must close the
4937 main line number block. */
4938 if (! ieee_write_byte (info, (int) ieee_be_record_enum))
4939 return FALSE;
4940 }
4941 }
4942
4943 if (! ieee_append_buffer (info, &info->data, &info->types)
4944 || ! ieee_append_buffer (info, &info->data, &info->vars)
4945 || ! ieee_append_buffer (info, &info->data, &info->linenos))
4946 return FALSE;
4947
4948 /* Build BB10/BB11 blocks based on the ranges we recorded. */
4949 if (! ieee_change_buffer (info, &info->data))
4950 return FALSE;
4951
4952 if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
4953 || ! ieee_write_byte (info, 10)
4954 || ! ieee_write_number (info, 0)
4955 || ! ieee_write_id (info, info->modname)
4956 || ! ieee_write_id (info, "")
4957 || ! ieee_write_number (info, 0)
4958 || ! ieee_write_id (info, "GNU objcopy"))
4959 return FALSE;
4960
4961 for (r = info->ranges; r != NULL; r = r->next)
4962 {
4963 bfd_vma low, high;
4964 asection *s;
4965 int kind;
4966
4967 low = r->low;
4968 high = r->high;
4969
4970 /* Find the section corresponding to this range. */
4971 for (s = info->abfd->sections; s != NULL; s = s->next)
4972 {
4973 if (bfd_get_section_vma (info->abfd, s) <= low
4974 && high <= (bfd_get_section_vma (info->abfd, s)
4975 + bfd_section_size (info->abfd, s)))
4976 break;
4977 }
4978
4979 if (s == NULL)
4980 {
4981 /* Just ignore this range. */
4982 continue;
4983 }
4984
4985 /* Coalesce ranges if it seems reasonable. */
4986 while (r->next != NULL
4987 && high + 0x1000 >= r->next->low
4988 && (r->next->high
4989 <= (bfd_get_section_vma (info->abfd, s)
4990 + bfd_section_size (info->abfd, s))))
4991 {
4992 r = r->next;
4993 high = r->high;
4994 }
4995
4996 if ((s->flags & SEC_CODE) != 0)
4997 kind = 1;
4998 else if ((s->flags & SEC_READONLY) != 0)
4999 kind = 3;
5000 else
5001 kind = 2;
5002
5003 if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
5004 || ! ieee_write_byte (info, 11)
5005 || ! ieee_write_number (info, 0)
5006 || ! ieee_write_id (info, "")
5007 || ! ieee_write_number (info, kind)
5008 || ! ieee_write_number (info, s->index + IEEE_SECTION_NUMBER_BASE)
5009 || ! ieee_write_number (info, low)
5010 || ! ieee_write_byte (info, (int) ieee_be_record_enum)
5011 || ! ieee_write_number (info, high - low))
5012 return FALSE;
5013
5014 /* Add this range to the list of global ranges. */
5015 if (! ieee_add_range (info, TRUE, low, high))
5016 return FALSE;
5017 }
5018
5019 if (! ieee_write_byte (info, (int) ieee_be_record_enum))
5020 return FALSE;
5021
5022 return TRUE;
5023 }
5024
5025 /* Add BB11 blocks describing each range that we have not already
5026 described. */
5027
5028 static void
5029 ieee_add_bb11_blocks (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *data)
5030 {
5031 struct ieee_handle *info = (struct ieee_handle *) data;
5032 bfd_vma low, high;
5033 struct ieee_range *r;
5034
5035 low = bfd_get_section_vma (abfd, sec);
5036 high = low + bfd_section_size (abfd, sec);
5037
5038 /* Find the first range at or after this section. The ranges are
5039 sorted by address. */
5040 for (r = info->global_ranges; r != NULL; r = r->next)
5041 if (r->high > low)
5042 break;
5043
5044 while (low < high)
5045 {
5046 if (r == NULL || r->low >= high)
5047 {
5048 if (! ieee_add_bb11 (info, sec, low, high))
5049 info->error = TRUE;
5050 return;
5051 }
5052
5053 if (low < r->low
5054 && r->low - low > 0x100)
5055 {
5056 if (! ieee_add_bb11 (info, sec, low, r->low))
5057 {
5058 info->error = TRUE;
5059 return;
5060 }
5061 }
5062 low = r->high;
5063
5064 r = r->next;
5065 }
5066 }
5067
5068 /* Add a single BB11 block for a range. We add it to info->vars. */
5069
5070 static bfd_boolean
5071 ieee_add_bb11 (struct ieee_handle *info, asection *sec, bfd_vma low,
5072 bfd_vma high)
5073 {
5074 int kind;
5075
5076 if (! ieee_buffer_emptyp (&info->vars))
5077 {
5078 if (! ieee_change_buffer (info, &info->vars))
5079 return FALSE;
5080 }
5081 else
5082 {
5083 const char *filename, *modname;
5084 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
5085 const char *backslash;
5086 #endif
5087 char *c, *s;
5088
5089 /* Start the enclosing BB10 block. */
5090 filename = bfd_get_filename (info->abfd);
5091 modname = strrchr (filename, '/');
5092 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
5093 backslash = strrchr (filename, '\\');
5094 if (modname == NULL || (backslash != NULL && backslash > modname))
5095 modname = backslash;
5096 #endif
5097
5098 if (modname != NULL)
5099 ++modname;
5100 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
5101 else if (filename[0] && filename[1] == ':')
5102 modname = filename + 2;
5103 #endif
5104 else
5105 modname = filename;
5106
5107 c = xstrdup (modname);
5108 s = strrchr (c, '.');
5109 if (s != NULL)
5110 *s = '\0';
5111
5112 if (! ieee_change_buffer (info, &info->vars)
5113 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
5114 || ! ieee_write_byte (info, 10)
5115 || ! ieee_write_number (info, 0)
5116 || ! ieee_write_id (info, c)
5117 || ! ieee_write_id (info, "")
5118 || ! ieee_write_number (info, 0)
5119 || ! ieee_write_id (info, "GNU objcopy"))
5120 return FALSE;
5121
5122 free (c);
5123 }
5124
5125 if ((sec->flags & SEC_CODE) != 0)
5126 kind = 1;
5127 else if ((sec->flags & SEC_READONLY) != 0)
5128 kind = 3;
5129 else
5130 kind = 2;
5131
5132 if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
5133 || ! ieee_write_byte (info, 11)
5134 || ! ieee_write_number (info, 0)
5135 || ! ieee_write_id (info, "")
5136 || ! ieee_write_number (info, kind)
5137 || ! ieee_write_number (info, sec->index + IEEE_SECTION_NUMBER_BASE)
5138 || ! ieee_write_number (info, low)
5139 || ! ieee_write_byte (info, (int) ieee_be_record_enum)
5140 || ! ieee_write_number (info, high - low))
5141 return FALSE;
5142
5143 return TRUE;
5144 }
5145
5146 /* Start recording information from a particular source file. This is
5147 used to record which file defined which types, variables, etc. It
5148 is not used for line numbers, since the lineno entry point passes
5149 down the file name anyhow. IEEE debugging information doesn't seem
5150 to store this information anywhere. */
5151
5152 static bfd_boolean
5153 ieee_start_source (void *p ATTRIBUTE_UNUSED,
5154 const char *filename ATTRIBUTE_UNUSED)
5155 {
5156 return TRUE;
5157 }
5158
5159 /* Make an empty type. */
5160
5161 static bfd_boolean
5162 ieee_empty_type (void *p)
5163 {
5164 struct ieee_handle *info = (struct ieee_handle *) p;
5165
5166 return ieee_push_type (info, (int) builtin_unknown, 0, FALSE, FALSE);
5167 }
5168
5169 /* Make a void type. */
5170
5171 static bfd_boolean
5172 ieee_void_type (void *p)
5173 {
5174 struct ieee_handle *info = (struct ieee_handle *) p;
5175
5176 return ieee_push_type (info, (int) builtin_void, 0, FALSE, FALSE);
5177 }
5178
5179 /* Make an integer type. */
5180
5181 static bfd_boolean
5182 ieee_int_type (void *p, unsigned int size, bfd_boolean unsignedp)
5183 {
5184 struct ieee_handle *info = (struct ieee_handle *) p;
5185 unsigned int indx;
5186
5187 switch (size)
5188 {
5189 case 1:
5190 indx = (int) builtin_signed_char;
5191 break;
5192 case 2:
5193 indx = (int) builtin_signed_short_int;
5194 break;
5195 case 4:
5196 indx = (int) builtin_signed_long;
5197 break;
5198 case 8:
5199 indx = (int) builtin_signed_long_long;
5200 break;
5201 default:
5202 fprintf (stderr, _("IEEE unsupported integer type size %u\n"), size);
5203 return FALSE;
5204 }
5205
5206 if (unsignedp)
5207 ++indx;
5208
5209 return ieee_push_type (info, indx, size, unsignedp, FALSE);
5210 }
5211
5212 /* Make a floating point type. */
5213
5214 static bfd_boolean
5215 ieee_float_type (void *p, unsigned int size)
5216 {
5217 struct ieee_handle *info = (struct ieee_handle *) p;
5218 unsigned int indx;
5219
5220 switch (size)
5221 {
5222 case 4:
5223 indx = (int) builtin_float;
5224 break;
5225 case 8:
5226 indx = (int) builtin_double;
5227 break;
5228 case 12:
5229 /* FIXME: This size really depends upon the processor. */
5230 indx = (int) builtin_long_double;
5231 break;
5232 case 16:
5233 indx = (int) builtin_long_long_double;
5234 break;
5235 default:
5236 fprintf (stderr, _("IEEE unsupported float type size %u\n"), size);
5237 return FALSE;
5238 }
5239
5240 return ieee_push_type (info, indx, size, FALSE, FALSE);
5241 }
5242
5243 /* Make a complex type. */
5244
5245 static bfd_boolean
5246 ieee_complex_type (void *p, unsigned int size)
5247 {
5248 struct ieee_handle *info = (struct ieee_handle *) p;
5249 char code;
5250
5251 switch (size)
5252 {
5253 case 4:
5254 if (info->complex_float_index != 0)
5255 return ieee_push_type (info, info->complex_float_index, size * 2,
5256 FALSE, FALSE);
5257 code = 'c';
5258 break;
5259 case 12:
5260 case 16:
5261 /* These cases can be output by gcc -gstabs. Outputting the
5262 wrong type is better than crashing. */
5263 case 8:
5264 if (info->complex_double_index != 0)
5265 return ieee_push_type (info, info->complex_double_index, size * 2,
5266 FALSE, FALSE);
5267 code = 'd';
5268 break;
5269 default:
5270 fprintf (stderr, _("IEEE unsupported complex type size %u\n"), size);
5271 return FALSE;
5272 }
5273
5274 /* FIXME: I don't know what the string is for. */
5275 if (! ieee_define_type (info, size * 2, FALSE, FALSE)
5276 || ! ieee_write_number (info, code)
5277 || ! ieee_write_id (info, ""))
5278 return FALSE;
5279
5280 if (size == 4)
5281 info->complex_float_index = info->type_stack->type.indx;
5282 else
5283 info->complex_double_index = info->type_stack->type.indx;
5284
5285 return TRUE;
5286 }
5287
5288 /* Make a boolean type. IEEE doesn't support these, so we just make
5289 an integer type instead. */
5290
5291 static bfd_boolean
5292 ieee_bool_type (void *p, unsigned int size)
5293 {
5294 return ieee_int_type (p, size, TRUE);
5295 }
5296
5297 /* Make an enumeration. */
5298
5299 static bfd_boolean
5300 ieee_enum_type (void *p, const char *tag, const char **names,
5301 bfd_signed_vma *vals)
5302 {
5303 struct ieee_handle *info = (struct ieee_handle *) p;
5304 struct ieee_defined_enum *e;
5305 bfd_boolean localp, simple;
5306 unsigned int indx;
5307 int i = 0;
5308
5309 localp = FALSE;
5310 indx = (unsigned int) -1;
5311 for (e = info->enums; e != NULL; e = e->next)
5312 {
5313 if (tag == NULL)
5314 {
5315 if (e->tag != NULL)
5316 continue;
5317 }
5318 else
5319 {
5320 if (e->tag == NULL
5321 || tag[0] != e->tag[0]
5322 || strcmp (tag, e->tag) != 0)
5323 continue;
5324 }
5325
5326 if (! e->defined)
5327 {
5328 /* This enum tag has been seen but not defined. */
5329 indx = e->indx;
5330 break;
5331 }
5332
5333 if (names != NULL && e->names != NULL)
5334 {
5335 for (i = 0; names[i] != NULL && e->names[i] != NULL; i++)
5336 {
5337 if (names[i][0] != e->names[i][0]
5338 || vals[i] != e->vals[i]
5339 || strcmp (names[i], e->names[i]) != 0)
5340 break;
5341 }
5342 }
5343
5344 if ((names == NULL && e->names == NULL)
5345 || (names != NULL
5346 && e->names != NULL
5347 && names[i] == NULL
5348 && e->names[i] == NULL))
5349 {
5350 /* We've seen this enum before. */
5351 return ieee_push_type (info, e->indx, 0, TRUE, FALSE);
5352 }
5353
5354 if (tag != NULL)
5355 {
5356 /* We've already seen an enum of the same name, so we must make
5357 sure to output this one locally. */
5358 localp = TRUE;
5359 break;
5360 }
5361 }
5362
5363 /* If this is a simple enumeration, in which the values start at 0
5364 and always increment by 1, we can use type E. Otherwise we must
5365 use type N. */
5366
5367 simple = TRUE;
5368 if (names != NULL)
5369 {
5370 for (i = 0; names[i] != NULL; i++)
5371 {
5372 if (vals[i] != i)
5373 {
5374 simple = FALSE;
5375 break;
5376 }
5377 }
5378 }
5379
5380 if (! ieee_define_named_type (info, tag, indx, 0, TRUE, localp,
5381 (struct ieee_buflist *) NULL)
5382 || ! ieee_write_number (info, simple ? 'E' : 'N'))
5383 return FALSE;
5384 if (simple)
5385 {
5386 /* FIXME: This is supposed to be the enumeration size, but we
5387 don't store that. */
5388 if (! ieee_write_number (info, 4))
5389 return FALSE;
5390 }
5391 if (names != NULL)
5392 {
5393 for (i = 0; names[i] != NULL; i++)
5394 {
5395 if (! ieee_write_id (info, names[i]))
5396 return FALSE;
5397 if (! simple)
5398 {
5399 if (! ieee_write_number (info, vals[i]))
5400 return FALSE;
5401 }
5402 }
5403 }
5404
5405 if (! localp)
5406 {
5407 if (indx == (unsigned int) -1)
5408 {
5409 e = (struct ieee_defined_enum *) xmalloc (sizeof *e);
5410 memset (e, 0, sizeof *e);
5411 e->indx = info->type_stack->type.indx;
5412 e->tag = tag;
5413
5414 e->next = info->enums;
5415 info->enums = e;
5416 }
5417
5418 e->names = names;
5419 e->vals = vals;
5420 e->defined = TRUE;
5421 }
5422
5423 return TRUE;
5424 }
5425
5426 /* Make a pointer type. */
5427
5428 static bfd_boolean
5429 ieee_pointer_type (void *p)
5430 {
5431 struct ieee_handle *info = (struct ieee_handle *) p;
5432 bfd_boolean localp;
5433 unsigned int indx;
5434 struct ieee_modified_type *m = NULL;
5435
5436 localp = info->type_stack->type.localp;
5437 indx = ieee_pop_type (info);
5438
5439 /* A pointer to a simple builtin type can be obtained by adding 32.
5440 FIXME: Will this be a short pointer, and will that matter? */
5441 if (indx < 32)
5442 return ieee_push_type (info, indx + 32, 0, TRUE, FALSE);
5443
5444 if (! localp)
5445 {
5446 m = ieee_get_modified_info (p, indx);
5447 if (m == NULL)
5448 return FALSE;
5449
5450 /* FIXME: The size should depend upon the architecture. */
5451 if (m->pointer > 0)
5452 return ieee_push_type (info, m->pointer, 4, TRUE, FALSE);
5453 }
5454
5455 if (! ieee_define_type (info, 4, TRUE, localp)
5456 || ! ieee_write_number (info, 'P')
5457 || ! ieee_write_number (info, indx))
5458 return FALSE;
5459
5460 if (! localp)
5461 m->pointer = info->type_stack->type.indx;
5462
5463 return TRUE;
5464 }
5465
5466 /* Make a function type. This will be called for a method, but we
5467 don't want to actually add it to the type table in that case. We
5468 handle this by defining the type in a private buffer, and only
5469 adding that buffer to the typedef block if we are going to use it. */
5470
5471 static bfd_boolean
5472 ieee_function_type (void *p, int argcount, bfd_boolean varargs)
5473 {
5474 struct ieee_handle *info = (struct ieee_handle *) p;
5475 bfd_boolean localp;
5476 unsigned int *args = NULL;
5477 int i;
5478 unsigned int retindx;
5479 struct ieee_buflist fndef;
5480 struct ieee_modified_type *m;
5481
5482 localp = FALSE;
5483
5484 if (argcount > 0)
5485 {
5486 args = (unsigned int *) xmalloc (argcount * sizeof *args);
5487 for (i = argcount - 1; i >= 0; i--)
5488 {
5489 if (info->type_stack->type.localp)
5490 localp = TRUE;
5491 args[i] = ieee_pop_type (info);
5492 }
5493 }
5494 else if (argcount < 0)
5495 varargs = FALSE;
5496
5497 if (info->type_stack->type.localp)
5498 localp = TRUE;
5499 retindx = ieee_pop_type (info);
5500
5501 m = NULL;
5502 if (argcount < 0 && ! localp)
5503 {
5504 m = ieee_get_modified_info (p, retindx);
5505 if (m == NULL)
5506 return FALSE;
5507
5508 if (m->function > 0)
5509 return ieee_push_type (info, m->function, 0, TRUE, FALSE);
5510 }
5511
5512 /* An attribute of 0x41 means that the frame and push mask are
5513 unknown. */
5514 if (! ieee_init_buffer (info, &fndef)
5515 || ! ieee_define_named_type (info, (const char *) NULL,
5516 (unsigned int) -1, 0, TRUE, localp,
5517 &fndef)
5518 || ! ieee_write_number (info, 'x')
5519 || ! ieee_write_number (info, 0x41)
5520 || ! ieee_write_number (info, 0)
5521 || ! ieee_write_number (info, 0)
5522 || ! ieee_write_number (info, retindx)
5523 || ! ieee_write_number (info, (bfd_vma) argcount + (varargs ? 1 : 0)))
5524 return FALSE;
5525 if (argcount > 0)
5526 {
5527 for (i = 0; i < argcount; i++)
5528 if (! ieee_write_number (info, args[i]))
5529 return FALSE;
5530 free (args);
5531 }
5532 if (varargs)
5533 {
5534 /* A varargs function is represented by writing out the last
5535 argument as type void *, although this makes little sense. */
5536 if (! ieee_write_number (info, (bfd_vma) builtin_void + 32))
5537 return FALSE;
5538 }
5539
5540 if (! ieee_write_number (info, 0))
5541 return FALSE;
5542
5543 /* We wrote the information into fndef, in case we don't need it.
5544 It will be appended to info->types by ieee_pop_type. */
5545 info->type_stack->type.fndef = fndef;
5546
5547 if (m != NULL)
5548 m->function = info->type_stack->type.indx;
5549
5550 return TRUE;
5551 }
5552
5553 /* Make a reference type. */
5554
5555 static bfd_boolean
5556 ieee_reference_type (void *p)
5557 {
5558 struct ieee_handle *info = (struct ieee_handle *) p;
5559
5560 /* IEEE appears to record a normal pointer type, and then use a
5561 pmisc record to indicate that it is really a reference. */
5562
5563 if (! ieee_pointer_type (p))
5564 return FALSE;
5565 info->type_stack->type.referencep = TRUE;
5566 return TRUE;
5567 }
5568
5569 /* Make a range type. */
5570
5571 static bfd_boolean
5572 ieee_range_type (void *p, bfd_signed_vma low, bfd_signed_vma high)
5573 {
5574 struct ieee_handle *info = (struct ieee_handle *) p;
5575 unsigned int size;
5576 bfd_boolean unsignedp, localp;
5577
5578 size = info->type_stack->type.size;
5579 unsignedp = info->type_stack->type.unsignedp;
5580 localp = info->type_stack->type.localp;
5581 ieee_pop_unused_type (info);
5582 return (ieee_define_type (info, size, unsignedp, localp)
5583 && ieee_write_number (info, 'R')
5584 && ieee_write_number (info, (bfd_vma) low)
5585 && ieee_write_number (info, (bfd_vma) high)
5586 && ieee_write_number (info, unsignedp ? 0 : 1)
5587 && ieee_write_number (info, size));
5588 }
5589
5590 /* Make an array type. */
5591
5592 static bfd_boolean
5593 ieee_array_type (void *p, bfd_signed_vma low, bfd_signed_vma high,
5594 bfd_boolean stringp ATTRIBUTE_UNUSED)
5595 {
5596 struct ieee_handle *info = (struct ieee_handle *) p;
5597 unsigned int eleindx;
5598 bfd_boolean localp;
5599 unsigned int size;
5600 struct ieee_modified_type *m = NULL;
5601 struct ieee_modified_array_type *a;
5602
5603 /* IEEE does not store the range, so we just ignore it. */
5604 ieee_pop_unused_type (info);
5605 localp = info->type_stack->type.localp;
5606 size = info->type_stack->type.size;
5607 eleindx = ieee_pop_type (info);
5608
5609 /* If we don't know the range, treat the size as exactly one
5610 element. */
5611 if (low < high)
5612 size *= (high - low) + 1;
5613
5614 if (! localp)
5615 {
5616 m = ieee_get_modified_info (info, eleindx);
5617 if (m == NULL)
5618 return FALSE;
5619
5620 for (a = m->arrays; a != NULL; a = a->next)
5621 {
5622 if (a->low == low && a->high == high)
5623 return ieee_push_type (info, a->indx, size, FALSE, FALSE);
5624 }
5625 }
5626
5627 if (! ieee_define_type (info, size, FALSE, localp)
5628 || ! ieee_write_number (info, low == 0 ? 'Z' : 'C')
5629 || ! ieee_write_number (info, eleindx))
5630 return FALSE;
5631 if (low != 0)
5632 {
5633 if (! ieee_write_number (info, low))
5634 return FALSE;
5635 }
5636
5637 if (! ieee_write_number (info, high + 1))
5638 return FALSE;
5639
5640 if (! localp)
5641 {
5642 a = (struct ieee_modified_array_type *) xmalloc (sizeof *a);
5643 memset (a, 0, sizeof *a);
5644
5645 a->indx = info->type_stack->type.indx;
5646 a->low = low;
5647 a->high = high;
5648
5649 a->next = m->arrays;
5650 m->arrays = a;
5651 }
5652
5653 return TRUE;
5654 }
5655
5656 /* Make a set type. */
5657
5658 static bfd_boolean
5659 ieee_set_type (void *p, bfd_boolean bitstringp ATTRIBUTE_UNUSED)
5660 {
5661 struct ieee_handle *info = (struct ieee_handle *) p;
5662 bfd_boolean localp;
5663 unsigned int eleindx;
5664
5665 localp = info->type_stack->type.localp;
5666 eleindx = ieee_pop_type (info);
5667
5668 /* FIXME: We don't know the size, so we just use 4. */
5669
5670 return (ieee_define_type (info, 0, TRUE, localp)
5671 && ieee_write_number (info, 's')
5672 && ieee_write_number (info, 4)
5673 && ieee_write_number (info, eleindx));
5674 }
5675
5676 /* Make an offset type. */
5677
5678 static bfd_boolean
5679 ieee_offset_type (void *p)
5680 {
5681 struct ieee_handle *info = (struct ieee_handle *) p;
5682 unsigned int targetindx, baseindx;
5683
5684 targetindx = ieee_pop_type (info);
5685 baseindx = ieee_pop_type (info);
5686
5687 /* FIXME: The MRI C++ compiler does not appear to generate any
5688 useful type information about an offset type. It just records a
5689 pointer to member as an integer. The MRI/HP IEEE spec does
5690 describe a pmisc record which can be used for a pointer to
5691 member. Unfortunately, it does not describe the target type,
5692 which seems pretty important. I'm going to punt this for now. */
5693
5694 return ieee_int_type (p, 4, TRUE);
5695 }
5696
5697 /* Make a method type. */
5698
5699 static bfd_boolean
5700 ieee_method_type (void *p, bfd_boolean domain, int argcount,
5701 bfd_boolean varargs)
5702 {
5703 struct ieee_handle *info = (struct ieee_handle *) p;
5704
5705 /* FIXME: The MRI/HP IEEE spec defines a pmisc record to use for a
5706 method, but the definition is incomplete. We just output an 'x'
5707 type. */
5708
5709 if (domain)
5710 ieee_pop_unused_type (info);
5711
5712 return ieee_function_type (p, argcount, varargs);
5713 }
5714
5715 /* Make a const qualified type. */
5716
5717 static bfd_boolean
5718 ieee_const_type (void *p)
5719 {
5720 struct ieee_handle *info = (struct ieee_handle *) p;
5721 unsigned int size;
5722 bfd_boolean unsignedp, localp;
5723 unsigned int indx;
5724 struct ieee_modified_type *m = NULL;
5725
5726 size = info->type_stack->type.size;
5727 unsignedp = info->type_stack->type.unsignedp;
5728 localp = info->type_stack->type.localp;
5729 indx = ieee_pop_type (info);
5730
5731 if (! localp)
5732 {
5733 m = ieee_get_modified_info (info, indx);
5734 if (m == NULL)
5735 return FALSE;
5736
5737 if (m->const_qualified > 0)
5738 return ieee_push_type (info, m->const_qualified, size, unsignedp,
5739 FALSE);
5740 }
5741
5742 if (! ieee_define_type (info, size, unsignedp, localp)
5743 || ! ieee_write_number (info, 'n')
5744 || ! ieee_write_number (info, 1)
5745 || ! ieee_write_number (info, indx))
5746 return FALSE;
5747
5748 if (! localp)
5749 m->const_qualified = info->type_stack->type.indx;
5750
5751 return TRUE;
5752 }
5753
5754 /* Make a volatile qualified type. */
5755
5756 static bfd_boolean
5757 ieee_volatile_type (void *p)
5758 {
5759 struct ieee_handle *info = (struct ieee_handle *) p;
5760 unsigned int size;
5761 bfd_boolean unsignedp, localp;
5762 unsigned int indx;
5763 struct ieee_modified_type *m = NULL;
5764
5765 size = info->type_stack->type.size;
5766 unsignedp = info->type_stack->type.unsignedp;
5767 localp = info->type_stack->type.localp;
5768 indx = ieee_pop_type (info);
5769
5770 if (! localp)
5771 {
5772 m = ieee_get_modified_info (info, indx);
5773 if (m == NULL)
5774 return FALSE;
5775
5776 if (m->volatile_qualified > 0)
5777 return ieee_push_type (info, m->volatile_qualified, size, unsignedp,
5778 FALSE);
5779 }
5780
5781 if (! ieee_define_type (info, size, unsignedp, localp)
5782 || ! ieee_write_number (info, 'n')
5783 || ! ieee_write_number (info, 2)
5784 || ! ieee_write_number (info, indx))
5785 return FALSE;
5786
5787 if (! localp)
5788 m->volatile_qualified = info->type_stack->type.indx;
5789
5790 return TRUE;
5791 }
5792
5793 /* Convert an enum debug_visibility into a CXXFLAGS value. */
5794
5795 static unsigned int
5796 ieee_vis_to_flags (enum debug_visibility visibility)
5797 {
5798 switch (visibility)
5799 {
5800 default:
5801 abort ();
5802 case DEBUG_VISIBILITY_PUBLIC:
5803 return CXXFLAGS_VISIBILITY_PUBLIC;
5804 case DEBUG_VISIBILITY_PRIVATE:
5805 return CXXFLAGS_VISIBILITY_PRIVATE;
5806 case DEBUG_VISIBILITY_PROTECTED:
5807 return CXXFLAGS_VISIBILITY_PROTECTED;
5808 }
5809 /*NOTREACHED*/
5810 }
5811
5812 /* Start defining a struct type. We build it in the strdef field on
5813 the stack, to avoid confusing type definitions required by the
5814 fields with the struct type itself. */
5815
5816 static bfd_boolean
5817 ieee_start_struct_type (void *p, const char *tag, unsigned int id,
5818 bfd_boolean structp, unsigned int size)
5819 {
5820 struct ieee_handle *info = (struct ieee_handle *) p;
5821 bfd_boolean localp, ignorep;
5822 bfd_boolean copy;
5823 char ab[20];
5824 const char *look;
5825 struct ieee_name_type_hash_entry *h;
5826 struct ieee_name_type *nt, *ntlook;
5827 struct ieee_buflist strdef;
5828
5829 localp = FALSE;
5830 ignorep = FALSE;
5831
5832 /* We need to create a tag for internal use even if we don't want
5833 one for external use. This will let us refer to an anonymous
5834 struct. */
5835 if (tag != NULL)
5836 {
5837 look = tag;
5838 copy = FALSE;
5839 }
5840 else
5841 {
5842 sprintf (ab, "__anon%u", id);
5843 look = ab;
5844 copy = TRUE;
5845 }
5846
5847 /* If we already have references to the tag, we must use the
5848 existing type index. */
5849 h = ieee_name_type_hash_lookup (&info->tags, look, TRUE, copy);
5850 if (h == NULL)
5851 return FALSE;
5852
5853 nt = NULL;
5854 for (ntlook = h->types; ntlook != NULL; ntlook = ntlook->next)
5855 {
5856 if (ntlook->id == id)
5857 nt = ntlook;
5858 else if (! ntlook->type.localp)
5859 {
5860 /* We are creating a duplicate definition of a globally
5861 defined tag. Force it to be local to avoid
5862 confusion. */
5863 localp = TRUE;
5864 }
5865 }
5866
5867 if (nt != NULL)
5868 {
5869 assert (localp == nt->type.localp);
5870 if (nt->kind == DEBUG_KIND_ILLEGAL && ! localp)
5871 {
5872 /* We've already seen a global definition of the type.
5873 Ignore this new definition. */
5874 ignorep = TRUE;
5875 }
5876 }
5877 else
5878 {
5879 nt = (struct ieee_name_type *) xmalloc (sizeof *nt);
5880 memset (nt, 0, sizeof *nt);
5881 nt->id = id;
5882 nt->type.name = h->root.string;
5883 nt->next = h->types;
5884 h->types = nt;
5885 nt->type.indx = info->type_indx;
5886 ++info->type_indx;
5887 }
5888
5889 nt->kind = DEBUG_KIND_ILLEGAL;
5890
5891 if (! ieee_init_buffer (info, &strdef)
5892 || ! ieee_define_named_type (info, tag, nt->type.indx, size, TRUE,
5893 localp, &strdef)
5894 || ! ieee_write_number (info, structp ? 'S' : 'U')
5895 || ! ieee_write_number (info, size))
5896 return FALSE;
5897
5898 if (! ignorep)
5899 {
5900 const char *hold;
5901
5902 /* We never want nt->type.name to be NULL. We want the rest of
5903 the type to be the object set up on the type stack; it will
5904 have a NULL name if tag is NULL. */
5905 hold = nt->type.name;
5906 nt->type = info->type_stack->type;
5907 nt->type.name = hold;
5908 }
5909
5910 info->type_stack->type.name = tag;
5911 info->type_stack->type.strdef = strdef;
5912 info->type_stack->type.ignorep = ignorep;
5913
5914 return TRUE;
5915 }
5916
5917 /* Add a field to a struct. */
5918
5919 static bfd_boolean
5920 ieee_struct_field (void *p, const char *name, bfd_vma bitpos, bfd_vma bitsize,
5921 enum debug_visibility visibility)
5922 {
5923 struct ieee_handle *info = (struct ieee_handle *) p;
5924 unsigned int size;
5925 bfd_boolean unsignedp;
5926 bfd_boolean referencep;
5927 bfd_boolean localp;
5928 unsigned int indx;
5929 bfd_vma offset;
5930
5931 assert (info->type_stack != NULL
5932 && info->type_stack->next != NULL
5933 && ! ieee_buffer_emptyp (&info->type_stack->next->type.strdef));
5934
5935 /* If we are ignoring this struct definition, just pop and ignore
5936 the type. */
5937 if (info->type_stack->next->type.ignorep)
5938 {
5939 ieee_pop_unused_type (info);
5940 return TRUE;
5941 }
5942
5943 size = info->type_stack->type.size;
5944 unsignedp = info->type_stack->type.unsignedp;
5945 referencep = info->type_stack->type.referencep;
5946 localp = info->type_stack->type.localp;
5947 indx = ieee_pop_type (info);
5948
5949 if (localp)
5950 info->type_stack->type.localp = TRUE;
5951
5952 if (info->type_stack->type.classdef != NULL)
5953 {
5954 unsigned int flags;
5955 unsigned int nindx;
5956
5957 /* This is a class. We must add a description of this field to
5958 the class records we are building. */
5959
5960 flags = ieee_vis_to_flags (visibility);
5961 nindx = info->type_stack->type.classdef->indx;
5962 if (! ieee_change_buffer (info,
5963 &info->type_stack->type.classdef->pmiscbuf)
5964 || ! ieee_write_asn (info, nindx, 'd')
5965 || ! ieee_write_asn (info, nindx, flags)
5966 || ! ieee_write_atn65 (info, nindx, name)
5967 || ! ieee_write_atn65 (info, nindx, name))
5968 return FALSE;
5969 info->type_stack->type.classdef->pmisccount += 4;
5970
5971 if (referencep)
5972 {
5973 unsigned int nindx;
5974
5975 /* We need to output a record recording that this field is
5976 really of reference type. We put this on the refs field
5977 of classdef, so that it can be appended to the C++
5978 records after the class is defined. */
5979
5980 nindx = info->name_indx;
5981 ++info->name_indx;
5982
5983 if (! ieee_change_buffer (info,
5984 &info->type_stack->type.classdef->refs)
5985 || ! ieee_write_byte (info, (int) ieee_nn_record)
5986 || ! ieee_write_number (info, nindx)
5987 || ! ieee_write_id (info, "")
5988 || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
5989 || ! ieee_write_number (info, nindx)
5990 || ! ieee_write_number (info, 0)
5991 || ! ieee_write_number (info, 62)
5992 || ! ieee_write_number (info, 80)
5993 || ! ieee_write_number (info, 4)
5994 || ! ieee_write_asn (info, nindx, 'R')
5995 || ! ieee_write_asn (info, nindx, 3)
5996 || ! ieee_write_atn65 (info, nindx, info->type_stack->type.name)
5997 || ! ieee_write_atn65 (info, nindx, name))
5998 return FALSE;
5999 }
6000 }
6001
6002 /* If the bitsize doesn't match the expected size, we need to output
6003 a bitfield type. */
6004 if (size == 0 || bitsize == 0 || bitsize == size * 8)
6005 offset = bitpos / 8;
6006 else
6007 {
6008 if (! ieee_define_type (info, 0, unsignedp,
6009 info->type_stack->type.localp)
6010 || ! ieee_write_number (info, 'g')
6011 || ! ieee_write_number (info, unsignedp ? 0 : 1)
6012 || ! ieee_write_number (info, bitsize)
6013 || ! ieee_write_number (info, indx))
6014 return FALSE;
6015 indx = ieee_pop_type (info);
6016 offset = bitpos;
6017 }
6018
6019 /* Switch to the struct we are building in order to output this
6020 field definition. */
6021 return (ieee_change_buffer (info, &info->type_stack->type.strdef)
6022 && ieee_write_id (info, name)
6023 && ieee_write_number (info, indx)
6024 && ieee_write_number (info, offset));
6025 }
6026
6027 /* Finish up a struct type. */
6028
6029 static bfd_boolean
6030 ieee_end_struct_type (void *p)
6031 {
6032 struct ieee_handle *info = (struct ieee_handle *) p;
6033 struct ieee_buflist *pb;
6034
6035 assert (info->type_stack != NULL
6036 && ! ieee_buffer_emptyp (&info->type_stack->type.strdef));
6037
6038 /* If we were ignoring this struct definition because it was a
6039 duplicate definition, just through away whatever bytes we have
6040 accumulated. Leave the type on the stack. */
6041 if (info->type_stack->type.ignorep)
6042 return TRUE;
6043
6044 /* If this is not a duplicate definition of this tag, then localp
6045 will be FALSE, and we can put it in the global type block.
6046 FIXME: We should avoid outputting duplicate definitions which are
6047 the same. */
6048 if (! info->type_stack->type.localp)
6049 {
6050 /* Make sure we have started the global type block. */
6051 if (ieee_buffer_emptyp (&info->global_types))
6052 {
6053 if (! ieee_change_buffer (info, &info->global_types)
6054 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
6055 || ! ieee_write_byte (info, 2)
6056 || ! ieee_write_number (info, 0)
6057 || ! ieee_write_id (info, ""))
6058 return FALSE;
6059 }
6060 pb = &info->global_types;
6061 }
6062 else
6063 {
6064 /* Make sure we have started the types block. */
6065 if (ieee_buffer_emptyp (&info->types))
6066 {
6067 if (! ieee_change_buffer (info, &info->types)
6068 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
6069 || ! ieee_write_byte (info, 1)
6070 || ! ieee_write_number (info, 0)
6071 || ! ieee_write_id (info, info->modname))
6072 return FALSE;
6073 }
6074 pb = &info->types;
6075 }
6076
6077 /* Append the struct definition to the types. */
6078 if (! ieee_append_buffer (info, pb, &info->type_stack->type.strdef)
6079 || ! ieee_init_buffer (info, &info->type_stack->type.strdef))
6080 return FALSE;
6081
6082 /* Leave the struct on the type stack. */
6083
6084 return TRUE;
6085 }
6086
6087 /* Start a class type. */
6088
6089 static bfd_boolean
6090 ieee_start_class_type (void *p, const char *tag, unsigned int id,
6091 bfd_boolean structp, unsigned int size,
6092 bfd_boolean vptr, bfd_boolean ownvptr)
6093 {
6094 struct ieee_handle *info = (struct ieee_handle *) p;
6095 const char *vclass;
6096 struct ieee_buflist pmiscbuf;
6097 unsigned int indx;
6098 struct ieee_type_class *classdef;
6099
6100 /* A C++ class is output as a C++ struct along with a set of pmisc
6101 records describing the class. */
6102
6103 /* We need to have a name so that we can associate the struct and
6104 the class. */
6105 if (tag == NULL)
6106 {
6107 char *t;
6108
6109 t = (char *) xmalloc (20);
6110 sprintf (t, "__anon%u", id);
6111 tag = t;
6112 }
6113
6114 /* We can't write out the virtual table information until we have
6115 finished the class, because we don't know the virtual table size.
6116 We get the size from the largest voffset we see. */
6117 vclass = NULL;
6118 if (vptr && ! ownvptr)
6119 {
6120 vclass = info->type_stack->type.name;
6121 assert (vclass != NULL);
6122 /* We don't call ieee_pop_unused_type, since the class should
6123 get defined. */
6124 (void) ieee_pop_type (info);
6125 }
6126
6127 if (! ieee_start_struct_type (p, tag, id, structp, size))
6128 return FALSE;
6129
6130 indx = info->name_indx;
6131 ++info->name_indx;
6132
6133 /* We write out pmisc records into the classdef field. We will
6134 write out the pmisc start after we know the number of records we
6135 need. */
6136 if (! ieee_init_buffer (info, &pmiscbuf)
6137 || ! ieee_change_buffer (info, &pmiscbuf)
6138 || ! ieee_write_asn (info, indx, 'T')
6139 || ! ieee_write_asn (info, indx, structp ? 'o' : 'u')
6140 || ! ieee_write_atn65 (info, indx, tag))
6141 return FALSE;
6142
6143 classdef = (struct ieee_type_class *) xmalloc (sizeof *classdef);
6144 memset (classdef, 0, sizeof *classdef);
6145
6146 classdef->indx = indx;
6147 classdef->pmiscbuf = pmiscbuf;
6148 classdef->pmisccount = 3;
6149 classdef->vclass = vclass;
6150 classdef->ownvptr = ownvptr;
6151
6152 info->type_stack->type.classdef = classdef;
6153
6154 return TRUE;
6155 }
6156
6157 /* Add a static member to a class. */
6158
6159 static bfd_boolean
6160 ieee_class_static_member (void *p, const char *name, const char *physname,
6161 enum debug_visibility visibility)
6162 {
6163 struct ieee_handle *info = (struct ieee_handle *) p;
6164 unsigned int flags;
6165 unsigned int nindx;
6166
6167 /* We don't care about the type. Hopefully there will be a call to
6168 ieee_variable declaring the physical name and the type, since
6169 that is where an IEEE consumer must get the type. */
6170 ieee_pop_unused_type (info);
6171
6172 assert (info->type_stack != NULL
6173 && info->type_stack->type.classdef != NULL);
6174
6175 flags = ieee_vis_to_flags (visibility);
6176 flags |= CXXFLAGS_STATIC;
6177
6178 nindx = info->type_stack->type.classdef->indx;
6179
6180 if (! ieee_change_buffer (info, &info->type_stack->type.classdef->pmiscbuf)
6181 || ! ieee_write_asn (info, nindx, 'd')
6182 || ! ieee_write_asn (info, nindx, flags)
6183 || ! ieee_write_atn65 (info, nindx, name)
6184 || ! ieee_write_atn65 (info, nindx, physname))
6185 return FALSE;
6186 info->type_stack->type.classdef->pmisccount += 4;
6187
6188 return TRUE;
6189 }
6190
6191 /* Add a base class to a class. */
6192
6193 static bfd_boolean
6194 ieee_class_baseclass (void *p, bfd_vma bitpos, bfd_boolean virtual,
6195 enum debug_visibility visibility)
6196 {
6197 struct ieee_handle *info = (struct ieee_handle *) p;
6198 const char *bname;
6199 bfd_boolean localp;
6200 unsigned int bindx;
6201 char *fname;
6202 unsigned int flags;
6203 unsigned int nindx;
6204
6205 assert (info->type_stack != NULL
6206 && info->type_stack->type.name != NULL
6207 && info->type_stack->next != NULL
6208 && info->type_stack->next->type.classdef != NULL
6209 && ! ieee_buffer_emptyp (&info->type_stack->next->type.strdef));
6210
6211 bname = info->type_stack->type.name;
6212 localp = info->type_stack->type.localp;
6213 bindx = ieee_pop_type (info);
6214
6215 /* We are currently defining both a struct and a class. We must
6216 write out a field definition in the struct which holds the base
6217 class. The stabs debugging reader will create a field named
6218 _vb$CLASS for a virtual base class, so we just use that. FIXME:
6219 we should not depend upon a detail of stabs debugging. */
6220 if (virtual)
6221 {
6222 fname = (char *) xmalloc (strlen (bname) + sizeof "_vb$");
6223 sprintf (fname, "_vb$%s", bname);
6224 flags = BASEFLAGS_VIRTUAL;
6225 }
6226 else
6227 {
6228 if (localp)
6229 info->type_stack->type.localp = TRUE;
6230
6231 fname = (char *) xmalloc (strlen (bname) + sizeof "_b$");
6232 sprintf (fname, "_b$%s", bname);
6233
6234 if (! ieee_change_buffer (info, &info->type_stack->type.strdef)
6235 || ! ieee_write_id (info, fname)
6236 || ! ieee_write_number (info, bindx)
6237 || ! ieee_write_number (info, bitpos / 8))
6238 return FALSE;
6239 flags = 0;
6240 }
6241
6242 if (visibility == DEBUG_VISIBILITY_PRIVATE)
6243 flags |= BASEFLAGS_PRIVATE;
6244
6245 nindx = info->type_stack->type.classdef->indx;
6246
6247 if (! ieee_change_buffer (info, &info->type_stack->type.classdef->pmiscbuf)
6248 || ! ieee_write_asn (info, nindx, 'b')
6249 || ! ieee_write_asn (info, nindx, flags)
6250 || ! ieee_write_atn65 (info, nindx, bname)
6251 || ! ieee_write_asn (info, nindx, 0)
6252 || ! ieee_write_atn65 (info, nindx, fname))
6253 return FALSE;
6254 info->type_stack->type.classdef->pmisccount += 5;
6255
6256 free (fname);
6257
6258 return TRUE;
6259 }
6260
6261 /* Start building a method for a class. */
6262
6263 static bfd_boolean
6264 ieee_class_start_method (void *p, const char *name)
6265 {
6266 struct ieee_handle *info = (struct ieee_handle *) p;
6267
6268 assert (info->type_stack != NULL
6269 && info->type_stack->type.classdef != NULL
6270 && info->type_stack->type.classdef->method == NULL);
6271
6272 info->type_stack->type.classdef->method = name;
6273
6274 return TRUE;
6275 }
6276
6277 /* Define a new method variant, either static or not. */
6278
6279 static bfd_boolean
6280 ieee_class_method_var (struct ieee_handle *info, const char *physname,
6281 enum debug_visibility visibility,
6282 bfd_boolean staticp, bfd_boolean constp,
6283 bfd_boolean volatilep, bfd_vma voffset,
6284 bfd_boolean context)
6285 {
6286 unsigned int flags;
6287 unsigned int nindx;
6288 bfd_boolean virtual;
6289
6290 /* We don't need the type of the method. An IEEE consumer which
6291 wants the type must track down the function by the physical name
6292 and get the type from that. */
6293 ieee_pop_unused_type (info);
6294
6295 /* We don't use the context. FIXME: We probably ought to use it to
6296 adjust the voffset somehow, but I don't really know how. */
6297 if (context)
6298 ieee_pop_unused_type (info);
6299
6300 assert (info->type_stack != NULL
6301 && info->type_stack->type.classdef != NULL
6302 && info->type_stack->type.classdef->method != NULL);
6303
6304 flags = ieee_vis_to_flags (visibility);
6305
6306 /* FIXME: We never set CXXFLAGS_OVERRIDE, CXXFLAGS_OPERATOR,
6307 CXXFLAGS_CTORDTOR, CXXFLAGS_CTOR, or CXXFLAGS_INLINE. */
6308
6309 if (staticp)
6310 flags |= CXXFLAGS_STATIC;
6311 if (constp)
6312 flags |= CXXFLAGS_CONST;
6313 if (volatilep)
6314 flags |= CXXFLAGS_VOLATILE;
6315
6316 nindx = info->type_stack->type.classdef->indx;
6317
6318 virtual = context || voffset > 0;
6319
6320 if (! ieee_change_buffer (info,
6321 &info->type_stack->type.classdef->pmiscbuf)
6322 || ! ieee_write_asn (info, nindx, virtual ? 'v' : 'm')
6323 || ! ieee_write_asn (info, nindx, flags)
6324 || ! ieee_write_atn65 (info, nindx,
6325 info->type_stack->type.classdef->method)
6326 || ! ieee_write_atn65 (info, nindx, physname))
6327 return FALSE;
6328
6329 if (virtual)
6330 {
6331 if (voffset > info->type_stack->type.classdef->voffset)
6332 info->type_stack->type.classdef->voffset = voffset;
6333 if (! ieee_write_asn (info, nindx, voffset))
6334 return FALSE;
6335 ++info->type_stack->type.classdef->pmisccount;
6336 }
6337
6338 if (! ieee_write_asn (info, nindx, 0))
6339 return FALSE;
6340
6341 info->type_stack->type.classdef->pmisccount += 5;
6342
6343 return TRUE;
6344 }
6345
6346 /* Define a new method variant. */
6347
6348 static bfd_boolean
6349 ieee_class_method_variant (void *p, const char *physname,
6350 enum debug_visibility visibility,
6351 bfd_boolean constp, bfd_boolean volatilep,
6352 bfd_vma voffset, bfd_boolean context)
6353 {
6354 struct ieee_handle *info = (struct ieee_handle *) p;
6355
6356 return ieee_class_method_var (info, physname, visibility, FALSE, constp,
6357 volatilep, voffset, context);
6358 }
6359
6360 /* Define a new static method variant. */
6361
6362 static bfd_boolean
6363 ieee_class_static_method_variant (void *p, const char *physname,
6364 enum debug_visibility visibility,
6365 bfd_boolean constp, bfd_boolean volatilep)
6366 {
6367 struct ieee_handle *info = (struct ieee_handle *) p;
6368
6369 return ieee_class_method_var (info, physname, visibility, TRUE, constp,
6370 volatilep, 0, FALSE);
6371 }
6372
6373 /* Finish up a method. */
6374
6375 static bfd_boolean
6376 ieee_class_end_method (void *p)
6377 {
6378 struct ieee_handle *info = (struct ieee_handle *) p;
6379
6380 assert (info->type_stack != NULL
6381 && info->type_stack->type.classdef != NULL
6382 && info->type_stack->type.classdef->method != NULL);
6383
6384 info->type_stack->type.classdef->method = NULL;
6385
6386 return TRUE;
6387 }
6388
6389 /* Finish up a class. */
6390
6391 static bfd_boolean
6392 ieee_end_class_type (void *p)
6393 {
6394 struct ieee_handle *info = (struct ieee_handle *) p;
6395 unsigned int nindx;
6396
6397 assert (info->type_stack != NULL
6398 && info->type_stack->type.classdef != NULL);
6399
6400 /* If we were ignoring this class definition because it was a
6401 duplicate definition, just through away whatever bytes we have
6402 accumulated. Leave the type on the stack. */
6403 if (info->type_stack->type.ignorep)
6404 return TRUE;
6405
6406 nindx = info->type_stack->type.classdef->indx;
6407
6408 /* If we have a virtual table, we can write out the information now. */
6409 if (info->type_stack->type.classdef->vclass != NULL
6410 || info->type_stack->type.classdef->ownvptr)
6411 {
6412 if (! ieee_change_buffer (info,
6413 &info->type_stack->type.classdef->pmiscbuf)
6414 || ! ieee_write_asn (info, nindx, 'z')
6415 || ! ieee_write_atn65 (info, nindx, "")
6416 || ! ieee_write_asn (info, nindx,
6417 info->type_stack->type.classdef->voffset))
6418 return FALSE;
6419 if (info->type_stack->type.classdef->ownvptr)
6420 {
6421 if (! ieee_write_atn65 (info, nindx, ""))
6422 return FALSE;
6423 }
6424 else
6425 {
6426 if (! ieee_write_atn65 (info, nindx,
6427 info->type_stack->type.classdef->vclass))
6428 return FALSE;
6429 }
6430 if (! ieee_write_asn (info, nindx, 0))
6431 return FALSE;
6432 info->type_stack->type.classdef->pmisccount += 5;
6433 }
6434
6435 /* Now that we know the number of pmisc records, we can write out
6436 the atn62 which starts the pmisc records, and append them to the
6437 C++ buffers. */
6438
6439 if (! ieee_change_buffer (info, &info->cxx)
6440 || ! ieee_write_byte (info, (int) ieee_nn_record)
6441 || ! ieee_write_number (info, nindx)
6442 || ! ieee_write_id (info, "")
6443 || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
6444 || ! ieee_write_number (info, nindx)
6445 || ! ieee_write_number (info, 0)
6446 || ! ieee_write_number (info, 62)
6447 || ! ieee_write_number (info, 80)
6448 || ! ieee_write_number (info,
6449 info->type_stack->type.classdef->pmisccount))
6450 return FALSE;
6451
6452 if (! ieee_append_buffer (info, &info->cxx,
6453 &info->type_stack->type.classdef->pmiscbuf))
6454 return FALSE;
6455 if (! ieee_buffer_emptyp (&info->type_stack->type.classdef->refs))
6456 {
6457 if (! ieee_append_buffer (info, &info->cxx,
6458 &info->type_stack->type.classdef->refs))
6459 return FALSE;
6460 }
6461
6462 return ieee_end_struct_type (p);
6463 }
6464
6465 /* Push a previously seen typedef onto the type stack. */
6466
6467 static bfd_boolean
6468 ieee_typedef_type (void *p, const char *name)
6469 {
6470 struct ieee_handle *info = (struct ieee_handle *) p;
6471 struct ieee_name_type_hash_entry *h;
6472 struct ieee_name_type *nt;
6473
6474 h = ieee_name_type_hash_lookup (&info->typedefs, name, FALSE, FALSE);
6475
6476 /* h should never be NULL, since that would imply that the generic
6477 debugging code has asked for a typedef which it has not yet
6478 defined. */
6479 assert (h != NULL);
6480
6481 /* We always use the most recently defined type for this name, which
6482 will be the first one on the list. */
6483
6484 nt = h->types;
6485 if (! ieee_push_type (info, nt->type.indx, nt->type.size,
6486 nt->type.unsignedp, nt->type.localp))
6487 return FALSE;
6488
6489 /* Copy over any other type information we may have. */
6490 info->type_stack->type = nt->type;
6491
6492 return TRUE;
6493 }
6494
6495 /* Push a tagged type onto the type stack. */
6496
6497 static bfd_boolean
6498 ieee_tag_type (void *p, const char *name, unsigned int id,
6499 enum debug_type_kind kind)
6500 {
6501 struct ieee_handle *info = (struct ieee_handle *) p;
6502 bfd_boolean localp;
6503 bfd_boolean copy;
6504 char ab[20];
6505 struct ieee_name_type_hash_entry *h;
6506 struct ieee_name_type *nt;
6507
6508 if (kind == DEBUG_KIND_ENUM)
6509 {
6510 struct ieee_defined_enum *e;
6511
6512 if (name == NULL)
6513 abort ();
6514 for (e = info->enums; e != NULL; e = e->next)
6515 if (e->tag != NULL && strcmp (e->tag, name) == 0)
6516 return ieee_push_type (info, e->indx, 0, TRUE, FALSE);
6517
6518 e = (struct ieee_defined_enum *) xmalloc (sizeof *e);
6519 memset (e, 0, sizeof *e);
6520
6521 e->indx = info->type_indx;
6522 ++info->type_indx;
6523 e->tag = name;
6524 e->defined = FALSE;
6525
6526 e->next = info->enums;
6527 info->enums = e;
6528
6529 return ieee_push_type (info, e->indx, 0, TRUE, FALSE);
6530 }
6531
6532 localp = FALSE;
6533
6534 copy = FALSE;
6535 if (name == NULL)
6536 {
6537 sprintf (ab, "__anon%u", id);
6538 name = ab;
6539 copy = TRUE;
6540 }
6541
6542 h = ieee_name_type_hash_lookup (&info->tags, name, TRUE, copy);
6543 if (h == NULL)
6544 return FALSE;
6545
6546 for (nt = h->types; nt != NULL; nt = nt->next)
6547 {
6548 if (nt->id == id)
6549 {
6550 if (! ieee_push_type (info, nt->type.indx, nt->type.size,
6551 nt->type.unsignedp, nt->type.localp))
6552 return FALSE;
6553 /* Copy over any other type information we may have. */
6554 info->type_stack->type = nt->type;
6555 return TRUE;
6556 }
6557
6558 if (! nt->type.localp)
6559 {
6560 /* This is a duplicate of a global type, so it must be
6561 local. */
6562 localp = TRUE;
6563 }
6564 }
6565
6566 nt = (struct ieee_name_type *) xmalloc (sizeof *nt);
6567 memset (nt, 0, sizeof *nt);
6568
6569 nt->id = id;
6570 nt->type.name = h->root.string;
6571 nt->type.indx = info->type_indx;
6572 nt->type.localp = localp;
6573 ++info->type_indx;
6574 nt->kind = kind;
6575
6576 nt->next = h->types;
6577 h->types = nt;
6578
6579 if (! ieee_push_type (info, nt->type.indx, 0, FALSE, localp))
6580 return FALSE;
6581
6582 info->type_stack->type.name = h->root.string;
6583
6584 return TRUE;
6585 }
6586
6587 /* Output a typedef. */
6588
6589 static bfd_boolean
6590 ieee_typdef (void *p, const char *name)
6591 {
6592 struct ieee_handle *info = (struct ieee_handle *) p;
6593 struct ieee_write_type type;
6594 unsigned int indx;
6595 bfd_boolean found;
6596 bfd_boolean localp;
6597 struct ieee_name_type_hash_entry *h;
6598 struct ieee_name_type *nt;
6599
6600 type = info->type_stack->type;
6601 indx = type.indx;
6602
6603 /* If this is a simple builtin type using a builtin name, we don't
6604 want to output the typedef itself. We also want to change the
6605 type index to correspond to the name being used. We recognize
6606 names used in stabs debugging output even if they don't exactly
6607 correspond to the names used for the IEEE builtin types. */
6608 found = FALSE;
6609 if (indx <= (unsigned int) builtin_bcd_float)
6610 {
6611 switch ((enum builtin_types) indx)
6612 {
6613 default:
6614 break;
6615
6616 case builtin_void:
6617 if (strcmp (name, "void") == 0)
6618 found = TRUE;
6619 break;
6620
6621 case builtin_signed_char:
6622 case builtin_char:
6623 if (strcmp (name, "signed char") == 0)
6624 {
6625 indx = (unsigned int) builtin_signed_char;
6626 found = TRUE;
6627 }
6628 else if (strcmp (name, "char") == 0)
6629 {
6630 indx = (unsigned int) builtin_char;
6631 found = TRUE;
6632 }
6633 break;
6634
6635 case builtin_unsigned_char:
6636 if (strcmp (name, "unsigned char") == 0)
6637 found = TRUE;
6638 break;
6639
6640 case builtin_signed_short_int:
6641 case builtin_short:
6642 case builtin_short_int:
6643 case builtin_signed_short:
6644 if (strcmp (name, "signed short int") == 0)
6645 {
6646 indx = (unsigned int) builtin_signed_short_int;
6647 found = TRUE;
6648 }
6649 else if (strcmp (name, "short") == 0)
6650 {
6651 indx = (unsigned int) builtin_short;
6652 found = TRUE;
6653 }
6654 else if (strcmp (name, "short int") == 0)
6655 {
6656 indx = (unsigned int) builtin_short_int;
6657 found = TRUE;
6658 }
6659 else if (strcmp (name, "signed short") == 0)
6660 {
6661 indx = (unsigned int) builtin_signed_short;
6662 found = TRUE;
6663 }
6664 break;
6665
6666 case builtin_unsigned_short_int:
6667 case builtin_unsigned_short:
6668 if (strcmp (name, "unsigned short int") == 0
6669 || strcmp (name, "short unsigned int") == 0)
6670 {
6671 indx = builtin_unsigned_short_int;
6672 found = TRUE;
6673 }
6674 else if (strcmp (name, "unsigned short") == 0)
6675 {
6676 indx = builtin_unsigned_short;
6677 found = TRUE;
6678 }
6679 break;
6680
6681 case builtin_signed_long:
6682 case builtin_int: /* FIXME: Size depends upon architecture. */
6683 case builtin_long:
6684 if (strcmp (name, "signed long") == 0)
6685 {
6686 indx = builtin_signed_long;
6687 found = TRUE;
6688 }
6689 else if (strcmp (name, "int") == 0)
6690 {
6691 indx = builtin_int;
6692 found = TRUE;
6693 }
6694 else if (strcmp (name, "long") == 0
6695 || strcmp (name, "long int") == 0)
6696 {
6697 indx = builtin_long;
6698 found = TRUE;
6699 }
6700 break;
6701
6702 case builtin_unsigned_long:
6703 case builtin_unsigned: /* FIXME: Size depends upon architecture. */
6704 case builtin_unsigned_int: /* FIXME: Like builtin_unsigned. */
6705 if (strcmp (name, "unsigned long") == 0
6706 || strcmp (name, "long unsigned int") == 0)
6707 {
6708 indx = builtin_unsigned_long;
6709 found = TRUE;
6710 }
6711 else if (strcmp (name, "unsigned") == 0)
6712 {
6713 indx = builtin_unsigned;
6714 found = TRUE;
6715 }
6716 else if (strcmp (name, "unsigned int") == 0)
6717 {
6718 indx = builtin_unsigned_int;
6719 found = TRUE;
6720 }
6721 break;
6722
6723 case builtin_signed_long_long:
6724 if (strcmp (name, "signed long long") == 0
6725 || strcmp (name, "long long int") == 0)
6726 found = TRUE;
6727 break;
6728
6729 case builtin_unsigned_long_long:
6730 if (strcmp (name, "unsigned long long") == 0
6731 || strcmp (name, "long long unsigned int") == 0)
6732 found = TRUE;
6733 break;
6734
6735 case builtin_float:
6736 if (strcmp (name, "float") == 0)
6737 found = TRUE;
6738 break;
6739
6740 case builtin_double:
6741 if (strcmp (name, "double") == 0)
6742 found = TRUE;
6743 break;
6744
6745 case builtin_long_double:
6746 if (strcmp (name, "long double") == 0)
6747 found = TRUE;
6748 break;
6749
6750 case builtin_long_long_double:
6751 if (strcmp (name, "long long double") == 0)
6752 found = TRUE;
6753 break;
6754 }
6755
6756 if (found)
6757 type.indx = indx;
6758 }
6759
6760 h = ieee_name_type_hash_lookup (&info->typedefs, name, TRUE, FALSE);
6761 if (h == NULL)
6762 return FALSE;
6763
6764 /* See if we have already defined this type with this name. */
6765 localp = type.localp;
6766 for (nt = h->types; nt != NULL; nt = nt->next)
6767 {
6768 if (nt->id == indx)
6769 {
6770 /* If this is a global definition, then we don't need to
6771 do anything here. */
6772 if (! nt->type.localp)
6773 {
6774 ieee_pop_unused_type (info);
6775 return TRUE;
6776 }
6777 }
6778 else
6779 {
6780 /* This is a duplicate definition, so make this one local. */
6781 localp = TRUE;
6782 }
6783 }
6784
6785 /* We need to add a new typedef for this type. */
6786
6787 nt = (struct ieee_name_type *) xmalloc (sizeof *nt);
6788 memset (nt, 0, sizeof *nt);
6789 nt->id = indx;
6790 nt->type = type;
6791 nt->type.name = name;
6792 nt->type.localp = localp;
6793 nt->kind = DEBUG_KIND_ILLEGAL;
6794
6795 nt->next = h->types;
6796 h->types = nt;
6797
6798 if (found)
6799 {
6800 /* This is one of the builtin typedefs, so we don't need to
6801 actually define it. */
6802 ieee_pop_unused_type (info);
6803 return TRUE;
6804 }
6805
6806 indx = ieee_pop_type (info);
6807
6808 if (! ieee_define_named_type (info, name, (unsigned int) -1, type.size,
6809 type.unsignedp, localp,
6810 (struct ieee_buflist *) NULL)
6811 || ! ieee_write_number (info, 'T')
6812 || ! ieee_write_number (info, indx))
6813 return FALSE;
6814
6815 /* Remove the type we just added to the type stack. This should not
6816 be ieee_pop_unused_type, since the type is used, we just don't
6817 need it now. */
6818 (void) ieee_pop_type (info);
6819
6820 return TRUE;
6821 }
6822
6823 /* Output a tag for a type. We don't have to do anything here. */
6824
6825 static bfd_boolean
6826 ieee_tag (void *p, const char *name ATTRIBUTE_UNUSED)
6827 {
6828 struct ieee_handle *info = (struct ieee_handle *) p;
6829
6830 /* This should not be ieee_pop_unused_type, since we want the type
6831 to be defined. */
6832 (void) ieee_pop_type (info);
6833 return TRUE;
6834 }
6835
6836 /* Output an integer constant. */
6837
6838 static bfd_boolean
6839 ieee_int_constant (void *p ATTRIBUTE_UNUSED, const char *name ATTRIBUTE_UNUSED,
6840 bfd_vma val ATTRIBUTE_UNUSED)
6841 {
6842 /* FIXME. */
6843 return TRUE;
6844 }
6845
6846 /* Output a floating point constant. */
6847
6848 static bfd_boolean
6849 ieee_float_constant (void *p ATTRIBUTE_UNUSED,
6850 const char *name ATTRIBUTE_UNUSED,
6851 double val ATTRIBUTE_UNUSED)
6852 {
6853 /* FIXME. */
6854 return TRUE;
6855 }
6856
6857 /* Output a typed constant. */
6858
6859 static bfd_boolean
6860 ieee_typed_constant (void *p, const char *name ATTRIBUTE_UNUSED,
6861 bfd_vma val ATTRIBUTE_UNUSED)
6862 {
6863 struct ieee_handle *info = (struct ieee_handle *) p;
6864
6865 /* FIXME. */
6866 ieee_pop_unused_type (info);
6867 return TRUE;
6868 }
6869
6870 /* Output a variable. */
6871
6872 static bfd_boolean
6873 ieee_variable (void *p, const char *name, enum debug_var_kind kind,
6874 bfd_vma val)
6875 {
6876 struct ieee_handle *info = (struct ieee_handle *) p;
6877 unsigned int name_indx;
6878 unsigned int size;
6879 bfd_boolean referencep;
6880 unsigned int type_indx;
6881 bfd_boolean asn;
6882 int refflag;
6883
6884 size = info->type_stack->type.size;
6885 referencep = info->type_stack->type.referencep;
6886 type_indx = ieee_pop_type (info);
6887
6888 assert (! ieee_buffer_emptyp (&info->vars));
6889 if (! ieee_change_buffer (info, &info->vars))
6890 return FALSE;
6891
6892 name_indx = info->name_indx;
6893 ++info->name_indx;
6894
6895 /* Write out an NN and an ATN record for this variable. */
6896 if (! ieee_write_byte (info, (int) ieee_nn_record)
6897 || ! ieee_write_number (info, name_indx)
6898 || ! ieee_write_id (info, name)
6899 || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
6900 || ! ieee_write_number (info, name_indx)
6901 || ! ieee_write_number (info, type_indx))
6902 return FALSE;
6903 switch (kind)
6904 {
6905 default:
6906 abort ();
6907 return FALSE;
6908 case DEBUG_GLOBAL:
6909 if (! ieee_write_number (info, 8)
6910 || ! ieee_add_range (info, FALSE, val, val + size))
6911 return FALSE;
6912 refflag = 0;
6913 asn = TRUE;
6914 break;
6915 case DEBUG_STATIC:
6916 if (! ieee_write_number (info, 3)
6917 || ! ieee_add_range (info, FALSE, val, val + size))
6918 return FALSE;
6919 refflag = 1;
6920 asn = TRUE;
6921 break;
6922 case DEBUG_LOCAL_STATIC:
6923 if (! ieee_write_number (info, 3)
6924 || ! ieee_add_range (info, FALSE, val, val + size))
6925 return FALSE;
6926 refflag = 2;
6927 asn = TRUE;
6928 break;
6929 case DEBUG_LOCAL:
6930 if (! ieee_write_number (info, 1)
6931 || ! ieee_write_number (info, val))
6932 return FALSE;
6933 refflag = 2;
6934 asn = FALSE;
6935 break;
6936 case DEBUG_REGISTER:
6937 if (! ieee_write_number (info, 2)
6938 || ! ieee_write_number (info,
6939 ieee_genreg_to_regno (info->abfd, val)))
6940 return FALSE;
6941 refflag = 2;
6942 asn = FALSE;
6943 break;
6944 }
6945
6946 if (asn)
6947 {
6948 if (! ieee_write_asn (info, name_indx, val))
6949 return FALSE;
6950 }
6951
6952 /* If this is really a reference type, then we just output it with
6953 pointer type, and must now output a C++ record indicating that it
6954 is really reference type. */
6955 if (referencep)
6956 {
6957 unsigned int nindx;
6958
6959 nindx = info->name_indx;
6960 ++info->name_indx;
6961
6962 /* If this is a global variable, we want to output the misc
6963 record in the C++ misc record block. Otherwise, we want to
6964 output it just after the variable definition, which is where
6965 the current buffer is. */
6966 if (refflag != 2)
6967 {
6968 if (! ieee_change_buffer (info, &info->cxx))
6969 return FALSE;
6970 }
6971
6972 if (! ieee_write_byte (info, (int) ieee_nn_record)
6973 || ! ieee_write_number (info, nindx)
6974 || ! ieee_write_id (info, "")
6975 || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
6976 || ! ieee_write_number (info, nindx)
6977 || ! ieee_write_number (info, 0)
6978 || ! ieee_write_number (info, 62)
6979 || ! ieee_write_number (info, 80)
6980 || ! ieee_write_number (info, 3)
6981 || ! ieee_write_asn (info, nindx, 'R')
6982 || ! ieee_write_asn (info, nindx, refflag)
6983 || ! ieee_write_atn65 (info, nindx, name))
6984 return FALSE;
6985 }
6986
6987 return TRUE;
6988 }
6989
6990 /* Start outputting information for a function. */
6991
6992 static bfd_boolean
6993 ieee_start_function (void *p, const char *name, bfd_boolean global)
6994 {
6995 struct ieee_handle *info = (struct ieee_handle *) p;
6996 bfd_boolean referencep;
6997 unsigned int retindx, typeindx;
6998
6999 referencep = info->type_stack->type.referencep;
7000 retindx = ieee_pop_type (info);
7001
7002 /* Besides recording a BB4 or BB6 block, we record the type of the
7003 function in the BB1 typedef block. We can't write out the full
7004 type until we have seen all the parameters, so we accumulate it
7005 in info->fntype and info->fnargs. */
7006 if (! ieee_buffer_emptyp (&info->fntype))
7007 {
7008 /* FIXME: This might happen someday if we support nested
7009 functions. */
7010 abort ();
7011 }
7012
7013 info->fnname = name;
7014
7015 /* An attribute of 0x40 means that the push mask is unknown. */
7016 if (! ieee_define_named_type (info, name, (unsigned int) -1, 0, FALSE, TRUE,
7017 &info->fntype)
7018 || ! ieee_write_number (info, 'x')
7019 || ! ieee_write_number (info, 0x40)
7020 || ! ieee_write_number (info, 0)
7021 || ! ieee_write_number (info, 0)
7022 || ! ieee_write_number (info, retindx))
7023 return FALSE;
7024
7025 typeindx = ieee_pop_type (info);
7026
7027 if (! ieee_init_buffer (info, &info->fnargs))
7028 return FALSE;
7029 info->fnargcount = 0;
7030
7031 /* If the function return value is actually a reference type, we
7032 must add a record indicating that. */
7033 if (referencep)
7034 {
7035 unsigned int nindx;
7036
7037 nindx = info->name_indx;
7038 ++info->name_indx;
7039 if (! ieee_change_buffer (info, &info->cxx)
7040 || ! ieee_write_byte (info, (int) ieee_nn_record)
7041 || ! ieee_write_number (info, nindx)
7042 || ! ieee_write_id (info, "")
7043 || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
7044 || ! ieee_write_number (info, nindx)
7045 || ! ieee_write_number (info, 0)
7046 || ! ieee_write_number (info, 62)
7047 || ! ieee_write_number (info, 80)
7048 || ! ieee_write_number (info, 3)
7049 || ! ieee_write_asn (info, nindx, 'R')
7050 || ! ieee_write_asn (info, nindx, global ? 0 : 1)
7051 || ! ieee_write_atn65 (info, nindx, name))
7052 return FALSE;
7053 }
7054
7055 assert (! ieee_buffer_emptyp (&info->vars));
7056 if (! ieee_change_buffer (info, &info->vars))
7057 return FALSE;
7058
7059 /* The address is written out as the first block. */
7060
7061 ++info->block_depth;
7062
7063 return (ieee_write_byte (info, (int) ieee_bb_record_enum)
7064 && ieee_write_byte (info, global ? 4 : 6)
7065 && ieee_write_number (info, 0)
7066 && ieee_write_id (info, name)
7067 && ieee_write_number (info, 0)
7068 && ieee_write_number (info, typeindx));
7069 }
7070
7071 /* Add a function parameter. This will normally be called before the
7072 first block, so we postpone them until we see the block. */
7073
7074 static bfd_boolean
7075 ieee_function_parameter (void *p, const char *name, enum debug_parm_kind kind,
7076 bfd_vma val)
7077 {
7078 struct ieee_handle *info = (struct ieee_handle *) p;
7079 struct ieee_pending_parm *m, **pm;
7080
7081 assert (info->block_depth == 1);
7082
7083 m = (struct ieee_pending_parm *) xmalloc (sizeof *m);
7084 memset (m, 0, sizeof *m);
7085
7086 m->next = NULL;
7087 m->name = name;
7088 m->referencep = info->type_stack->type.referencep;
7089 m->type = ieee_pop_type (info);
7090 m->kind = kind;
7091 m->val = val;
7092
7093 for (pm = &info->pending_parms; *pm != NULL; pm = &(*pm)->next)
7094 ;
7095 *pm = m;
7096
7097 /* Add the type to the fnargs list. */
7098 if (! ieee_change_buffer (info, &info->fnargs)
7099 || ! ieee_write_number (info, m->type))
7100 return FALSE;
7101 ++info->fnargcount;
7102
7103 return TRUE;
7104 }
7105
7106 /* Output pending function parameters. */
7107
7108 static bfd_boolean
7109 ieee_output_pending_parms (struct ieee_handle *info)
7110 {
7111 struct ieee_pending_parm *m;
7112 unsigned int refcount;
7113
7114 refcount = 0;
7115 for (m = info->pending_parms; m != NULL; m = m->next)
7116 {
7117 enum debug_var_kind vkind;
7118
7119 switch (m->kind)
7120 {
7121 default:
7122 abort ();
7123 return FALSE;
7124 case DEBUG_PARM_STACK:
7125 case DEBUG_PARM_REFERENCE:
7126 vkind = DEBUG_LOCAL;
7127 break;
7128 case DEBUG_PARM_REG:
7129 case DEBUG_PARM_REF_REG:
7130 vkind = DEBUG_REGISTER;
7131 break;
7132 }
7133
7134 if (! ieee_push_type (info, m->type, 0, FALSE, FALSE))
7135 return FALSE;
7136 info->type_stack->type.referencep = m->referencep;
7137 if (m->referencep)
7138 ++refcount;
7139 if (! ieee_variable ((void *) info, m->name, vkind, m->val))
7140 return FALSE;
7141 }
7142
7143 /* If there are any reference parameters, we need to output a
7144 miscellaneous record indicating them. */
7145 if (refcount > 0)
7146 {
7147 unsigned int nindx, varindx;
7148
7149 /* FIXME: The MRI compiler outputs the demangled function name
7150 here, but we are outputting the mangled name. */
7151 nindx = info->name_indx;
7152 ++info->name_indx;
7153 if (! ieee_change_buffer (info, &info->vars)
7154 || ! ieee_write_byte (info, (int) ieee_nn_record)
7155 || ! ieee_write_number (info, nindx)
7156 || ! ieee_write_id (info, "")
7157 || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
7158 || ! ieee_write_number (info, nindx)
7159 || ! ieee_write_number (info, 0)
7160 || ! ieee_write_number (info, 62)
7161 || ! ieee_write_number (info, 80)
7162 || ! ieee_write_number (info, refcount + 3)
7163 || ! ieee_write_asn (info, nindx, 'B')
7164 || ! ieee_write_atn65 (info, nindx, info->fnname)
7165 || ! ieee_write_asn (info, nindx, 0))
7166 return FALSE;
7167 for (m = info->pending_parms, varindx = 1;
7168 m != NULL;
7169 m = m->next, varindx++)
7170 {
7171 if (m->referencep)
7172 {
7173 if (! ieee_write_asn (info, nindx, varindx))
7174 return FALSE;
7175 }
7176 }
7177 }
7178
7179 m = info->pending_parms;
7180 while (m != NULL)
7181 {
7182 struct ieee_pending_parm *next;
7183
7184 next = m->next;
7185 free (m);
7186 m = next;
7187 }
7188
7189 info->pending_parms = NULL;
7190
7191 return TRUE;
7192 }
7193
7194 /* Start a block. If this is the first block, we output the address
7195 to finish the BB4 or BB6, and then output the function parameters. */
7196
7197 static bfd_boolean
7198 ieee_start_block (void *p, bfd_vma addr)
7199 {
7200 struct ieee_handle *info = (struct ieee_handle *) p;
7201
7202 if (! ieee_change_buffer (info, &info->vars))
7203 return FALSE;
7204
7205 if (info->block_depth == 1)
7206 {
7207 if (! ieee_write_number (info, addr)
7208 || ! ieee_output_pending_parms (info))
7209 return FALSE;
7210 }
7211 else
7212 {
7213 if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
7214 || ! ieee_write_byte (info, 6)
7215 || ! ieee_write_number (info, 0)
7216 || ! ieee_write_id (info, "")
7217 || ! ieee_write_number (info, 0)
7218 || ! ieee_write_number (info, 0)
7219 || ! ieee_write_number (info, addr))
7220 return FALSE;
7221 }
7222
7223 if (! ieee_start_range (info, addr))
7224 return FALSE;
7225
7226 ++info->block_depth;
7227
7228 return TRUE;
7229 }
7230
7231 /* End a block. */
7232
7233 static bfd_boolean
7234 ieee_end_block (void *p, bfd_vma addr)
7235 {
7236 struct ieee_handle *info = (struct ieee_handle *) p;
7237
7238 /* The address we are given is the end of the block, but IEEE seems
7239 to want to the address of the last byte in the block, so we
7240 subtract one. */
7241 if (! ieee_change_buffer (info, &info->vars)
7242 || ! ieee_write_byte (info, (int) ieee_be_record_enum)
7243 || ! ieee_write_number (info, addr - 1))
7244 return FALSE;
7245
7246 if (! ieee_end_range (info, addr))
7247 return FALSE;
7248
7249 --info->block_depth;
7250
7251 if (addr > info->highaddr)
7252 info->highaddr = addr;
7253
7254 return TRUE;
7255 }
7256
7257 /* End a function. */
7258
7259 static bfd_boolean
7260 ieee_end_function (void *p)
7261 {
7262 struct ieee_handle *info = (struct ieee_handle *) p;
7263
7264 assert (info->block_depth == 1);
7265
7266 --info->block_depth;
7267
7268 /* Now we can finish up fntype, and add it to the typdef section.
7269 At this point, fntype is the 'x' type up to the argument count,
7270 and fnargs is the argument types. We must add the argument
7271 count, and we must add the level. FIXME: We don't record varargs
7272 functions correctly. In fact, stabs debugging does not give us
7273 enough information to do so. */
7274 if (! ieee_change_buffer (info, &info->fntype)
7275 || ! ieee_write_number (info, info->fnargcount)
7276 || ! ieee_change_buffer (info, &info->fnargs)
7277 || ! ieee_write_number (info, 0))
7278 return FALSE;
7279
7280 /* Make sure the typdef block has been started. */
7281 if (ieee_buffer_emptyp (&info->types))
7282 {
7283 if (! ieee_change_buffer (info, &info->types)
7284 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
7285 || ! ieee_write_byte (info, 1)
7286 || ! ieee_write_number (info, 0)
7287 || ! ieee_write_id (info, info->modname))
7288 return FALSE;
7289 }
7290
7291 if (! ieee_append_buffer (info, &info->types, &info->fntype)
7292 || ! ieee_append_buffer (info, &info->types, &info->fnargs))
7293 return FALSE;
7294
7295 info->fnname = NULL;
7296 if (! ieee_init_buffer (info, &info->fntype)
7297 || ! ieee_init_buffer (info, &info->fnargs))
7298 return FALSE;
7299 info->fnargcount = 0;
7300
7301 return TRUE;
7302 }
7303
7304 /* Record line number information. */
7305
7306 static bfd_boolean
7307 ieee_lineno (void *p, const char *filename, unsigned long lineno, bfd_vma addr)
7308 {
7309 struct ieee_handle *info = (struct ieee_handle *) p;
7310
7311 assert (info->filename != NULL);
7312
7313 /* The HP simulator seems to get confused when more than one line is
7314 listed for the same address, at least if they are in different
7315 files. We handle this by always listing the last line for a
7316 given address, since that seems to be the one that gdb uses. */
7317 if (info->pending_lineno_filename != NULL
7318 && addr != info->pending_lineno_addr)
7319 {
7320 /* Make sure we have a line number block. */
7321 if (! ieee_buffer_emptyp (&info->linenos))
7322 {
7323 if (! ieee_change_buffer (info, &info->linenos))
7324 return FALSE;
7325 }
7326 else
7327 {
7328 info->lineno_name_indx = info->name_indx;
7329 ++info->name_indx;
7330 if (! ieee_change_buffer (info, &info->linenos)
7331 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
7332 || ! ieee_write_byte (info, 5)
7333 || ! ieee_write_number (info, 0)
7334 || ! ieee_write_id (info, info->filename)
7335 || ! ieee_write_byte (info, (int) ieee_nn_record)
7336 || ! ieee_write_number (info, info->lineno_name_indx)
7337 || ! ieee_write_id (info, ""))
7338 return FALSE;
7339 info->lineno_filename = info->filename;
7340 }
7341
7342 if (strcmp (info->pending_lineno_filename, info->lineno_filename) != 0)
7343 {
7344 if (strcmp (info->filename, info->lineno_filename) != 0)
7345 {
7346 /* We were not in the main file. Close the block for the
7347 included file. */
7348 if (! ieee_write_byte (info, (int) ieee_be_record_enum))
7349 return FALSE;
7350 if (strcmp (info->filename, info->pending_lineno_filename) == 0)
7351 {
7352 /* We need a new NN record, and we aren't about to
7353 output one. */
7354 info->lineno_name_indx = info->name_indx;
7355 ++info->name_indx;
7356 if (! ieee_write_byte (info, (int) ieee_nn_record)
7357 || ! ieee_write_number (info, info->lineno_name_indx)
7358 || ! ieee_write_id (info, ""))
7359 return FALSE;
7360 }
7361 }
7362 if (strcmp (info->filename, info->pending_lineno_filename) != 0)
7363 {
7364 /* We are not changing to the main file. Open a block for
7365 the new included file. */
7366 info->lineno_name_indx = info->name_indx;
7367 ++info->name_indx;
7368 if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
7369 || ! ieee_write_byte (info, 5)
7370 || ! ieee_write_number (info, 0)
7371 || ! ieee_write_id (info, info->pending_lineno_filename)
7372 || ! ieee_write_byte (info, (int) ieee_nn_record)
7373 || ! ieee_write_number (info, info->lineno_name_indx)
7374 || ! ieee_write_id (info, ""))
7375 return FALSE;
7376 }
7377 info->lineno_filename = info->pending_lineno_filename;
7378 }
7379
7380 if (! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
7381 || ! ieee_write_number (info, info->lineno_name_indx)
7382 || ! ieee_write_number (info, 0)
7383 || ! ieee_write_number (info, 7)
7384 || ! ieee_write_number (info, info->pending_lineno)
7385 || ! ieee_write_number (info, 0)
7386 || ! ieee_write_asn (info, info->lineno_name_indx,
7387 info->pending_lineno_addr))
7388 return FALSE;
7389 }
7390
7391 info->pending_lineno_filename = filename;
7392 info->pending_lineno = lineno;
7393 info->pending_lineno_addr = addr;
7394
7395 return TRUE;
7396 }