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