* debug.h (enum debug_type_kind): Add DEBUG_KIND_ILLEGAL.
[binutils-gdb.git] / binutils / ieee.c
1 /* ieee.c -- Write out 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 };
43
44 /* This structure is the block stack. */
45
46 #define BLOCKSTACK_SIZE (16)
47
48 struct ieee_blockstack
49 {
50 /* The stack pointer. */
51 struct ieee_block *bsp;
52 /* The stack. */
53 struct ieee_block stack[BLOCKSTACK_SIZE];
54 };
55
56 /* This structure holds information for a variable. */
57
58 struct ieee_var
59 {
60 /* Start of name. */
61 const char *name;
62 /* Length of name. */
63 unsigned long namlen;
64 /* Type. */
65 debug_type type;
66 };
67
68 /* This structure holds all the variables. */
69
70 struct ieee_vars
71 {
72 /* Number of slots allocated. */
73 unsigned int alloc;
74 /* Variables. */
75 struct ieee_var *vars;
76 };
77
78 /* This structure holds information for a type. We need this because
79 we don't want to represent bitfields as real types. */
80
81 struct ieee_type
82 {
83 /* Type. */
84 debug_type type;
85 /* Slot if this is type is referenced before it is defined. */
86 debug_type *pslot;
87 /* If this is a bitfield, this is the size in bits. If this is not
88 a bitfield, this is zero. */
89 unsigned long bitsize;
90 /* If this is a function type ('x' or 'X') this is the return type. */
91 debug_type return_type;
92 };
93
94 /* This structure holds all the type information. */
95
96 struct ieee_types
97 {
98 /* Number of slots allocated. */
99 unsigned int alloc;
100 /* Types. */
101 struct ieee_type *types;
102 /* Builtin types. */
103 #define BUILTIN_TYPE_COUNT (60)
104 debug_type builtins[BUILTIN_TYPE_COUNT];
105 };
106
107 /* Basic builtin types, not including the pointers. */
108
109 enum builtin_types
110 {
111 builtin_unknown = 0,
112 builtin_void = 1,
113 builtin_signed_char = 2,
114 builtin_unsigned_char = 3,
115 builtin_signed_short_int = 4,
116 builtin_unsigned_short_int = 5,
117 builtin_signed_long = 6,
118 builtin_unsigned_long = 7,
119 builtin_signed_long_long = 8,
120 builtin_unsigned_long_long = 9,
121 builtin_float = 10,
122 builtin_double = 11,
123 builtin_long_double = 12,
124 builtin_long_long_double = 13,
125 builtin_quoted_string = 14,
126 builtin_instruction_address = 15,
127 builtin_int = 16,
128 builtin_unsigned = 17,
129 builtin_unsigned_int = 18,
130 builtin_char = 19,
131 builtin_long = 20,
132 builtin_short = 21,
133 builtin_unsigned_short = 22,
134 builtin_short_int = 23,
135 builtin_signed_short = 24,
136 builtin_bcd_float = 25
137 };
138
139 static void ieee_error
140 PARAMS ((bfd *, const bfd_byte *, const bfd_byte *, const char *));
141 static void ieee_eof PARAMS ((bfd *));
142 static char *savestring PARAMS ((const char *, unsigned long));
143 static boolean ieee_read_number
144 PARAMS ((bfd *, const bfd_byte *, const bfd_byte **, const bfd_byte *,
145 bfd_vma *));
146 static boolean ieee_read_optional_number
147 PARAMS ((bfd *, const bfd_byte *, const bfd_byte **, const bfd_byte *,
148 bfd_vma *, boolean *));
149 static boolean ieee_read_id
150 PARAMS ((bfd *, const bfd_byte *, const bfd_byte **, const bfd_byte *,
151 const char **, unsigned long *));
152 static boolean ieee_read_optional_id
153 PARAMS ((bfd *, const bfd_byte *, const bfd_byte **, const bfd_byte *,
154 const char **, unsigned long *, boolean *));
155 static boolean ieee_read_expression
156 PARAMS ((bfd *, const bfd_byte *, const bfd_byte **, const bfd_byte *,
157 bfd_vma *));
158 static debug_type ieee_builtin_type
159 PARAMS ((PTR, bfd *, struct ieee_types *, const bfd_byte *,
160 const bfd_byte *, unsigned int));
161 static boolean ieee_alloc_type
162 PARAMS ((PTR, struct ieee_types *, unsigned int, boolean));
163 static boolean ieee_read_type_index
164 PARAMS ((PTR, bfd *, struct ieee_types *, const bfd_byte *,
165 const bfd_byte **, const bfd_byte *, debug_type *));
166 static int ieee_regno_to_genreg PARAMS ((bfd *, int));
167 static int ieee_genreg_to_regno PARAMS ((bfd *, int));
168 static boolean parse_ieee_bb
169 PARAMS ((PTR, bfd *, struct ieee_types *, struct ieee_blockstack *,
170 const bfd_byte *, const bfd_byte **, const bfd_byte *));
171 static boolean parse_ieee_be
172 PARAMS ((PTR, bfd *, struct ieee_blockstack *, const bfd_byte *,
173 const bfd_byte **, const bfd_byte *));
174 static boolean parse_ieee_nn
175 PARAMS ((PTR, bfd *, struct ieee_vars *, const bfd_byte *,
176 const bfd_byte **, const bfd_byte *));
177 static boolean parse_ieee_ty
178 PARAMS ((PTR, bfd *, struct ieee_types *, struct ieee_vars *,
179 const bfd_byte *, const bfd_byte **, const bfd_byte *));
180 static boolean parse_ieee_atn
181 PARAMS ((PTR, bfd *, struct ieee_types *, struct ieee_vars *, int,
182 const bfd_byte *, const bfd_byte **, const bfd_byte *));
183 static boolean ieee_require_asn
184 PARAMS ((bfd *, const bfd_byte *, const bfd_byte **, const bfd_byte *,
185 bfd_vma *));
186
187 /* Report an error in the IEEE debugging information. */
188
189 static void
190 ieee_error (abfd, bytes, p, s)
191 bfd *abfd;
192 const bfd_byte *bytes;
193 const bfd_byte *p;
194 const char *s;
195 {
196 if (p != NULL)
197 fprintf (stderr, "%s: 0x%lx: %s (0x%x)\n", bfd_get_filename (abfd),
198 (unsigned long) (p - bytes), s, *p);
199 else
200 fprintf (stderr, "%s: %s\n", bfd_get_filename (abfd), s);
201 }
202
203 /* Report an unexpected EOF in the IEEE debugging information. */
204
205 static void
206 ieee_eof (abfd)
207 bfd *abfd;
208 {
209 ieee_error (abfd, (const bfd_byte *) NULL, (const bfd_byte *) NULL,
210 "unexpected end of debugging information");
211 }
212
213 /* Save a string in memory. */
214
215 static char *
216 savestring (start, len)
217 const char *start;
218 unsigned long len;
219 {
220 char *ret;
221
222 ret = (char *) xmalloc (len + 1);
223 memcpy (ret, start, len);
224 ret[len] = '\0';
225 return ret;
226 }
227
228 /* Read a number which must be present in an IEEE file. */
229
230 static boolean
231 ieee_read_number (abfd, bytes, pp, pend, pv)
232 bfd *abfd;
233 const bfd_byte *bytes;
234 const bfd_byte **pp;
235 const bfd_byte *pend;
236 bfd_vma *pv;
237 {
238 return ieee_read_optional_number (abfd, bytes, pp, pend, pv,
239 (boolean *) NULL);
240 }
241
242 /* Read a number in an IEEE file. If ppresent is not NULL, the number
243 need not be there. */
244
245 static boolean
246 ieee_read_optional_number (abfd, bytes, pp, pend, pv, ppresent)
247 bfd *abfd;
248 const bfd_byte *bytes;
249 const bfd_byte **pp;
250 const bfd_byte *pend;
251 bfd_vma *pv;
252 boolean *ppresent;
253 {
254 ieee_record_enum_type b;
255
256 if (*pp >= pend)
257 {
258 if (ppresent != NULL)
259 {
260 *ppresent = false;
261 return true;
262 }
263 ieee_eof (abfd);
264 return false;
265 }
266
267 b = (ieee_record_enum_type) **pp;
268 ++*pp;
269
270 if (b <= ieee_number_end_enum)
271 {
272 *pv = (bfd_vma) b;
273 if (ppresent != NULL)
274 *ppresent = true;
275 return true;
276 }
277
278 if (b >= ieee_number_repeat_start_enum && b <= ieee_number_repeat_end_enum)
279 {
280 unsigned int i;
281
282 i = (int) b - (int) ieee_number_repeat_start_enum;
283 if (*pp + i - 1 >= pend)
284 {
285 ieee_eof (abfd);
286 return false;
287 }
288
289 *pv = 0;
290 for (; i > 0; i--)
291 {
292 *pv <<= 8;
293 *pv += **pp;
294 ++*pp;
295 }
296
297 if (ppresent != NULL)
298 *ppresent = true;
299
300 return true;
301 }
302
303 if (ppresent != NULL)
304 {
305 --*pp;
306 *ppresent = false;
307 return true;
308 }
309
310 ieee_error (abfd, bytes, *pp - 1, "invalid number");
311 return false;
312 }
313
314 /* Read a required string from an IEEE file. */
315
316 static boolean
317 ieee_read_id (abfd, bytes, pp, pend, pname, pnamlen)
318 bfd *abfd;
319 const bfd_byte *bytes;
320 const bfd_byte **pp;
321 const bfd_byte *pend;
322 const char **pname;
323 unsigned long *pnamlen;
324 {
325 return ieee_read_optional_id (abfd, bytes, pp, pend, pname, pnamlen,
326 (boolean *) NULL);
327 }
328
329 /* Read a string from an IEEE file. If ppresent is not NULL, the
330 string is optional. */
331
332 static boolean
333 ieee_read_optional_id (abfd, bytes, pp, pend, pname, pnamlen, ppresent)
334 bfd *abfd;
335 const bfd_byte *bytes;
336 const bfd_byte **pp;
337 const bfd_byte *pend;
338 const char **pname;
339 unsigned long *pnamlen;
340 boolean *ppresent;
341 {
342 bfd_byte b;
343 unsigned long len;
344
345 if (*pp >= pend)
346 {
347 ieee_eof (abfd);
348 return false;
349 }
350
351 b = **pp;
352 ++*pp;
353
354 if (b <= 0x7f)
355 len = b;
356 else if ((ieee_record_enum_type) b == ieee_extension_length_1_enum)
357 {
358 len = **pp;
359 ++*pp;
360 }
361 else if ((ieee_record_enum_type) b == ieee_extension_length_2_enum)
362 {
363 len = (**pp << 8) + (*pp)[1];
364 *pp += 2;
365 }
366 else
367 {
368 if (ppresent != NULL)
369 {
370 --*pp;
371 *ppresent = false;
372 return true;
373 }
374 ieee_error (abfd, bytes, *pp - 1, "invalid string length");
375 return false;
376 }
377
378 if ((unsigned long) (pend - *pp) < len)
379 {
380 ieee_eof (abfd);
381 return false;
382 }
383
384 *pname = (const char *) *pp;
385 *pnamlen = len;
386 *pp += len;
387
388 if (ppresent != NULL)
389 *ppresent = true;
390
391 return true;
392 }
393
394 /* Read an expression from an IEEE file. Since this code is only used
395 to parse debugging information, I haven't bothered to write a full
396 blown IEEE expression parser. I've only thrown in the things I've
397 seen in debugging information. This can be easily extended if
398 necessary. */
399
400 static boolean
401 ieee_read_expression (abfd, bytes, pp, pend, pv)
402 bfd *abfd;
403 const bfd_byte *bytes;
404 const bfd_byte **pp;
405 const bfd_byte *pend;
406 bfd_vma *pv;
407 {
408 const bfd_byte *expr_start;
409 #define EXPR_STACK_SIZE (10)
410 bfd_vma expr_stack[EXPR_STACK_SIZE];
411 bfd_vma *esp;
412
413 expr_start = *pp;
414
415 esp = expr_stack;
416
417 while (1)
418 {
419 const bfd_byte *start;
420 bfd_vma val;
421 boolean present;
422 ieee_record_enum_type c;
423
424 start = *pp;
425
426 if (! ieee_read_optional_number (abfd, bytes, pp, pend, &val, &present))
427 return false;
428
429 if (present)
430 {
431 if (esp - expr_stack >= EXPR_STACK_SIZE)
432 {
433 ieee_error (abfd, bytes, start, "expression stack overflow");
434 return false;
435 }
436 *esp++ = val;
437 continue;
438 }
439
440 c = (ieee_record_enum_type) **pp;
441
442 if (c >= ieee_module_beginning_enum)
443 break;
444
445 ++*pp;
446
447 if (c == ieee_comma)
448 break;
449
450 switch (c)
451 {
452 default:
453 ieee_error (abfd, bytes, start,
454 "unsupported IEEE expression operator");
455 break;
456
457 case ieee_variable_R_enum:
458 {
459 bfd_vma indx;
460 asection *s;
461
462 if (! ieee_read_number (abfd, bytes, pp, pend, &indx))
463 return false;
464 for (s = abfd->sections; s != NULL; s = s->next)
465 if ((bfd_vma) s->target_index == indx)
466 break;
467 if (s == NULL)
468 {
469 ieee_error (abfd, bytes, start, "unknown section");
470 return false;
471 }
472
473 if (esp - expr_stack >= EXPR_STACK_SIZE)
474 {
475 ieee_error (abfd, bytes, start, "expression stack overflow");
476 return false;
477 }
478
479 *esp++ = bfd_get_section_vma (abfd, s);
480 }
481 break;
482
483 case ieee_function_plus_enum:
484 case ieee_function_minus_enum:
485 {
486 bfd_vma v1, v2;
487
488 if (esp - expr_stack < 2)
489 {
490 ieee_error (abfd, bytes, start, "expression stack underflow");
491 return false;
492 }
493
494 v1 = *--esp;
495 v2 = *--esp;
496 *esp++ = v1 + v2;
497 }
498 break;
499 }
500 }
501
502 if (esp - 1 != expr_stack)
503 {
504 ieee_error (abfd, bytes, expr_start, "expression stack mismatch");
505 return false;
506 }
507
508 *pv = *--esp;
509
510 return true;
511 }
512
513 /* Return an IEEE builtin type. */
514
515 static debug_type
516 ieee_builtin_type (dhandle, abfd, types, bytes, p, indx)
517 PTR dhandle;
518 bfd *abfd;
519 struct ieee_types *types;
520 const bfd_byte *bytes;
521 const bfd_byte *p;
522 unsigned int indx;
523 {
524 debug_type type;
525 const char *name;
526
527 if (indx < BUILTIN_TYPE_COUNT
528 && types->builtins[indx] != DEBUG_TYPE_NULL)
529 return types->builtins[indx];
530
531 if (indx >= 32 && indx < 64)
532 {
533 type = debug_make_pointer_type (dhandle,
534 ieee_builtin_type (dhandle, abfd,
535 types, bytes, p,
536 indx - 32));
537 assert (indx < BUILTIN_TYPE_COUNT);
538 types->builtins[indx] = type;
539 return type;
540 }
541
542 switch ((enum builtin_types) indx)
543 {
544 default:
545 ieee_error (abfd, bytes, p, "unknown builtin type");
546 return NULL;
547
548 case builtin_unknown:
549 type = debug_make_void_type (dhandle);
550 name = NULL;
551 break;
552
553 case builtin_void:
554 type = debug_make_void_type (dhandle);
555 name = "void";
556 break;
557
558 case builtin_signed_char:
559 type = debug_make_int_type (dhandle, 1, false);
560 name = "signed char";
561 break;
562
563 case builtin_unsigned_char:
564 type = debug_make_int_type (dhandle, 1, true);
565 name = "unsigned char";
566 break;
567
568 case builtin_signed_short_int:
569 type = debug_make_int_type (dhandle, 2, false);
570 name = "signed short int";
571 break;
572
573 case builtin_unsigned_short_int:
574 type = debug_make_int_type (dhandle, 2, true);
575 name = "unsigned short int";
576 break;
577
578 case builtin_signed_long:
579 type = debug_make_int_type (dhandle, 4, false);
580 name = "signed long";
581 break;
582
583 case builtin_unsigned_long:
584 type = debug_make_int_type (dhandle, 4, true);
585 name = "unsigned long";
586 break;
587
588 case builtin_signed_long_long:
589 type = debug_make_int_type (dhandle, 8, false);
590 name = "signed long long";
591 break;
592
593 case builtin_unsigned_long_long:
594 type = debug_make_int_type (dhandle, 8, true);
595 name = "unsigned long long";
596 break;
597
598 case builtin_float:
599 type = debug_make_float_type (dhandle, 4);
600 name = "float";
601 break;
602
603 case builtin_double:
604 type = debug_make_float_type (dhandle, 8);
605 name = "double";
606 break;
607
608 case builtin_long_double:
609 /* FIXME: The size for this type should depend upon the
610 processor. */
611 type = debug_make_float_type (dhandle, 12);
612 name = "long double";
613 break;
614
615 case builtin_long_long_double:
616 type = debug_make_float_type (dhandle, 16);
617 name = "long long double";
618 break;
619
620 case builtin_quoted_string:
621 type = debug_make_array_type (dhandle,
622 ieee_builtin_type (dhandle, abfd, types,
623 bytes, p,
624 ((unsigned int)
625 builtin_char)),
626 ieee_builtin_type (dhandle, abfd, types,
627 bytes, p,
628 ((unsigned int)
629 builtin_int)),
630 0, -1, true);
631 name = "QUOTED STRING";
632 break;
633
634 case builtin_instruction_address:
635 /* FIXME: This should be a code address. */
636 type = debug_make_int_type (dhandle, 4, true);
637 name = "instruction address";
638 break;
639
640 case builtin_int:
641 /* FIXME: The size for this type should depend upon the
642 processor. */
643 type = debug_make_int_type (dhandle, 4, false);
644 name = "int";
645 break;
646
647 case builtin_unsigned:
648 /* FIXME: The size for this type should depend upon the
649 processor. */
650 type = debug_make_int_type (dhandle, 4, true);
651 name = "unsigned";
652 break;
653
654 case builtin_unsigned_int:
655 /* FIXME: The size for this type should depend upon the
656 processor. */
657 type = debug_make_int_type (dhandle, 4, true);
658 name = "unsigned int";
659 break;
660
661 case builtin_char:
662 type = debug_make_int_type (dhandle, 1, false);
663 name = "char";
664 break;
665
666 case builtin_long:
667 type = debug_make_int_type (dhandle, 4, false);
668 name = "long";
669 break;
670
671 case builtin_short:
672 type = debug_make_int_type (dhandle, 2, false);
673 name = "short";
674 break;
675
676 case builtin_unsigned_short:
677 type = debug_make_int_type (dhandle, 2, true);
678 name = "unsigned short";
679 break;
680
681 case builtin_short_int:
682 type = debug_make_int_type (dhandle, 2, false);
683 name = "short int";
684 break;
685
686 case builtin_signed_short:
687 type = debug_make_int_type (dhandle, 2, false);
688 name = "signed short";
689 break;
690
691 case builtin_bcd_float:
692 ieee_error (abfd, bytes, p, "BCD float type not supported");
693 return false;
694 }
695
696 if (name != NULL)
697 type = debug_name_type (dhandle, name, type);
698
699 assert (indx < BUILTIN_TYPE_COUNT);
700
701 types->builtins[indx] = type;
702
703 return type;
704 }
705
706 /* Allocate more space in the type table. If ref is true, this is a
707 reference to the type; if it is not already defined, we should set
708 up an indirect type. */
709
710 static boolean
711 ieee_alloc_type (dhandle, types, indx, ref)
712 PTR dhandle;
713 struct ieee_types *types;
714 unsigned int indx;
715 boolean ref;
716 {
717 unsigned int nalloc;
718 register struct ieee_type *t;
719 struct ieee_type *tend;
720
721 if (indx >= types->alloc)
722 {
723 nalloc = types->alloc;
724 if (nalloc == 0)
725 nalloc = 4;
726 while (indx >= nalloc)
727 nalloc *= 2;
728
729 types->types = ((struct ieee_type *)
730 xrealloc (types->types, nalloc * sizeof *types->types));
731
732 memset (types->types + types->alloc, 0,
733 (nalloc - types->alloc) * sizeof *types->types);
734
735 tend = types->types + nalloc;
736 for (t = types->types + types->alloc; t < tend; t++)
737 {
738 t->type = DEBUG_TYPE_NULL;
739 t->return_type = DEBUG_TYPE_NULL;
740 }
741
742 types->alloc = nalloc;
743 }
744
745 if (ref)
746 {
747 t = types->types + indx;
748 if (t->type == NULL)
749 {
750 t->pslot = (debug_type *) xmalloc (sizeof *t->pslot);
751 *t->pslot = DEBUG_TYPE_NULL;
752 t->type = debug_make_indirect_type (dhandle, t->pslot,
753 (const char *) NULL);
754 if (t->type == NULL)
755 return false;
756 }
757 }
758
759 return true;
760 }
761
762 /* Read a type index and return the corresponding type. */
763
764 static boolean
765 ieee_read_type_index (dhandle, abfd, types, bytes, pp, pend, ptype)
766 PTR dhandle;
767 bfd *abfd;
768 struct ieee_types *types;
769 const bfd_byte *bytes;
770 const bfd_byte **pp;
771 const bfd_byte *pend;
772 debug_type *ptype;
773 {
774 const bfd_byte *start;
775 bfd_vma indx;
776
777 start = *pp;
778
779 if (! ieee_read_number (abfd, bytes, pp, pend, &indx))
780 return false;
781
782 if (indx < 256)
783 {
784 *ptype = ieee_builtin_type (dhandle, abfd, types, bytes, start, indx);
785 if (*ptype == NULL)
786 return false;
787 return true;
788 }
789
790 indx -= 256;
791 if (! ieee_alloc_type (dhandle, types, indx, true))
792 return false;
793
794 *ptype = types->types[indx].type;
795
796 return true;
797 }
798
799 /* Parse IEEE debugging information for a file. This is passed the
800 bytes which compose the Debug Information Part of an IEEE file. */
801
802 boolean
803 parse_ieee (dhandle, abfd, bytes, len)
804 PTR dhandle;
805 bfd *abfd;
806 const bfd_byte *bytes;
807 bfd_size_type len;
808 {
809 struct ieee_blockstack blockstack;
810 struct ieee_vars vars;
811 struct ieee_types types;
812 unsigned int i;
813 const bfd_byte *p, *pend;
814
815 blockstack.bsp = blockstack.stack;
816 vars.alloc = 0;
817 vars.vars = NULL;
818 types.alloc = 0;
819 types.types = NULL;
820 for (i = 0; i < BUILTIN_TYPE_COUNT; i++)
821 types.builtins[i] = DEBUG_TYPE_NULL;
822
823 p = bytes;
824 pend = bytes + len;
825 while (p < pend)
826 {
827 const bfd_byte *record_start;
828 ieee_record_enum_type c;
829
830 record_start = p;
831
832 c = (ieee_record_enum_type) *p++;
833
834 if (c == ieee_at_record_enum)
835 c = (ieee_record_enum_type) (((unsigned int) c << 8) | *p++);
836
837 if (c <= ieee_number_repeat_end_enum)
838 {
839 ieee_error (abfd, bytes, record_start, "unexpected number");
840 return false;
841 }
842
843 switch (c)
844 {
845 default:
846 ieee_error (abfd, bytes, record_start, "unexpected record type");
847 return false;
848
849 case ieee_bb_record_enum:
850 if (! parse_ieee_bb (dhandle, abfd, &types, &blockstack, bytes,
851 &p, pend))
852 return false;
853 break;
854
855 case ieee_be_record_enum:
856 if (! parse_ieee_be (dhandle, abfd, &blockstack, bytes, &p, pend))
857 return false;
858 break;
859
860 case ieee_nn_record:
861 if (! parse_ieee_nn (dhandle, abfd, &vars, bytes, &p, pend))
862 return false;
863 break;
864
865 case ieee_ty_record_enum:
866 if (! parse_ieee_ty (dhandle, abfd, &types, &vars, bytes, &p, pend))
867 return false;
868 break;
869
870 case ieee_atn_record_enum:
871 if (! parse_ieee_atn (dhandle, abfd, &types, &vars,
872 (blockstack.bsp <= blockstack.stack
873 ? 0
874 : blockstack.bsp[-1].kind),
875 bytes, &p, pend))
876 return false;
877 break;
878 }
879 }
880
881 if (blockstack.bsp != blockstack.stack)
882 {
883 ieee_error (abfd, (const bfd_byte *) NULL, (const bfd_byte *) NULL,
884 "blocks left on stack at end");
885 return false;
886 }
887
888 return true;
889 }
890
891 /* Handle an IEEE BB record. */
892
893 static boolean
894 parse_ieee_bb (dhandle, abfd, types, blockstack, bytes, pp, pend)
895 PTR dhandle;
896 bfd *abfd;
897 struct ieee_types *types;
898 struct ieee_blockstack *blockstack;
899 const bfd_byte *bytes;
900 const bfd_byte **pp;
901 const bfd_byte *pend;
902 {
903 const bfd_byte *block_start;
904 bfd_byte b;
905 bfd_vma size;
906 const char *name;
907 unsigned long namlen;
908 char *namcopy;
909
910 block_start = *pp;
911
912 b = **pp;
913 ++*pp;
914
915 if (! ieee_read_number (abfd, bytes, pp, pend, &size)
916 || ! ieee_read_id (abfd, bytes, pp, pend, &name, &namlen))
917 return false;
918
919 switch (b)
920 {
921 case 1:
922 /* BB1: Type definitions local to a module. */
923 namcopy = savestring (name, namlen);
924 if (namcopy == NULL)
925 return false;
926 if (! debug_set_filename (dhandle, namcopy))
927 return false;
928 break;
929
930 case 2:
931 /* BB2: Global type definitions. The name is supposed to be
932 empty, but we don't check. */
933 if (! debug_set_filename (dhandle, "*global*"))
934 return false;
935 break;
936
937 case 3:
938 /* BB3: High level module block begin. We don't have to do
939 anything here. The name is supposed to be the same as for
940 the BB1, but we don't check. */
941 break;
942
943 case 4:
944 /* BB4: Global function. */
945 {
946 bfd_vma stackspace, typindx, offset;
947 debug_type return_type;
948
949 if (! ieee_read_number (abfd, bytes, pp, pend, &stackspace)
950 || ! ieee_read_number (abfd, bytes, pp, pend, &typindx)
951 || ! ieee_read_expression (abfd, bytes, pp, pend, &offset))
952 return false;
953
954 /* We have no way to record the stack space. FIXME. */
955
956 if (typindx < 256)
957 {
958 return_type = ieee_builtin_type (dhandle, abfd, types, bytes,
959 block_start, typindx);
960 if (return_type == NULL)
961 return false;
962 }
963 else
964 {
965 typindx -= 256;
966 if (! ieee_alloc_type (dhandle, types, typindx, true))
967 return false;
968 return_type = types->types[typindx].return_type;
969 if (return_type == NULL)
970 return_type = types->types[typindx].type;
971 }
972
973 namcopy = savestring (name, namlen);
974 if (namcopy == NULL)
975 return false;
976 if (! debug_record_function (dhandle, namcopy, return_type,
977 true, offset))
978 return false;
979 }
980 break;
981
982 case 5:
983 /* BB5: File name for source line numbers. */
984 {
985 unsigned int i;
986
987 /* We ignore the date and time. FIXME. */
988 for (i = 0; i < 6; i++)
989 {
990 bfd_vma ignore;
991 boolean present;
992
993 if (! ieee_read_optional_number (abfd, bytes, pp, pend, &ignore,
994 &present))
995 return false;
996 if (! present)
997 break;
998 }
999
1000 namcopy = savestring (name, namlen);
1001 if (namcopy == NULL)
1002 return false;
1003 if (! debug_start_source (dhandle, namcopy))
1004 return false;
1005 }
1006 break;
1007
1008 case 6:
1009 /* BB6: Local function or block. */
1010 {
1011 bfd_vma stackspace, typindx, offset;
1012
1013 if (! ieee_read_number (abfd, bytes, pp, pend, &stackspace)
1014 || ! ieee_read_number (abfd, bytes, pp, pend, &typindx)
1015 || ! ieee_read_expression (abfd, bytes, pp, pend, &offset))
1016 return false;
1017
1018 /* We have no way to record the stack space. FIXME. */
1019
1020 if (namlen == 0)
1021 {
1022 if (! debug_start_block (dhandle, offset))
1023 return false;
1024 /* Change b to indicate that this is a block
1025 rather than a function. */
1026 b = 0x86;
1027 }
1028 else
1029 {
1030 debug_type return_type;
1031
1032 if (typindx < 256)
1033 {
1034 return_type = ieee_builtin_type (dhandle, abfd, types, bytes,
1035 block_start, typindx);
1036 if (return_type == NULL)
1037 return false;
1038 }
1039 else
1040 {
1041 typindx -= 256;
1042 if (! ieee_alloc_type (dhandle, types, typindx, true))
1043 return false;
1044 return_type = types->types[typindx].return_type;
1045 if (return_type == NULL)
1046 return_type = types->types[typindx].type;
1047 }
1048
1049 namcopy = savestring (name, namlen);
1050 if (namcopy == NULL)
1051 return false;
1052 if (! debug_record_function (dhandle, namcopy, return_type,
1053 false, offset))
1054 return false;
1055 }
1056 }
1057 break;
1058
1059 case 10:
1060 /* BB10: Assembler module scope. We completely ignore all this
1061 information. FIXME. */
1062 {
1063 const char *inam, *vstr;
1064 unsigned long inamlen, vstrlen;
1065 bfd_vma tool_type;
1066 boolean present;
1067 unsigned int i;
1068
1069 if (! ieee_read_id (abfd, bytes, pp, pend, &inam, &inamlen)
1070 || ! ieee_read_number (abfd, bytes, pp, pend, &tool_type)
1071 || ! ieee_read_optional_id (abfd, bytes, pp, pend, &vstr, &vstrlen,
1072 &present))
1073 return false;
1074 for (i = 0; i < 6; i++)
1075 {
1076 bfd_vma ignore;
1077
1078 if (! ieee_read_optional_number (abfd, bytes, pp, pend, &ignore,
1079 &present))
1080 return false;
1081 if (! present)
1082 break;
1083 }
1084 }
1085 break;
1086
1087 case 11:
1088 /* BB11: Module section. We completely ignore all this
1089 information. FIXME. */
1090 {
1091 bfd_vma sectype, secindx, offset, map;
1092 boolean present;
1093
1094 if (! ieee_read_number (abfd, bytes, pp, pend, &sectype)
1095 || ! ieee_read_number (abfd, bytes, pp, pend, &secindx)
1096 || ! ieee_read_expression (abfd, bytes, pp, pend, &offset)
1097 || ! ieee_read_optional_number (abfd, bytes, pp, pend, &map,
1098 &present))
1099 return false;
1100 }
1101 break;
1102
1103 default:
1104 ieee_error (abfd, bytes, block_start, "unknown BB type");
1105 return false;
1106 }
1107
1108
1109 /* Push this block on the block stack. */
1110
1111 if (blockstack->bsp >= blockstack->stack + BLOCKSTACK_SIZE)
1112 {
1113 ieee_error (abfd, (const bfd_byte *) NULL, (const bfd_byte *) NULL,
1114 "stack overflow");
1115 return false;
1116 }
1117
1118 blockstack->bsp->kind = b;
1119 if (b == 5)
1120 blockstack->bsp->filename = namcopy;
1121 ++blockstack->bsp;
1122
1123 return true;
1124 }
1125
1126 /* Handle an IEEE BE record. */
1127
1128 static boolean
1129 parse_ieee_be (dhandle, abfd, blockstack, bytes, pp, pend)
1130 PTR dhandle;
1131 bfd *abfd;
1132 struct ieee_blockstack *blockstack;
1133 const bfd_byte *bytes;
1134 const bfd_byte **pp;
1135 const bfd_byte *pend;
1136 {
1137 bfd_vma offset;
1138
1139 if (blockstack->bsp <= blockstack->stack)
1140 {
1141 ieee_error (abfd, bytes, *pp, "stack underflow");
1142 return false;
1143 }
1144 --blockstack->bsp;
1145
1146 switch (blockstack->bsp->kind)
1147 {
1148 case 4:
1149 case 6:
1150 if (! ieee_read_expression (abfd, bytes, pp, pend, &offset))
1151 return false;
1152 if (! debug_end_function (dhandle, offset))
1153 return false;
1154 break;
1155
1156 case 0x86:
1157 /* This is BE6 when BB6 started a block rather than a local
1158 function. */
1159 if (! ieee_read_expression (abfd, bytes, pp, pend, &offset))
1160 return false;
1161 if (! debug_end_block (dhandle, offset))
1162 return false;
1163 break;
1164
1165 case 5:
1166 /* When we end a BB5, we look up the stack for the last BB5, if
1167 there is one, so that we can call debug_start_source. */
1168 if (blockstack->bsp > blockstack->stack)
1169 {
1170 struct ieee_block *bl;
1171
1172 bl = blockstack->bsp;
1173 do
1174 {
1175 --bl;
1176 if (bl->kind == 5)
1177 {
1178 if (! debug_start_source (dhandle, bl->filename))
1179 return false;
1180 break;
1181 }
1182 }
1183 while (bl != blockstack->stack);
1184 }
1185 break;
1186
1187 case 11:
1188 if (! ieee_read_expression (abfd, bytes, pp, pend, &offset))
1189 return false;
1190 /* We just ignore the module size. FIXME. */
1191 break;
1192
1193 default:
1194 /* Other block types do not have any trailing information. */
1195 break;
1196 }
1197
1198 return true;
1199 }
1200
1201 /* Parse an NN record. */
1202
1203 static boolean
1204 parse_ieee_nn (dhandle, abfd, vars, bytes, pp, pend)
1205 PTR dhandle;
1206 bfd *abfd;
1207 struct ieee_vars *vars;
1208 const bfd_byte *bytes;
1209 const bfd_byte **pp;
1210 const bfd_byte *pend;
1211 {
1212 const bfd_byte *nn_start;
1213 bfd_vma varindx;
1214 const char *name;
1215 unsigned long namlen;
1216
1217 nn_start = *pp;
1218
1219 if (! ieee_read_number (abfd, bytes, pp, pend, &varindx)
1220 || ! ieee_read_id (abfd, bytes, pp, pend, &name, &namlen))
1221 return false;
1222
1223 if (varindx < 32)
1224 {
1225 ieee_error (abfd, bytes, nn_start, "illegal variable index");
1226 return false;
1227 }
1228 varindx -= 32;
1229
1230 if (varindx >= vars->alloc)
1231 {
1232 unsigned int alloc;
1233
1234 alloc = vars->alloc;
1235 if (alloc == 0)
1236 alloc = 4;
1237 while (varindx >= alloc)
1238 alloc *= 2;
1239 vars->vars = ((struct ieee_var *)
1240 xrealloc (vars->vars, alloc * sizeof *vars->vars));
1241 memset (vars->vars + vars->alloc, 0,
1242 (alloc - vars->alloc) * sizeof *vars->vars);
1243 vars->alloc = alloc;
1244 }
1245
1246 vars->vars[varindx].name = name;
1247 vars->vars[varindx].namlen = namlen;
1248
1249 return true;
1250 }
1251
1252 /* Parse a TY record. */
1253
1254 static boolean
1255 parse_ieee_ty (dhandle, abfd, types, vars, bytes, pp, pend)
1256 PTR dhandle;
1257 bfd *abfd;
1258 struct ieee_types *types;
1259 struct ieee_vars *vars;
1260 const bfd_byte *bytes;
1261 const bfd_byte **pp;
1262 const bfd_byte *pend;
1263 {
1264 const bfd_byte *ty_start, *ty_var_start, *ty_code_start;
1265 bfd_vma typeindx, varindx, tc;
1266 debug_type type;
1267 boolean tag, typdef;
1268 unsigned long type_bitsize;
1269 debug_type return_type;
1270
1271 ty_start = *pp;
1272
1273 if (! ieee_read_number (abfd, bytes, pp, pend, &typeindx))
1274 return false;
1275
1276 if (typeindx < 256)
1277 {
1278 ieee_error (abfd, bytes, ty_start, "illegal type index");
1279 return false;
1280 }
1281
1282 typeindx -= 256;
1283 if (! ieee_alloc_type (dhandle, types, typeindx, false))
1284 return false;
1285
1286 if (**pp != 0xce)
1287 {
1288 ieee_error (abfd, bytes, *pp, "unknown TY code");
1289 return false;
1290 }
1291 ++*pp;
1292
1293 ty_var_start = *pp;
1294
1295 if (! ieee_read_number (abfd, bytes, pp, pend, &varindx))
1296 return false;
1297
1298 if (varindx < 32)
1299 {
1300 ieee_error (abfd, bytes, ty_var_start, "illegal variable index");
1301 return false;
1302 }
1303 varindx -= 32;
1304
1305 if (varindx >= vars->alloc || vars->vars[varindx].name == NULL)
1306 {
1307 ieee_error (abfd, bytes, ty_var_start, "undefined variable in TY");
1308 return false;
1309 }
1310
1311 ty_code_start = *pp;
1312
1313 if (! ieee_read_number (abfd, bytes, pp, pend, &tc))
1314 return false;
1315
1316 tag = false;
1317 typdef = false;
1318 type_bitsize = 0;
1319 return_type = DEBUG_TYPE_NULL;
1320 switch (tc)
1321 {
1322 default:
1323 ieee_error (abfd, bytes, ty_code_start, "unknown TY code");
1324 return false;
1325
1326 case '!':
1327 /* Unknown type, with size. We treat it as int. FIXME. */
1328 {
1329 bfd_vma size;
1330
1331 if (! ieee_read_number (abfd, bytes, pp, pend, &size))
1332 return false;
1333 type = debug_make_int_type (dhandle, size, false);
1334 }
1335 break;
1336
1337 case 'A': /* Array. */
1338 case 'a': /* FORTRAN array in column/row order. FIXME: Not
1339 distinguished from normal array. */
1340 {
1341 debug_type ele_type;
1342 bfd_vma lower, upper;
1343
1344 if (! ieee_read_type_index (dhandle, abfd, types, bytes, pp, pend,
1345 &ele_type)
1346 || ! ieee_read_number (abfd, bytes, pp, pend, &lower)
1347 || ! ieee_read_number (abfd, bytes, pp, pend, &upper))
1348 return false;
1349 type = debug_make_array_type (dhandle, ele_type,
1350 ieee_builtin_type (dhandle, abfd, types,
1351 bytes, ty_code_start,
1352 ((unsigned int)
1353 builtin_int)),
1354 (bfd_signed_vma) lower,
1355 (bfd_signed_vma) upper,
1356 false);
1357 }
1358 break;
1359
1360 case 'E':
1361 /* Simple enumeration. */
1362 {
1363 bfd_vma size;
1364 unsigned int alloc;
1365 const char **names;
1366 unsigned int c;
1367 bfd_signed_vma *vals;
1368 unsigned int i;
1369
1370 if (! ieee_read_number (abfd, bytes, pp, pend, &size))
1371 return false;
1372 /* FIXME: we ignore the enumeration size. */
1373
1374 alloc = 10;
1375 names = (const char **) xmalloc (alloc * sizeof *names);
1376 memset (names, 0, alloc * sizeof *names);
1377 c = 0;
1378 while (1)
1379 {
1380 const char *name;
1381 unsigned long namlen;
1382 boolean present;
1383
1384 if (! ieee_read_optional_id (abfd, bytes, pp, pend, &name,
1385 &namlen, &present))
1386 return false;
1387 if (! present)
1388 break;
1389
1390 if (c + 1 >= alloc)
1391 {
1392 alloc += 10;
1393 names = ((const char **)
1394 xrealloc (names, alloc * sizeof *names));
1395 }
1396
1397 names[c] = savestring (name, namlen);
1398 if (names[c] == NULL)
1399 return false;
1400 ++c;
1401 }
1402
1403 names[c] = NULL;
1404
1405 vals = (bfd_signed_vma *) xmalloc (c * sizeof *vals);
1406 for (i = 0; i < c; i++)
1407 vals[i] = i;
1408
1409 type = debug_make_enum_type (dhandle, names, vals);
1410 tag = true;
1411 }
1412 break;
1413
1414 case 'G':
1415 /* Struct with bit fields. */
1416 {
1417 bfd_vma size;
1418 unsigned int alloc;
1419 debug_field *fields;
1420 unsigned int c;
1421
1422 if (! ieee_read_number (abfd, bytes, pp, pend, &size))
1423 return false;
1424
1425 alloc = 10;
1426 fields = (debug_field *) xmalloc (alloc * sizeof *fields);
1427 c = 0;
1428 while (1)
1429 {
1430 const char *name;
1431 unsigned long namlen;
1432 boolean present;
1433 debug_type ftype;
1434 bfd_vma bitpos, bitsize;
1435
1436 if (! ieee_read_optional_id (abfd, bytes, pp, pend, &name,
1437 &namlen, &present))
1438 return false;
1439 if (! present)
1440 break;
1441 if (! ieee_read_type_index (dhandle, abfd, types, bytes, pp, pend,
1442 &ftype)
1443 || ! ieee_read_number (abfd, bytes, pp, pend, &bitpos)
1444 || ! ieee_read_number (abfd, bytes, pp, pend, &bitsize))
1445 return false;
1446
1447 if (c + 1 >= alloc)
1448 {
1449 alloc += 10;
1450 fields = ((debug_field *)
1451 xrealloc (fields, alloc * sizeof *fields));
1452 }
1453
1454 fields[c] = debug_make_field (dhandle, savestring (name, namlen),
1455 ftype, bitpos, bitsize,
1456 DEBUG_VISIBILITY_PUBLIC);
1457 if (fields[c] == NULL)
1458 return false;
1459 ++c;
1460 }
1461
1462 fields[c] = NULL;
1463
1464 type = debug_make_struct_type (dhandle, true, size, fields);
1465 tag = true;
1466 }
1467 break;
1468
1469 case 'N':
1470 /* Enumeration. */
1471 {
1472 unsigned int alloc;
1473 const char **names;
1474 bfd_signed_vma *vals;
1475 unsigned int c;
1476
1477 alloc = 10;
1478 names = (const char **) xmalloc (alloc * sizeof *names);
1479 vals = (bfd_signed_vma *) xmalloc (alloc * sizeof *names);
1480 c = 0;
1481 while (1)
1482 {
1483 const char *name;
1484 unsigned long namlen;
1485 boolean present;
1486 bfd_vma val;
1487
1488 if (! ieee_read_optional_id (abfd, bytes, pp, pend, &name,
1489 &namlen, &present))
1490 return false;
1491 if (! present)
1492 break;
1493 if (! ieee_read_number (abfd, bytes, pp, pend, &val))
1494 return false;
1495
1496 /* If the length of the name is zero, then the value is
1497 actually the size of the enum. We ignore this
1498 information. FIXME. */
1499 if (namlen == 0)
1500 continue;
1501
1502 if (c + 1 >= alloc)
1503 {
1504 alloc += 10;
1505 names = ((const char **)
1506 xrealloc (names, alloc * sizeof *names));
1507 vals = ((bfd_signed_vma *)
1508 xrealloc (vals, alloc * sizeof *vals));
1509 }
1510
1511 names[c] = savestring (name, namlen);
1512 if (names[c] == NULL)
1513 return false;
1514 vals[c] = (bfd_signed_vma) val;
1515 ++c;
1516 }
1517
1518 names[c] = NULL;
1519
1520 type = debug_make_enum_type (dhandle, names, vals);
1521 tag = true;
1522 }
1523 break;
1524
1525 case 'O': /* Small pointer. We don't distinguish small and large
1526 pointers. FIXME. */
1527 case 'P': /* Large pointer. */
1528 {
1529 debug_type t;
1530
1531 if (! ieee_read_type_index (dhandle, abfd, types, bytes, pp, pend, &t))
1532 return false;
1533 type = debug_make_pointer_type (dhandle, t);
1534 }
1535 break;
1536
1537 case 'R':
1538 /* Range. */
1539 {
1540 bfd_vma low, high, signedp, size;
1541
1542 if (! ieee_read_number (abfd, bytes, pp, pend, &low)
1543 || ! ieee_read_number (abfd, bytes, pp, pend, &high)
1544 || ! ieee_read_number (abfd, bytes, pp, pend, &signedp)
1545 || ! ieee_read_number (abfd, bytes, pp, pend, &size))
1546 return false;
1547
1548 type = debug_make_range_type (dhandle,
1549 debug_make_int_type (dhandle, size,
1550 ! signedp),
1551 (bfd_signed_vma) low,
1552 (bfd_signed_vma) high);
1553 }
1554 break;
1555
1556 case 'S': /* Struct. */
1557 case 'U': /* Union. */
1558 {
1559 bfd_vma size;
1560 unsigned int alloc;
1561 debug_field *fields;
1562 unsigned int c;
1563
1564 if (! ieee_read_number (abfd, bytes, pp, pend, &size))
1565 return false;
1566
1567 alloc = 10;
1568 fields = (debug_field *) xmalloc (alloc * sizeof *fields);
1569 c = 0;
1570 while (1)
1571 {
1572 const char *name;
1573 unsigned long namlen;
1574 boolean present;
1575 bfd_vma tindx;
1576 bfd_vma offset;
1577 debug_type ftype;
1578 bfd_vma bitsize;
1579
1580 if (! ieee_read_optional_id (abfd, bytes, pp, pend, &name,
1581 &namlen, &present))
1582 return false;
1583 if (! present)
1584 break;
1585 if (! ieee_read_number (abfd, bytes, pp, pend, &tindx)
1586 || ! ieee_read_number (abfd, bytes, pp, pend, &offset))
1587 return false;
1588
1589 if (tindx < 256)
1590 {
1591 ftype = ieee_builtin_type (dhandle, abfd, types, bytes,
1592 ty_code_start, tindx);
1593 bitsize = 0;
1594 offset *= 8;
1595 }
1596 else
1597 {
1598 struct ieee_type *t;
1599
1600 tindx -= 256;
1601 if (! ieee_alloc_type (dhandle, types, tindx, true))
1602 return false;
1603 t = types->types + tindx;
1604 ftype = t->type;
1605 bitsize = t->bitsize;
1606 if (bitsize == 0)
1607 offset *= 8;
1608 }
1609
1610 if (c + 1 >= alloc)
1611 {
1612 alloc += 10;
1613 fields = ((debug_field *)
1614 xrealloc (fields, alloc * sizeof *fields));
1615 }
1616
1617 fields[c] = debug_make_field (dhandle, savestring (name, namlen),
1618 ftype, offset, bitsize,
1619 DEBUG_VISIBILITY_PUBLIC);
1620 if (fields[c] == NULL)
1621 return false;
1622 ++c;
1623 }
1624
1625 fields[c] = NULL;
1626
1627 type = debug_make_struct_type (dhandle, tc == 'S', size, fields);
1628 tag = true;
1629 }
1630 break;
1631
1632 case 'T':
1633 /* Typedef. */
1634 if (! ieee_read_type_index (dhandle, abfd, types, bytes, pp, pend,
1635 &type))
1636 return false;
1637 typdef = true;
1638 break;
1639
1640 case 'X':
1641 /* Procedure. FIXME: This is an extern declaration, which we
1642 have no way of representing. */
1643 {
1644 bfd_vma attr;
1645 debug_type rtype;
1646 bfd_vma nargs;
1647 boolean present;
1648
1649 /* FIXME: We ignore the attribute and the argument names. */
1650
1651 if (! ieee_read_number (abfd, bytes, pp, pend, &attr)
1652 || ! ieee_read_type_index (dhandle, abfd, types, bytes, pp, pend,
1653 &rtype)
1654 || ! ieee_read_number (abfd, bytes, pp, pend, &nargs))
1655 return false;
1656 do
1657 {
1658 const char *name;
1659 unsigned long namlen;
1660
1661 if (! ieee_read_optional_id (abfd, bytes, pp, pend, &name,
1662 &namlen, &present))
1663 return false;
1664 }
1665 while (present);
1666
1667 type = debug_make_function_type (dhandle, rtype);
1668 return_type = rtype;
1669 }
1670 break;
1671
1672 case 'Z':
1673 /* Array with 0 lower bound. */
1674 {
1675 debug_type etype;
1676 bfd_vma high;
1677
1678 if (! ieee_read_type_index (dhandle, abfd, types, bytes, pp, pend,
1679 &etype)
1680 || ! ieee_read_number (abfd, bytes, pp, pend, &high))
1681 return false;
1682
1683 type = debug_make_array_type (dhandle, etype,
1684 ieee_builtin_type (dhandle, abfd, types,
1685 bytes, ty_code_start,
1686 ((unsigned int)
1687 builtin_int)),
1688 0, (bfd_signed_vma) high, false);
1689 }
1690 break;
1691
1692 case 'c': /* Complex. */
1693 case 'd': /* Double complex. */
1694 {
1695 const char *name;
1696 unsigned long namlen;
1697
1698 /* FIXME: I don't know what the name means. */
1699
1700 if (! ieee_read_id (abfd, bytes, pp, pend, &name, &namlen))
1701 return false;
1702
1703 type = debug_make_complex_type (dhandle, tc == 'c' ? 4 : 8);
1704 }
1705 break;
1706
1707 case 'f':
1708 /* Pascal file name. FIXME. */
1709 ieee_error (abfd, bytes, ty_code_start,
1710 "Pascal file name not supported");
1711 return false;
1712
1713 case 'g':
1714 /* Bitfield type. */
1715 {
1716 bfd_vma signedp, bitsize;
1717
1718 if (! ieee_read_number (abfd, bytes, pp, pend, &signedp)
1719 || ! ieee_read_number (abfd, bytes, pp, pend, &bitsize)
1720 || ! ieee_read_type_index (dhandle, abfd, types, bytes, pp, pend,
1721 &type))
1722 return false;
1723
1724 /* FIXME: This is just a guess. */
1725 if (! signedp)
1726 type = debug_make_int_type (dhandle, 4, true);
1727 type_bitsize = bitsize;
1728 }
1729 break;
1730
1731 case 'n':
1732 /* Qualifier. */
1733 {
1734 bfd_vma kind;
1735 debug_type t;
1736
1737 if (! ieee_read_number (abfd, bytes, pp, pend, &kind)
1738 || ! ieee_read_type_index (dhandle, abfd, types, bytes, pp, pend,
1739 &t))
1740 return false;
1741
1742 switch (kind)
1743 {
1744 default:
1745 ieee_error (abfd, bytes, ty_start, "unsupported qualifer");
1746 return false;
1747
1748 case 1:
1749 type = debug_make_const_type (dhandle, t);
1750 break;
1751
1752 case 2:
1753 type = debug_make_volatile_type (dhandle, t);
1754 break;
1755 }
1756 }
1757 break;
1758
1759 case 's':
1760 /* Set. */
1761 {
1762 bfd_vma size;
1763 debug_type etype;
1764
1765 if (! ieee_read_number (abfd, bytes, pp, pend, &size)
1766 || ! ieee_read_type_index (dhandle, abfd, types, bytes, pp, pend,
1767 &etype))
1768 return false;
1769
1770 /* FIXME: We ignore the size. */
1771
1772 type = debug_make_set_type (dhandle, etype, false);
1773 }
1774 break;
1775
1776 case 'x':
1777 /* Procedure with compiler dependencies. FIXME: This is an
1778 extern declaration, which we have no way of representing. */
1779 {
1780 bfd_vma attr, frame_type, push_mask, nargs, level, father;
1781 debug_type rtype;
1782 boolean present;
1783
1784 /* FIXME: We ignore almost all this information. */
1785
1786 if (! ieee_read_number (abfd, bytes, pp, pend, &attr)
1787 || ! ieee_read_number (abfd, bytes, pp, pend, &frame_type)
1788 || ! ieee_read_number (abfd, bytes, pp, pend, &push_mask)
1789 || ! ieee_read_type_index (dhandle, abfd, types, bytes, pp, pend,
1790 &rtype)
1791 || ! ieee_read_number (abfd, bytes, pp, pend, &nargs))
1792 return false;
1793 if (nargs != (bfd_vma) -1)
1794 {
1795 for (; nargs > 0; nargs--)
1796 {
1797 debug_type atype;
1798
1799 if (! ieee_read_type_index (dhandle, abfd, types, bytes, pp,
1800 pend, &atype))
1801 return false;
1802 }
1803 }
1804 if (! ieee_read_number (abfd, bytes, pp, pend, &level)
1805 || ! ieee_read_optional_number (abfd, bytes, pp, pend, &father,
1806 &present))
1807 return false;
1808
1809 type = debug_make_function_type (dhandle, rtype);
1810 return_type = rtype;
1811 }
1812 break;
1813 }
1814
1815 /* Record the type in the table. If the corresponding NN record has
1816 a name, name it. FIXME: Is this always correct? */
1817
1818 if (type == NULL)
1819 return false;
1820
1821 if ((tag || typdef)
1822 && vars->vars[varindx].namlen > 0)
1823 {
1824 const char *name;
1825
1826 name = savestring (vars->vars[varindx].name,
1827 vars->vars[varindx].namlen);
1828 if (tag)
1829 type = debug_tag_type (dhandle, name, type);
1830 else
1831 type = debug_name_type (dhandle, name, type);
1832 if (type == NULL)
1833 return false;
1834 }
1835
1836 types->types[typeindx].type = type;
1837 types->types[typeindx].bitsize = type_bitsize;
1838 types->types[typeindx].return_type = return_type;
1839
1840 /* We may have already allocated type as an indirect type pointing
1841 to slot. It does no harm to replace the indirect type with the
1842 real type. Filling in slot as well handles the indirect types
1843 which are already hanging around. */
1844 if (types->types[typeindx].pslot != NULL)
1845 *types->types[typeindx].pslot = type;
1846
1847 return true;
1848 }
1849
1850 /* Parse an ATN record. */
1851
1852 static boolean
1853 parse_ieee_atn (dhandle, abfd, types, vars, blocktype, bytes, pp, pend)
1854 PTR dhandle;
1855 bfd *abfd;
1856 struct ieee_types *types;
1857 struct ieee_vars *vars;
1858 int blocktype;
1859 const bfd_byte *bytes;
1860 const bfd_byte **pp;
1861 const bfd_byte *pend;
1862 {
1863 const bfd_byte *atn_start, *atn_code_start;
1864 bfd_vma varindx;
1865 boolean zeroindx;
1866 debug_type type;
1867 bfd_vma atn_code;
1868 bfd_vma v, v2, v3, v4, v5;
1869 const char *name;
1870 unsigned long namlen;
1871 char *namcopy;
1872 boolean present;
1873
1874 atn_start = *pp;
1875
1876 if (! ieee_read_number (abfd, bytes, pp, pend, &varindx)
1877 || ! ieee_read_type_index (dhandle, abfd, types, bytes, pp, pend, &type))
1878 return false;
1879
1880 atn_code_start = *pp;
1881
1882 if (! ieee_read_number (abfd, bytes, pp, pend, &atn_code))
1883 return false;
1884
1885 if (varindx == 0)
1886 {
1887 zeroindx = true;
1888 name = "";
1889 namlen = 0;
1890 }
1891 else if (varindx < 32)
1892 {
1893 ieee_error (abfd, bytes, atn_start, "illegal variable index");
1894 return false;
1895 }
1896 else
1897 {
1898 varindx -= 32;
1899 zeroindx = false;
1900 if (varindx >= vars->alloc || vars->vars[varindx].name == NULL)
1901 {
1902 ieee_error (abfd, bytes, atn_start, "undefined variable in ATN");
1903 return false;
1904 }
1905
1906 vars->vars[varindx].type = type;
1907
1908 name = vars->vars[varindx].name;
1909 namlen = vars->vars[varindx].namlen;
1910 }
1911
1912 switch (atn_code)
1913 {
1914 default:
1915 ieee_error (abfd, bytes, atn_code_start, "unknown ATN type");
1916 return false;
1917
1918 case 1:
1919 /* Automatic variable. */
1920 if (! ieee_read_number (abfd, bytes, pp, pend, &v))
1921 return false;
1922 namcopy = savestring (name, namlen);
1923 if (type == NULL)
1924 type = debug_make_void_type (dhandle);
1925 return debug_record_variable (dhandle, namcopy, type, DEBUG_LOCAL, v);
1926
1927 case 2:
1928 /* Register variable. */
1929 if (! ieee_read_number (abfd, bytes, pp, pend, &v))
1930 return false;
1931 namcopy = savestring (name, namlen);
1932 if (type == NULL)
1933 type = debug_make_void_type (dhandle);
1934 return debug_record_variable (dhandle, namcopy, type, DEBUG_REGISTER,
1935 ieee_regno_to_genreg (abfd, v));
1936
1937 case 3:
1938 /* Static variable. */
1939 if (! ieee_require_asn (abfd, bytes, pp, pend, &v))
1940 return false;
1941 namcopy = savestring (name, namlen);
1942 if (type == NULL)
1943 type = debug_make_void_type (dhandle);
1944 return debug_record_variable (dhandle, namcopy, type,
1945 (blocktype == 4 || blocktype == 6
1946 ? DEBUG_LOCAL_STATIC
1947 : DEBUG_STATIC),
1948 v);
1949
1950 case 4:
1951 /* External function. We don't currently record these. FIXME. */
1952 return true;
1953
1954 case 5:
1955 /* External variable. We don't currently record these. FIXME. */
1956 return true;
1957
1958 case 7:
1959 if (! ieee_read_number (abfd, bytes, pp, pend, &v)
1960 || ! ieee_read_number (abfd, bytes, pp, pend, &v2)
1961 || ! ieee_read_optional_number (abfd, bytes, pp, pend, &v3,
1962 &present))
1963 return false;
1964 if (present)
1965 {
1966 if (! ieee_read_optional_number (abfd, bytes, pp, pend, &v4,
1967 &present))
1968 return false;
1969 }
1970
1971 /* We just ignore the two optional fields in v3 and v4, since
1972 they are not defined. */
1973
1974 if (! ieee_require_asn (abfd, bytes, pp, pend, &v3))
1975 return false;
1976
1977 /* We have no way to record the column number. FIXME. */
1978
1979 return debug_record_line (dhandle, v, v3);
1980
1981 case 8:
1982 /* Global variable. */
1983 if (! ieee_require_asn (abfd, bytes, pp, pend, &v))
1984 return false;
1985 namcopy = savestring (name, namlen);
1986 if (type == NULL)
1987 type = debug_make_void_type (dhandle);
1988 return debug_record_variable (dhandle, namcopy, type, DEBUG_GLOBAL, v);
1989
1990 case 9:
1991 /* Variable lifetime information. */
1992 if (! ieee_read_number (abfd, bytes, pp, pend, &v))
1993 return false;
1994
1995 /* We have no way to record this information. FIXME. */
1996 return true;
1997
1998 case 10:
1999 /* Locked register. */
2000 if (! ieee_read_number (abfd, bytes, pp, pend, &v)
2001 || ! ieee_read_number (abfd, bytes, pp, pend, &v2))
2002 return false;
2003
2004 /* I think this means a variable that is both in a register and
2005 a frame slot. We ignore the frame slot. FIXME. */
2006
2007 namcopy = savestring (name, namlen);
2008 if (type == NULL)
2009 type = debug_make_void_type (dhandle);
2010 return debug_record_variable (dhandle, namcopy, type, DEBUG_REGISTER, v);
2011
2012 case 11:
2013 /* Reserved for FORTRAN common. */
2014 ieee_error (abfd, bytes, atn_code_start, "unsupported ATN11");
2015
2016 /* Return true to keep going. */
2017 return true;
2018
2019 case 12:
2020 /* Based variable. */
2021 v3 = 0;
2022 v4 = 0x80;
2023 v5 = 0;
2024 if (! ieee_read_number (abfd, bytes, pp, pend, &v)
2025 || ! ieee_read_number (abfd, bytes, pp, pend, &v2)
2026 || ! ieee_read_optional_number (abfd, bytes, pp, pend, &v3,
2027 &present))
2028 return false;
2029 if (present)
2030 {
2031 if (! ieee_read_optional_number (abfd, bytes, pp, pend, &v4,
2032 &present))
2033 return false;
2034 if (present)
2035 {
2036 if (! ieee_read_optional_number (abfd, bytes, pp, pend, &v5,
2037 &present))
2038 return false;
2039 }
2040 }
2041
2042 /* We have no way to record this information. FIXME. */
2043
2044 ieee_error (abfd, bytes, atn_code_start, "unsupported ATN12");
2045
2046 /* Return true to keep going. */
2047 return true;
2048
2049 case 16:
2050 /* Constant. The description of this that I have is ambiguous,
2051 so I'm not going to try to implement it. */
2052 ieee_error (abfd, bytes, atn_code_start, "unsupported ATN16");
2053 return false;
2054
2055 case 19:
2056 /* Static variable from assembler. */
2057 v2 = 0;
2058 if (! ieee_read_number (abfd, bytes, pp, pend, &v)
2059 || ! ieee_read_optional_number (abfd, bytes, pp, pend, &v2,
2060 &present)
2061 || ! ieee_require_asn (abfd, bytes, pp, pend, &v3))
2062 return false;
2063 namcopy = savestring (name, namlen);
2064 /* We don't really handle this correctly. FIXME. */
2065 return debug_record_variable (dhandle, namcopy,
2066 debug_make_void_type (dhandle),
2067 v2 != 0 ? DEBUG_GLOBAL : DEBUG_STATIC,
2068 v3);
2069
2070 case 62:
2071 /* Procedure miscellaneous information. */
2072 case 63:
2073 /* Variable miscellaneous information. */
2074 case 64:
2075 /* Module miscellaneous information. */
2076 if (! ieee_read_number (abfd, bytes, pp, pend, &v)
2077 || ! ieee_read_number (abfd, bytes, pp, pend, &v2)
2078 || ! ieee_read_optional_id (abfd, bytes, pp, pend, &name, &namlen,
2079 &present))
2080 return false;
2081
2082 /* We just ignore all of this stuff. FIXME. */
2083
2084 for (; v2 > 0; --v2)
2085 {
2086 ieee_record_enum_type c;
2087 bfd_vma vindx;
2088 const char *str;
2089 unsigned long strlen;
2090
2091 c = (ieee_record_enum_type) **pp;
2092 ++*pp;
2093 if (c != ieee_at_record_enum
2094 && c != ieee_e2_first_byte_enum)
2095 {
2096 ieee_error (abfd, bytes, *pp - 1, "bad misc record");
2097 return false;
2098 }
2099
2100 c = (ieee_record_enum_type) (((unsigned int) c << 8) | **pp);
2101 ++*pp;
2102 switch (c)
2103 {
2104 default:
2105 ieee_error (abfd, bytes, *pp - 2, "bad misc record");
2106 return false;
2107
2108 case ieee_atn_record_enum:
2109 if (! ieee_read_number (abfd, bytes, pp, pend, &vindx))
2110 return false;
2111 if ((*pp)[0] != 0 || (*pp)[1] != 65)
2112 {
2113 ieee_error (abfd, bytes, *pp, "bad atn in misc");
2114 return false;
2115 }
2116 *pp += 2;
2117 if (! ieee_read_id (abfd, bytes, pp, pend, &str, &strlen))
2118 return false;
2119 break;
2120
2121 case ieee_asn_record_enum:
2122 if (! ieee_read_number (abfd, bytes, pp, pend, &vindx)
2123 || ! ieee_read_expression (abfd, bytes, pp, pend, &v3))
2124 return false;
2125 break;
2126 }
2127 }
2128
2129 return true;
2130 }
2131
2132 /*NOTREACHED*/
2133 }
2134
2135 /* Require an ASN record. */
2136
2137 static boolean
2138 ieee_require_asn (abfd, bytes, pp, pend, pv)
2139 bfd *abfd;
2140 const bfd_byte *bytes;
2141 const bfd_byte **pp;
2142 const bfd_byte *pend;
2143 bfd_vma *pv;
2144 {
2145 const bfd_byte *start;
2146 ieee_record_enum_type c;
2147 bfd_vma varindx;
2148
2149 start = *pp;
2150
2151 c = (ieee_record_enum_type) **pp;
2152 if (c != ieee_e2_first_byte_enum)
2153 {
2154 ieee_error (abfd, bytes, start, "missing required ASN");
2155 return false;
2156 }
2157 ++*pp;
2158
2159 c = (ieee_record_enum_type) (((unsigned int) c << 8) | **pp);
2160 if (c != ieee_asn_record_enum)
2161 {
2162 ieee_error (abfd, bytes, start, "missing required ASN");
2163 return false;
2164 }
2165 ++*pp;
2166
2167 /* Just ignore the variable index. */
2168 if (! ieee_read_number (abfd, bytes, pp, pend, &varindx))
2169 return false;
2170
2171 return ieee_read_expression (abfd, bytes, pp, pend, pv);
2172 }
2173 \f
2174 /* Convert a register number in IEEE debugging information into a
2175 generic register number. */
2176
2177 static int
2178 ieee_regno_to_genreg (abfd, r)
2179 bfd *abfd;
2180 int r;
2181 {
2182 return r;
2183 }
2184
2185 /* Convert a generic register number to an IEEE specific one. */
2186
2187 static int
2188 ieee_genreg_to_regno (abfd, r)
2189 bfd *abfd;
2190 int r;
2191 {
2192 return r;
2193 }
2194 \f
2195 /* These routines build IEEE debugging information out of the generic
2196 debugging information. */
2197
2198 /* We build the IEEE debugging information byte by byte. Rather than
2199 waste time copying data around, we use a linked list of buffers to
2200 hold the data. */
2201
2202 #define IEEE_BUFSIZE (490)
2203
2204 struct ieee_buf
2205 {
2206 /* Next buffer. */
2207 struct ieee_buf *next;
2208 /* Number of data bytes in this buffer. */
2209 unsigned int c;
2210 /* Bytes. */
2211 bfd_byte buf[IEEE_BUFSIZE];
2212 };
2213
2214 /* In order to generate the BB11 blocks required by the HP emulator,
2215 we keep track of ranges of addresses which correspond to a given
2216 compilation unit. */
2217
2218 struct ieee_range
2219 {
2220 /* Next range. */
2221 struct ieee_range *next;
2222 /* Low address. */
2223 bfd_vma low;
2224 /* High address. */
2225 bfd_vma high;
2226 };
2227
2228 /* This is how we store types for the writing routines. Most types
2229 are simply represented by a type index. */
2230
2231 struct ieee_write_type
2232 {
2233 /* Type index. */
2234 unsigned int indx;
2235 /* The size of the type, if known. */
2236 unsigned int size;
2237 /* If this is a struct, this is where the struct definition is
2238 built. */
2239 struct ieee_buf *strdef;
2240 /* Whether the type is unsigned. */
2241 unsigned int unsignedp : 1;
2242 /* Whether this is a reference type. */
2243 unsigned int referencep : 1;
2244 };
2245
2246 /* This is the type stack used by the debug writing routines. FIXME:
2247 We could generate more efficient output if we remembered when we
2248 have output a particular type before. */
2249
2250 struct ieee_type_stack
2251 {
2252 /* Next entry on stack. */
2253 struct ieee_type_stack *next;
2254 /* Type information. */
2255 struct ieee_write_type type;
2256 };
2257
2258 /* This is a list of associations between names and types. This could
2259 be more efficiently implemented as a hash table. */
2260
2261 struct ieee_name_type
2262 {
2263 /* Next name/type assocation. */
2264 struct ieee_name_type *next;
2265 /* Name. */
2266 const char *name;
2267 /* Type. */
2268 struct ieee_write_type type;
2269 /* If this is a tag which has not yet been defined, this is the
2270 kind. If the tag has been defined, this is DEBUG_KIND_ILLEGAL. */
2271 enum debug_type_kind kind;
2272 };
2273
2274 /* This is a list of pending function parameter information. We don't
2275 output them until we see the first block. */
2276
2277 struct ieee_pending_parm
2278 {
2279 /* Next pending parameter. */
2280 struct ieee_pending_parm *next;
2281 /* Name. */
2282 const char *name;
2283 /* Type index. */
2284 unsigned int type;
2285 /* Kind. */
2286 enum debug_parm_kind kind;
2287 /* Value. */
2288 bfd_vma val;
2289 };
2290
2291 /* This is the handle passed down by debug_write. */
2292
2293 struct ieee_handle
2294 {
2295 /* BFD we are writing to. */
2296 bfd *abfd;
2297 /* Current data buffer. */
2298 struct ieee_buf *current;
2299 /* Filename of current compilation unit. */
2300 const char *filename;
2301 /* Module name of current compilation unit. */
2302 const char *modname;
2303 /* List of finished data buffers. */
2304 struct ieee_buf *data;
2305 /* List of buffers for typedefs in the current compilation unit. */
2306 struct ieee_buf *types;
2307 /* List of buffers for variables and functions in the current
2308 compilation unit. */
2309 struct ieee_buf *vars;
2310 /* List of buffers for line numbers in the current compilation unit. */
2311 struct ieee_buf *linenos;
2312 /* Ranges for the current compilation unit. */
2313 struct ieee_range *ranges;
2314 /* Nested pending ranges. */
2315 struct ieee_range *pending_ranges;
2316 /* Type stack. */
2317 struct ieee_type_stack *type_stack;
2318 /* Next unallocated type index. */
2319 unsigned int type_indx;
2320 /* Next unallocated name index. */
2321 unsigned int name_indx;
2322 /* Typedefs. */
2323 struct ieee_name_type *typedefs;
2324 /* Tags. */
2325 struct ieee_name_type *tags;
2326 /* The depth of block nesting. This is 0 outside a function, and 1
2327 just after start_function is called. */
2328 unsigned int block_depth;
2329 /* Pending function parameters. */
2330 struct ieee_pending_parm *pending_parms;
2331 /* Current line number filename. */
2332 const char *lineno_filename;
2333 /* Line number name index. */
2334 unsigned int lineno_name_indx;
2335 };
2336
2337 static boolean ieee_change_buffer
2338 PARAMS ((struct ieee_handle *, struct ieee_buf **));
2339 static boolean ieee_push_type
2340 PARAMS ((struct ieee_handle *, unsigned int, unsigned int, boolean));
2341 static unsigned int ieee_pop_type PARAMS ((struct ieee_handle *));
2342 static boolean ieee_add_range
2343 PARAMS ((struct ieee_handle *, bfd_vma, bfd_vma));
2344 static boolean ieee_start_range PARAMS ((struct ieee_handle *, bfd_vma));
2345 static boolean ieee_end_range PARAMS ((struct ieee_handle *, bfd_vma));
2346 static boolean ieee_real_write_byte PARAMS ((struct ieee_handle *, int));
2347 static boolean ieee_write_2bytes PARAMS ((struct ieee_handle *, int));
2348 static boolean ieee_write_number PARAMS ((struct ieee_handle *, bfd_vma));
2349 static boolean ieee_write_id PARAMS ((struct ieee_handle *, const char *));
2350 static boolean ieee_define_type
2351 PARAMS ((struct ieee_handle *, unsigned int, boolean));
2352 static boolean ieee_define_named_type
2353 PARAMS ((struct ieee_handle *, const char *, boolean, unsigned int, boolean,
2354 struct ieee_buf **));
2355 static boolean ieee_finish_compilation_unit PARAMS ((struct ieee_handle *));
2356 static boolean ieee_output_pending_parms PARAMS ((struct ieee_handle *));
2357
2358 static boolean ieee_start_compilation_unit PARAMS ((PTR, const char *));
2359 static boolean ieee_start_source PARAMS ((PTR, const char *));
2360 static boolean ieee_ellipsis_type PARAMS ((PTR));
2361 static boolean ieee_empty_type PARAMS ((PTR));
2362 static boolean ieee_void_type PARAMS ((PTR));
2363 static boolean ieee_int_type PARAMS ((PTR, unsigned int, boolean));
2364 static boolean ieee_float_type PARAMS ((PTR, unsigned int));
2365 static boolean ieee_complex_type PARAMS ((PTR, unsigned int));
2366 static boolean ieee_bool_type PARAMS ((PTR, unsigned int));
2367 static boolean ieee_enum_type
2368 PARAMS ((PTR, const char *, const char **, bfd_signed_vma *));
2369 static boolean ieee_pointer_type PARAMS ((PTR));
2370 static boolean ieee_function_type PARAMS ((PTR));
2371 static boolean ieee_reference_type PARAMS ((PTR));
2372 static boolean ieee_range_type PARAMS ((PTR, bfd_signed_vma, bfd_signed_vma));
2373 static boolean ieee_array_type
2374 PARAMS ((PTR, bfd_signed_vma, bfd_signed_vma, boolean));
2375 static boolean ieee_set_type PARAMS ((PTR, boolean));
2376 static boolean ieee_offset_type PARAMS ((PTR));
2377 static boolean ieee_method_type PARAMS ((PTR, boolean, int));
2378 static boolean ieee_const_type PARAMS ((PTR));
2379 static boolean ieee_volatile_type PARAMS ((PTR));
2380 static boolean ieee_start_struct_type
2381 PARAMS ((PTR, const char *, unsigned int, boolean, unsigned int));
2382 static boolean ieee_struct_field
2383 PARAMS ((PTR, const char *, bfd_vma, bfd_vma, enum debug_visibility));
2384 static boolean ieee_end_struct_type PARAMS ((PTR));
2385 static boolean ieee_start_class_type
2386 PARAMS ((PTR, const char *, unsigned int, boolean, unsigned int, boolean,
2387 boolean));
2388 static boolean ieee_class_static_member
2389 PARAMS ((PTR, const char *, const char *, enum debug_visibility));
2390 static boolean ieee_class_baseclass
2391 PARAMS ((PTR, bfd_vma, boolean, enum debug_visibility));
2392 static boolean ieee_class_start_method PARAMS ((PTR, const char *));
2393 static boolean ieee_class_method_variant
2394 PARAMS ((PTR, const char *, enum debug_visibility, boolean, boolean,
2395 bfd_vma, boolean));
2396 static boolean ieee_class_static_method_variant
2397 PARAMS ((PTR, const char *, enum debug_visibility, boolean, boolean));
2398 static boolean ieee_class_end_method PARAMS ((PTR));
2399 static boolean ieee_end_class_type PARAMS ((PTR));
2400 static boolean ieee_typedef_type PARAMS ((PTR, const char *));
2401 static boolean ieee_tag_type
2402 PARAMS ((PTR, const char *, unsigned int, enum debug_type_kind));
2403 static boolean ieee_typdef PARAMS ((PTR, const char *));
2404 static boolean ieee_tag PARAMS ((PTR, const char *));
2405 static boolean ieee_int_constant PARAMS ((PTR, const char *, bfd_vma));
2406 static boolean ieee_float_constant PARAMS ((PTR, const char *, double));
2407 static boolean ieee_typed_constant PARAMS ((PTR, const char *, bfd_vma));
2408 static boolean ieee_variable
2409 PARAMS ((PTR, const char *, enum debug_var_kind, bfd_vma));
2410 static boolean ieee_start_function PARAMS ((PTR, const char *, boolean));
2411 static boolean ieee_function_parameter
2412 PARAMS ((PTR, const char *, enum debug_parm_kind, bfd_vma));
2413 static boolean ieee_start_block PARAMS ((PTR, bfd_vma));
2414 static boolean ieee_end_block PARAMS ((PTR, bfd_vma));
2415 static boolean ieee_end_function PARAMS ((PTR));
2416 static boolean ieee_lineno
2417 PARAMS ((PTR, const char *, unsigned long, bfd_vma));
2418
2419 static const struct debug_write_fns ieee_fns =
2420 {
2421 ieee_start_compilation_unit,
2422 ieee_start_source,
2423 ieee_ellipsis_type,
2424 ieee_empty_type,
2425 ieee_void_type,
2426 ieee_int_type,
2427 ieee_float_type,
2428 ieee_complex_type,
2429 ieee_bool_type,
2430 ieee_enum_type,
2431 ieee_pointer_type,
2432 ieee_function_type,
2433 ieee_reference_type,
2434 ieee_range_type,
2435 ieee_array_type,
2436 ieee_set_type,
2437 ieee_offset_type,
2438 ieee_method_type,
2439 ieee_const_type,
2440 ieee_volatile_type,
2441 ieee_start_struct_type,
2442 ieee_struct_field,
2443 ieee_end_struct_type,
2444 ieee_start_class_type,
2445 ieee_class_static_member,
2446 ieee_class_baseclass,
2447 ieee_class_start_method,
2448 ieee_class_method_variant,
2449 ieee_class_static_method_variant,
2450 ieee_class_end_method,
2451 ieee_end_class_type,
2452 ieee_typedef_type,
2453 ieee_tag_type,
2454 ieee_typdef,
2455 ieee_tag,
2456 ieee_int_constant,
2457 ieee_float_constant,
2458 ieee_typed_constant,
2459 ieee_variable,
2460 ieee_start_function,
2461 ieee_function_parameter,
2462 ieee_start_block,
2463 ieee_end_block,
2464 ieee_end_function,
2465 ieee_lineno
2466 };
2467
2468 /* Change the current buffer to a specified buffer chain. */
2469
2470 static boolean
2471 ieee_change_buffer (info, ppbuf)
2472 struct ieee_handle *info;
2473 struct ieee_buf **ppbuf;
2474 {
2475 struct ieee_buf *buf;
2476
2477 if (*ppbuf != NULL)
2478 {
2479 for (buf = *ppbuf; buf->next != NULL; buf = buf->next)
2480 ;
2481 }
2482 else
2483 {
2484 buf = (struct ieee_buf *) xmalloc (sizeof *buf);
2485 buf->next = NULL;
2486 buf->c = 0;
2487 *ppbuf = buf;
2488 }
2489
2490 info->current = buf;
2491 return true;
2492 }
2493
2494 /* Push a type index onto the type stack. */
2495
2496 static boolean
2497 ieee_push_type (info, indx, size, unsignedp)
2498 struct ieee_handle *info;
2499 unsigned int indx;
2500 unsigned int size;
2501 boolean unsignedp;
2502 {
2503 struct ieee_type_stack *ts;
2504
2505 ts = (struct ieee_type_stack *) xmalloc (sizeof *ts);
2506 memset (ts, 0, sizeof *ts);
2507
2508 ts->type.indx = indx;
2509 ts->type.size = size;
2510 ts->type.unsignedp = unsignedp;
2511
2512 ts->next = info->type_stack;
2513 info->type_stack = ts;
2514
2515 return true;
2516 }
2517
2518 /* Pop a type index off the type stack. */
2519
2520 static unsigned int
2521 ieee_pop_type (info)
2522 struct ieee_handle *info;
2523 {
2524 struct ieee_type_stack *ts;
2525 unsigned int ret;
2526
2527 ts = info->type_stack;
2528 assert (ts != NULL);
2529 ret = ts->type.indx;
2530 info->type_stack = ts->next;
2531 free (ts);
2532 return ret;
2533 }
2534
2535 /* Add a range of bytes included in the current compilation unit. */
2536
2537 static boolean
2538 ieee_add_range (info, low, high)
2539 struct ieee_handle *info;
2540 bfd_vma low;
2541 bfd_vma high;
2542 {
2543 struct ieee_range *r, **pr;
2544
2545 if (low == (bfd_vma) -1 || high == (bfd_vma) -1)
2546 return true;
2547
2548 for (r = info->ranges; r != NULL; r = r->next)
2549 {
2550 if (high >= r->low && low <= r->high)
2551 {
2552 /* The new range overlaps r. */
2553 if (low < r->low)
2554 r->low = low;
2555 if (high > r->high)
2556 r->high = high;
2557 pr = &r->next;
2558 while (*pr != NULL && (*pr)->low <= r->high)
2559 {
2560 struct ieee_range *n;
2561
2562 if ((*pr)->high > r->high)
2563 r->high = (*pr)->high;
2564 n = (*pr)->next;
2565 free (*pr);
2566 *pr = n;
2567 }
2568 return true;
2569 }
2570 }
2571
2572 r = (struct ieee_range *) xmalloc (sizeof *r);
2573 memset (r, 0, sizeof *r);
2574
2575 r->low = low;
2576 r->high = high;
2577
2578 /* Store the ranges sorted by address. */
2579 for (pr = &info->ranges; *pr != NULL; pr = &(*pr)->next)
2580 if ((*pr)->next != NULL && (*pr)->next->low > high)
2581 break;
2582 r->next = *pr;
2583 *pr = r;
2584
2585 return true;
2586 }
2587
2588 /* Start a new range for which we only have the low address. */
2589
2590 static boolean
2591 ieee_start_range (info, low)
2592 struct ieee_handle *info;
2593 bfd_vma low;
2594 {
2595 struct ieee_range *r;
2596
2597 r = (struct ieee_range *) xmalloc (sizeof *r);
2598 memset (r, 0, sizeof *r);
2599 r->low = low;
2600 r->next = info->pending_ranges;
2601 info->pending_ranges = r;
2602 return true;
2603 }
2604
2605 /* Finish a range started by ieee_start_range. */
2606
2607 static boolean
2608 ieee_end_range (info, high)
2609 struct ieee_handle *info;
2610 bfd_vma high;
2611 {
2612 struct ieee_range *r;
2613 bfd_vma low;
2614
2615 assert (info->pending_ranges != NULL);
2616 r = info->pending_ranges;
2617 low = r->low;
2618 info->pending_ranges = r->next;
2619 free (r);
2620 return ieee_add_range (info, low, high);
2621 }
2622
2623 /* Write a byte into the buffer. We use a macro for speed and a
2624 function for the complex cases. */
2625
2626 #define ieee_write_byte(info, b) \
2627 ((info)->current->c < IEEE_BUFSIZE \
2628 ? ((info)->current->buf[(info)->current->c++] = (b), true) \
2629 : ieee_real_write_byte ((info), (b)))
2630
2631 static boolean
2632 ieee_real_write_byte (info, b)
2633 struct ieee_handle *info;
2634 int b;
2635 {
2636 if (info->current->c >= IEEE_BUFSIZE)
2637 {
2638 struct ieee_buf *n;
2639
2640 n = (struct ieee_buf *) xmalloc (sizeof *n);
2641 n->next = NULL;
2642 n->c = 0;
2643 info->current->next = n;
2644 info->current = n;
2645 }
2646
2647 info->current->buf[info->current->c] = b;
2648 ++info->current->c;
2649
2650 return true;
2651 }
2652
2653 /* Write out two bytes. */
2654
2655 static boolean
2656 ieee_write_2bytes (info, i)
2657 struct ieee_handle *info;
2658 int i;
2659 {
2660 return (ieee_write_byte (info, i >> 8)
2661 && ieee_write_byte (info, i & 0xff));
2662 }
2663
2664 /* Write out an integer. */
2665
2666 static boolean
2667 ieee_write_number (info, v)
2668 struct ieee_handle *info;
2669 bfd_vma v;
2670 {
2671 bfd_vma t;
2672 bfd_byte ab[20];
2673 bfd_byte *p;
2674 unsigned int c;
2675
2676 if (v <= (bfd_vma) ieee_number_end_enum)
2677 return ieee_write_byte (info, (int) v);
2678
2679 t = v;
2680 p = ab + sizeof ab;
2681 while (t != 0)
2682 {
2683 *--p = t & 0xff;
2684 t >>= 8;
2685 }
2686 c = (ab + 20) - p;
2687
2688 if (c > (unsigned int) (ieee_number_repeat_end_enum
2689 - ieee_number_repeat_start_enum))
2690 {
2691 fprintf (stderr, "IEEE numeric overflow: 0x");
2692 fprintf_vma (stderr, v);
2693 fprintf (stderr, "\n");
2694 return false;
2695 }
2696
2697 if (! ieee_write_byte (info, (int) ieee_number_repeat_start_enum + c))
2698 return false;
2699 for (; c > 0; --c, ++p)
2700 {
2701 if (! ieee_write_byte (info, *p))
2702 return false;
2703 }
2704
2705 return true;
2706 }
2707
2708 /* Write out a string. */
2709
2710 static boolean
2711 ieee_write_id (info, s)
2712 struct ieee_handle *info;
2713 const char *s;
2714 {
2715 unsigned int len;
2716
2717 len = strlen (s);
2718 if (len <= 0x7f)
2719 {
2720 if (! ieee_write_byte (info, len))
2721 return false;
2722 }
2723 else if (len <= 0xff)
2724 {
2725 if (! ieee_write_byte (info, (int) ieee_extension_length_1_enum)
2726 || ! ieee_write_byte (info, len))
2727 return false;
2728 }
2729 else if (len <= 0xffff)
2730 {
2731 if (! ieee_write_byte (info, (int) ieee_extension_length_2_enum)
2732 || ! ieee_write_2bytes (info, len))
2733 return false;
2734 }
2735 else
2736 {
2737 fprintf (stderr, "IEEE string length overflow: %u\n", len);
2738 return false;
2739 }
2740
2741 for (; *s != '\0'; s++)
2742 if (! ieee_write_byte (info, *s))
2743 return false;
2744
2745 return true;
2746 }
2747
2748 /* Start defining a type. */
2749
2750 static boolean
2751 ieee_define_type (info, size, unsignedp)
2752 struct ieee_handle *info;
2753 unsigned int size;
2754 boolean unsignedp;
2755 {
2756 return ieee_define_named_type (info, (const char *) NULL, false, size,
2757 unsignedp, (struct ieee_buf **) NULL);
2758 }
2759
2760 /* Start defining a named type. */
2761
2762 static boolean
2763 ieee_define_named_type (info, name, tagp, size, unsignedp, ppbuf)
2764 struct ieee_handle *info;
2765 const char *name;
2766 boolean tagp;
2767 unsigned int size;
2768 boolean unsignedp;
2769 struct ieee_buf **ppbuf;
2770 {
2771 unsigned int type_indx;
2772 unsigned int name_indx;
2773
2774 if (! tagp || name == NULL || *name == '\0')
2775 {
2776 type_indx = info->type_indx;
2777 ++info->type_indx;
2778 }
2779 else
2780 {
2781 struct ieee_name_type *nt;
2782
2783 /* The name is a tag. If we have already defined the tag, we
2784 must use the existing type index. */
2785 for (nt = info->tags; nt != NULL; nt = nt->next)
2786 if (nt->name[0] == name[0]
2787 && strcmp (nt->name, name) == 0)
2788 break;
2789
2790 if (nt == NULL)
2791 {
2792 nt = (struct ieee_name_type *) xmalloc (sizeof *nt);
2793 memset (nt, 0, sizeof *nt);
2794 nt->name = name;
2795 nt->next = info->tags;
2796 info->tags = nt;
2797 nt->type.indx = info->type_indx;
2798 ++info->type_indx;
2799 }
2800
2801 nt->type.size = size;
2802 nt->type.unsignedp = unsignedp;
2803 nt->kind = DEBUG_KIND_ILLEGAL;
2804
2805 type_indx = nt->type.indx;
2806 }
2807
2808 name_indx = info->name_indx;
2809 ++info->name_indx;
2810
2811 if (name == NULL)
2812 name = "";
2813
2814 /* If we were given a buffer, use it; otherwise, use the general
2815 type information, and make sure that the type block is started. */
2816 if (ppbuf != NULL)
2817 {
2818 if (! ieee_change_buffer (info, ppbuf))
2819 return false;
2820 }
2821 else if (info->types != NULL)
2822 {
2823 if (! ieee_change_buffer (info, &info->types))
2824 return false;
2825 }
2826 else
2827 {
2828 if (! ieee_change_buffer (info, &info->types)
2829 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
2830 || ! ieee_write_byte (info, 1)
2831 || ! ieee_write_number (info, 0)
2832 || ! ieee_write_id (info, info->modname))
2833 return false;
2834 }
2835
2836 /* Push the new type on the type stack, write out an NN record, and
2837 write out the start of a TY record. The caller will then finish
2838 the TY record. */
2839 return (ieee_push_type (info, type_indx, size, unsignedp)
2840 && ieee_write_byte (info, (int) ieee_nn_record)
2841 && ieee_write_number (info, name_indx)
2842 && ieee_write_id (info, name)
2843 && ieee_write_byte (info, (int) ieee_ty_record_enum)
2844 && ieee_write_number (info, type_indx)
2845 && ieee_write_byte (info, 0xce)
2846 && ieee_write_number (info, name_indx));
2847 }
2848 \f
2849 /* The general routine to write out IEEE debugging information. */
2850
2851 boolean
2852 write_ieee_debugging_info (abfd, dhandle)
2853 bfd *abfd;
2854 PTR dhandle;
2855 {
2856 struct ieee_handle info;
2857 struct ieee_buf *tags;
2858 struct ieee_name_type *nt;
2859 asection *s;
2860 const char *err;
2861 struct ieee_buf *b;
2862
2863 memset (&info, 0, sizeof info);
2864 info.abfd = abfd;
2865 info.type_indx = 256;
2866 info.name_indx = 32;
2867
2868 if (! debug_write (dhandle, &ieee_fns, (PTR) &info))
2869 return false;
2870
2871 if (info.filename != NULL)
2872 {
2873 if (! ieee_finish_compilation_unit (&info))
2874 return false;
2875 }
2876
2877 /* Put any undefined tags in the global typedef information. */
2878 tags = NULL;
2879 for (nt = info.tags; nt != NULL; nt = nt->next)
2880 {
2881 unsigned int name_indx;
2882 char code;
2883
2884 if (nt->kind == DEBUG_KIND_ILLEGAL)
2885 continue;
2886 if (tags == NULL)
2887 {
2888 if (! ieee_change_buffer (&info, &tags)
2889 || ! ieee_write_byte (&info, (int) ieee_bb_record_enum)
2890 || ! ieee_write_byte (&info, 2)
2891 || ! ieee_write_number (&info, 0)
2892 || ! ieee_write_id (&info, ""))
2893 return false;
2894 }
2895 name_indx = info.name_indx;
2896 ++info.name_indx;
2897 if (! ieee_write_byte (&info, (int) ieee_nn_record)
2898 || ! ieee_write_number (&info, name_indx)
2899 || ! ieee_write_id (&info, nt->name)
2900 || ! ieee_write_byte (&info, (int) ieee_ty_record_enum)
2901 || ! ieee_write_number (&info, nt->type.indx)
2902 || ! ieee_write_byte (&info, 0xce)
2903 || ! ieee_write_number (&info, name_indx))
2904 return false;
2905 switch (nt->kind)
2906 {
2907 default:
2908 abort ();
2909 return false;
2910 case DEBUG_KIND_STRUCT:
2911 case DEBUG_KIND_CLASS:
2912 code = 'S';
2913 break;
2914 case DEBUG_KIND_UNION:
2915 case DEBUG_KIND_UNION_CLASS:
2916 code = 'U';
2917 break;
2918 case DEBUG_KIND_ENUM:
2919 code = 'E';
2920 break;
2921 }
2922 if (! ieee_write_number (&info, code)
2923 || ! ieee_write_number (&info, 0))
2924 return false;
2925 }
2926 if (tags != NULL)
2927 {
2928 struct ieee_buf **pb;
2929
2930 if (! ieee_write_byte (&info, (int) ieee_be_record_enum))
2931 return false;
2932
2933 for (pb = &tags; *pb != NULL; pb = &(*pb)->next)
2934 ;
2935 *pb = info.data;
2936 info.data = tags;
2937 }
2938
2939 /* Now all the data is in info.data. Write it out to the BFD. We
2940 normally would need to worry about whether all the other sections
2941 are set up yet, but the IEEE backend will handle this particular
2942 case correctly regardless. */
2943 if (info.data == NULL)
2944 {
2945 /* There is no debugging information. */
2946 return true;
2947 }
2948 err = NULL;
2949 s = bfd_make_section (abfd, ".debug");
2950 if (s == NULL)
2951 err = "bfd_make_section";
2952 if (err == NULL)
2953 {
2954 if (! bfd_set_section_flags (abfd, s, SEC_DEBUGGING | SEC_HAS_CONTENTS))
2955 err = "bfd_set_section_flags";
2956 }
2957 if (err == NULL)
2958 {
2959 bfd_size_type size;
2960
2961 size = 0;
2962 for (b = info.data; b != NULL; b = b->next)
2963 size += b->c;
2964 if (! bfd_set_section_size (abfd, s, size))
2965 err = "bfd_set_section_size";
2966 }
2967 if (err == NULL)
2968 {
2969 file_ptr offset;
2970
2971 offset = 0;
2972 for (b = info.data; b != NULL; b = b->next)
2973 {
2974 if (! bfd_set_section_contents (abfd, s, b->buf, offset, b->c))
2975 {
2976 err = "bfd_set_section_contents";
2977 break;
2978 }
2979 offset += b->c;
2980 }
2981 }
2982
2983 if (err != NULL)
2984 {
2985 fprintf (stderr, "%s: %s: %s\n", bfd_get_filename (abfd), err,
2986 bfd_errmsg (bfd_get_error ()));
2987 return false;
2988 }
2989
2990 return true;
2991 }
2992
2993 /* Start writing out information for a compilation unit. */
2994
2995 static boolean
2996 ieee_start_compilation_unit (p, filename)
2997 PTR p;
2998 const char *filename;
2999 {
3000 struct ieee_handle *info = (struct ieee_handle *) p;
3001 const char *modname;
3002 char *c, *s;
3003
3004 if (info->filename != NULL)
3005 {
3006 if (! ieee_finish_compilation_unit (info))
3007 return false;
3008 }
3009
3010 info->filename = filename;
3011 modname = strrchr (filename, '/');
3012 if (modname != NULL)
3013 ++modname;
3014 else
3015 {
3016 modname = strrchr (filename, '\\');
3017 if (modname != NULL)
3018 ++modname;
3019 else
3020 modname = filename;
3021 }
3022 c = xstrdup (modname);
3023 s = strrchr (c, '.');
3024 if (s != NULL)
3025 *s = '\0';
3026 info->modname = c;
3027
3028 info->types = NULL;
3029 info->vars = NULL;
3030 info->linenos = NULL;
3031 info->ranges = NULL;
3032
3033 return true;
3034 }
3035
3036 /* Finish up a compilation unit. */
3037
3038 static boolean
3039 ieee_finish_compilation_unit (info)
3040 struct ieee_handle *info;
3041 {
3042 struct ieee_buf **pp;
3043 struct ieee_range *r;
3044
3045 if (info->types != NULL)
3046 {
3047 if (! ieee_change_buffer (info, &info->types)
3048 || ! ieee_write_byte (info, (int) ieee_be_record_enum))
3049 return false;
3050 }
3051
3052 if (info->vars != NULL)
3053 {
3054 if (! ieee_change_buffer (info, &info->vars)
3055 || ! ieee_write_byte (info, (int) ieee_be_record_enum))
3056 return false;
3057 }
3058
3059 if (info->linenos != NULL)
3060 {
3061 if (! ieee_change_buffer (info, &info->linenos)
3062 || ! ieee_write_byte (info, (int) ieee_be_record_enum))
3063 return false;
3064 }
3065
3066 for (pp = &info->data; *pp != NULL; pp = &(*pp)->next)
3067 ;
3068 *pp = info->types;
3069 for (; *pp != NULL; pp = &(*pp)->next)
3070 ;
3071 *pp = info->vars;
3072 for (; *pp != NULL; pp = &(*pp)->next)
3073 ;
3074 *pp = info->linenos;
3075
3076 /* Build BB10/BB11 blocks based on the ranges we recorded. */
3077 if (! ieee_change_buffer (info, &info->data))
3078 return false;
3079
3080 if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
3081 || ! ieee_write_byte (info, 10)
3082 || ! ieee_write_number (info, 0)
3083 || ! ieee_write_id (info, info->modname)
3084 || ! ieee_write_id (info, "")
3085 || ! ieee_write_number (info, 0)
3086 || ! ieee_write_id (info, "GNU objcopy"))
3087 return false;
3088
3089 for (r = info->ranges; r != NULL; r = r->next)
3090 {
3091 bfd_vma low, high;
3092 asection *s;
3093 int kind;
3094
3095 low = r->low;
3096 high = r->high;
3097
3098 /* Find the section corresponding to this range. */
3099 for (s = info->abfd->sections; s != NULL; s = s->next)
3100 {
3101 if (bfd_get_section_vma (info->abfd, s) <= low
3102 && high <= (bfd_get_section_vma (info->abfd, s)
3103 + bfd_section_size (info->abfd, s)))
3104 break;
3105 }
3106
3107 if (s == NULL)
3108 {
3109 /* Just ignore this range. */
3110 continue;
3111 }
3112
3113 /* Coalesce ranges if it seems reasonable. */
3114 while (r->next != NULL
3115 && high + 64 >= r->next->low
3116 && (r->next->high
3117 <= (bfd_get_section_vma (info->abfd, s)
3118 + bfd_section_size (info->abfd, s))))
3119 {
3120 r = r->next;
3121 high = r->next->high;
3122 }
3123
3124 if ((s->flags & SEC_CODE) != 0)
3125 kind = 1;
3126 else if ((s->flags & SEC_READONLY) != 0)
3127 kind = 3;
3128 else
3129 kind = 2;
3130
3131 if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
3132 || ! ieee_write_byte (info, 11)
3133 || ! ieee_write_number (info, 0)
3134 || ! ieee_write_id (info, "")
3135 || ! ieee_write_number (info, kind)
3136 || ! ieee_write_number (info, s->index)
3137 || ! ieee_write_number (info, low)
3138 || ! ieee_write_byte (info, (int) ieee_be_record_enum)
3139 || ! ieee_write_number (info, high - low))
3140 return false;
3141 }
3142
3143 if (! ieee_write_byte (info, (int) ieee_be_record_enum))
3144 return false;
3145
3146 return true;
3147 }
3148
3149 /* Start recording information from a particular source file. This is
3150 used to record which file defined which types, variables, etc. It
3151 is not used for line numbers, since the lineno entry point passes
3152 down the file name anyhow. IEEE debugging information doesn't seem
3153 to store this information anywhere. */
3154
3155 /*ARGSUSED*/
3156 static boolean
3157 ieee_start_source (p, filename)
3158 PTR p;
3159 const char *filename;
3160 {
3161 return true;
3162 }
3163
3164 /* Make an ellipsis type. */
3165
3166 static boolean
3167 ieee_ellipsis_type (p)
3168 PTR p;
3169 {
3170 abort ();
3171 }
3172
3173 /* Make an empty type. */
3174
3175 static boolean
3176 ieee_empty_type (p)
3177 PTR p;
3178 {
3179 struct ieee_handle *info = (struct ieee_handle *) p;
3180
3181 return ieee_push_type (info, 0, 0, false);
3182 }
3183
3184 /* Make a void type. */
3185
3186 static boolean
3187 ieee_void_type (p)
3188 PTR p;
3189 {
3190 struct ieee_handle *info = (struct ieee_handle *) p;
3191
3192 return ieee_push_type (info, 1, 0, false);
3193 }
3194
3195 /* Make an integer type. */
3196
3197 static boolean
3198 ieee_int_type (p, size, unsignedp)
3199 PTR p;
3200 unsigned int size;
3201 boolean unsignedp;
3202 {
3203 struct ieee_handle *info = (struct ieee_handle *) p;
3204 unsigned int indx;
3205
3206 switch (size)
3207 {
3208 case 1:
3209 indx = (int) builtin_signed_char;
3210 break;
3211 case 2:
3212 indx = (int) builtin_signed_short_int;
3213 break;
3214 case 4:
3215 indx = (int) builtin_signed_long;
3216 break;
3217 case 8:
3218 indx = (int) builtin_signed_long_long;
3219 break;
3220 default:
3221 fprintf (stderr, "IEEE unsupported integer type size %u\n", size);
3222 return false;
3223 }
3224
3225 if (unsignedp)
3226 ++indx;
3227
3228 return ieee_push_type (info, indx, size, unsignedp);
3229 }
3230
3231 /* Make a floating point type. */
3232
3233 static boolean
3234 ieee_float_type (p, size)
3235 PTR p;
3236 unsigned int size;
3237 {
3238 struct ieee_handle *info = (struct ieee_handle *) p;
3239 unsigned int indx;
3240
3241 switch (size)
3242 {
3243 case 4:
3244 indx = (int) builtin_float;
3245 break;
3246 case 8:
3247 indx = (int) builtin_double;
3248 break;
3249 case 12:
3250 /* FIXME: This size really depends upon the processor. */
3251 indx = (int) builtin_long_double;
3252 break;
3253 case 16:
3254 indx = (int) builtin_long_long_double;
3255 break;
3256 default:
3257 fprintf (stderr, "IEEE unsupported float type size %u\n", size);
3258 return false;
3259 }
3260
3261 return ieee_push_type (info, indx, size, false);
3262 }
3263
3264 /* Make a complex type. */
3265
3266 static boolean
3267 ieee_complex_type (p, size)
3268 PTR p;
3269 unsigned int size;
3270 {
3271 struct ieee_handle *info = (struct ieee_handle *) p;
3272 char code;
3273
3274 switch (size)
3275 {
3276 case 4:
3277 code = 'c';
3278 break;
3279 case 8:
3280 code = 'd';
3281 break;
3282 default:
3283 fprintf (stderr, "IEEE unsupported complex type size %u\n", size);
3284 return false;
3285 }
3286
3287 /* FIXME: I don't know what the string is for. */
3288 return (ieee_define_type (info, size, false)
3289 && ieee_write_number (info, code)
3290 && ieee_write_id (info, ""));
3291 }
3292
3293 /* Make a boolean type. IEEE doesn't support these, so we just make
3294 an integer type instead. */
3295
3296 static boolean
3297 ieee_bool_type (p, size)
3298 PTR p;
3299 unsigned int size;
3300 {
3301 return ieee_int_type (p, size, true);
3302 }
3303
3304 /* Make an enumeration. */
3305
3306 static boolean
3307 ieee_enum_type (p, tag, names, vals)
3308 PTR p;
3309 const char *tag;
3310 const char **names;
3311 bfd_signed_vma *vals;
3312 {
3313 struct ieee_handle *info = (struct ieee_handle *) p;
3314 boolean simple;
3315 int i;
3316
3317 /* If this is a simple enumeration, in which the values start at 0
3318 and always increment by 1, we can use type E. Otherwise we must
3319 use type N. */
3320
3321 simple = true;
3322 if (names != NULL)
3323 {
3324 for (i = 0; names[i] != NULL; i++)
3325 {
3326 if (vals[i] != i)
3327 {
3328 simple = false;
3329 break;
3330 }
3331 }
3332 }
3333
3334 if (! ieee_define_named_type (info, tag, true, 0, true,
3335 (struct ieee_buf **) NULL)
3336 || ! ieee_write_number (info, simple ? 'E' : 'N'))
3337 return false;
3338 if (simple)
3339 {
3340 /* FIXME: This is supposed to be the enumeration size, but we
3341 don't store that. */
3342 if (! ieee_write_number (info, 4))
3343 return false;
3344 }
3345 if (names != NULL)
3346 {
3347 for (i = 0; names[i] != NULL; i++)
3348 {
3349 if (! ieee_write_id (info, names[i]))
3350 return false;
3351 if (! simple)
3352 {
3353 if (! ieee_write_number (info, vals[i]))
3354 return false;
3355 }
3356 }
3357 }
3358
3359 return true;
3360 }
3361
3362 /* Make a pointer type. */
3363
3364 static boolean
3365 ieee_pointer_type (p)
3366 PTR p;
3367 {
3368 struct ieee_handle *info = (struct ieee_handle *) p;
3369 unsigned int indx;
3370
3371 indx = ieee_pop_type (info);
3372
3373 /* A pointer to a simple builtin type can be obtained by adding 32. */
3374 if (indx < 32)
3375 return ieee_push_type (info, indx + 32, 0, true);
3376
3377 return (ieee_define_type (info, 0, true)
3378 && ieee_write_number (info, 'P')
3379 && ieee_write_number (info, indx));
3380 }
3381
3382 /* Make a function type. */
3383
3384 static boolean
3385 ieee_function_type (p)
3386 PTR p;
3387 {
3388 struct ieee_handle *info = (struct ieee_handle *) p;
3389 unsigned int indx;
3390
3391 indx = ieee_pop_type (info);
3392
3393 /* FIXME: IEEE can represent the argument types for the function,
3394 but we didn't store them. */
3395
3396 /* An attribute of 0x41 means that the frame and push mask are
3397 unknown. */
3398 return (ieee_define_type (info, 0, true)
3399 && ieee_write_number (info, 'x')
3400 && ieee_write_number (info, 0x41)
3401 && ieee_write_number (info, 0)
3402 && ieee_write_number (info, 0)
3403 && ieee_write_number (info, indx)
3404 && ieee_write_number (info, (bfd_vma) -1)
3405 && ieee_write_number (info, 0));
3406 }
3407
3408 /* Make a reference type. */
3409
3410 static boolean
3411 ieee_reference_type (p)
3412 PTR p;
3413 {
3414 struct ieee_handle *info = (struct ieee_handle *) p;
3415
3416 /* IEEE appears to record a normal pointer type, and then use a
3417 pmisc record to indicate that it is really a reference. */
3418
3419 if (! ieee_pointer_type (p))
3420 return false;
3421 info->type_stack->type.referencep = true;
3422 return true;
3423 }
3424
3425 /* Make a range type. */
3426
3427 static boolean
3428 ieee_range_type (p, low, high)
3429 PTR p;
3430 bfd_signed_vma low;
3431 bfd_signed_vma high;
3432 {
3433 struct ieee_handle *info = (struct ieee_handle *) p;
3434 unsigned int size;
3435 boolean unsignedp;
3436
3437 size = info->type_stack->type.size;
3438 unsignedp = info->type_stack->type.unsignedp;
3439 (void) ieee_pop_type (info);
3440 return (ieee_define_type (info, size, unsignedp)
3441 && ieee_write_number (info, 'R')
3442 && ieee_write_number (info, (bfd_vma) low)
3443 && ieee_write_number (info, (bfd_vma) high)
3444 && ieee_write_number (info, unsignedp ? 0 : 1)
3445 && ieee_write_number (info, size));
3446 }
3447
3448 /* Make an array type. */
3449
3450 /*ARGSUSED*/
3451 static boolean
3452 ieee_array_type (p, low, high, stringp)
3453 PTR p;
3454 bfd_signed_vma low;
3455 bfd_signed_vma high;
3456 boolean stringp;
3457 {
3458 struct ieee_handle *info = (struct ieee_handle *) p;
3459 unsigned int eleindx;
3460
3461 /* IEEE does not store the range, so we just ignore it. */
3462 (void) ieee_pop_type (info);
3463 eleindx = ieee_pop_type (info);
3464
3465 if (! ieee_define_type (info, 0, false)
3466 || ! ieee_write_number (info, low == 0 ? 'Z' : 'C')
3467 || ! ieee_write_number (info, eleindx))
3468 return false;
3469 if (low != 0)
3470 {
3471 if (! ieee_write_number (info, low))
3472 return false;
3473 }
3474
3475 return ieee_write_number (info, high);
3476 }
3477
3478 /* Make a set type. */
3479
3480 static boolean
3481 ieee_set_type (p, bitstringp)
3482 PTR p;
3483 boolean bitstringp;
3484 {
3485 struct ieee_handle *info = (struct ieee_handle *) p;
3486 unsigned int eleindx;
3487
3488 eleindx = ieee_pop_type (info);
3489
3490 /* FIXME: We don't know the size, so we just use 4. */
3491
3492 return (ieee_define_type (info, 0, true)
3493 && ieee_write_number (info, 's')
3494 && ieee_write_number (info, 4)
3495 && ieee_write_number (info, eleindx));
3496 }
3497
3498 /* Make an offset type. */
3499
3500 static boolean
3501 ieee_offset_type (p)
3502 PTR p;
3503 {
3504 struct ieee_handle *info = (struct ieee_handle *) p;
3505 unsigned int targetindx, baseindx;
3506
3507 targetindx = ieee_pop_type (info);
3508 baseindx = ieee_pop_type (info);
3509
3510 /* FIXME: The MRI C++ compiler does not appear to generate any
3511 useful type information about an offset type. It just records a
3512 pointer to member as an integer. The MRI/HP IEEE spec does
3513 describe a pmisc record which can be used for a pointer to
3514 member. Unfortunately, it does not describe the target type,
3515 which seems pretty important. I'm going to punt this for now. */
3516
3517 return ieee_int_type (p, 4, true);
3518 }
3519
3520 /* Make a method type. */
3521
3522 static boolean
3523 ieee_method_type (p, domain, argcount)
3524 PTR p;
3525 boolean domain;
3526 int argcount;
3527 {
3528 struct ieee_handle *info = (struct ieee_handle *) p;
3529 unsigned int *args = NULL;
3530 int i;
3531 unsigned int retindx;
3532
3533 /* FIXME: The MRI/HP IEEE spec defines a pmisc record to use for a
3534 method, but the definition is incomplete. We just output an 'x'
3535 type. */
3536
3537 if (domain)
3538 (void) ieee_pop_type (info);
3539
3540 if (argcount > 0)
3541 {
3542 args = (unsigned int *) xmalloc (argcount * sizeof *args);
3543 for (i = argcount - 1; i >= 0; i--)
3544 args[i] = ieee_pop_type (info);
3545 }
3546
3547 retindx = ieee_pop_type (info);
3548
3549 if (! ieee_define_type (info, 0, true)
3550 || ! ieee_write_number (info, 'x')
3551 || ! ieee_write_number (info, 0x41)
3552 || ! ieee_write_number (info, 0)
3553 || ! ieee_write_number (info, 0)
3554 || ! ieee_write_number (info, retindx)
3555 || ! ieee_write_number (info, (bfd_vma) argcount))
3556 return false;
3557 if (argcount > 0)
3558 {
3559 for (i = 0; i < argcount; i++)
3560 if (! ieee_write_number (info, args[i]))
3561 return false;
3562 free (args);
3563 }
3564
3565 return ieee_write_number (info, 0);
3566 }
3567
3568 /* Make a const qualified type. */
3569
3570 static boolean
3571 ieee_const_type (p)
3572 PTR p;
3573 {
3574 struct ieee_handle *info = (struct ieee_handle *) p;
3575 unsigned int size;
3576 boolean unsignedp;
3577 unsigned int indx;
3578
3579 size = info->type_stack->type.size;
3580 unsignedp = info->type_stack->type.unsignedp;
3581 indx = ieee_pop_type (info);
3582 return (ieee_define_type (info, size, unsignedp)
3583 && ieee_write_number (info, 'n')
3584 && ieee_write_number (info, 1)
3585 && ieee_write_number (info, indx));
3586 }
3587
3588 /* Make a volatile qualified type. */
3589
3590 static boolean
3591 ieee_volatile_type (p)
3592 PTR p;
3593 {
3594 struct ieee_handle *info = (struct ieee_handle *) p;
3595 unsigned int size;
3596 boolean unsignedp;
3597 unsigned int indx;
3598
3599 size = info->type_stack->type.size;
3600 unsignedp = info->type_stack->type.unsignedp;
3601 indx = ieee_pop_type (info);
3602 return (ieee_define_type (info, size, unsignedp)
3603 && ieee_write_number (info, 'n')
3604 && ieee_write_number (info, 2)
3605 && ieee_write_number (info, indx));
3606 }
3607
3608 /* Start defining a struct type. We build it in the strdef field on
3609 the stack, to avoid confusing type definitions required by the
3610 fields with the struct type itself. */
3611
3612 static boolean
3613 ieee_start_struct_type (p, tag, id, structp, size)
3614 PTR p;
3615 const char *tag;
3616 unsigned int id;
3617 boolean structp;
3618 unsigned int size;
3619 {
3620 struct ieee_handle *info = (struct ieee_handle *) p;
3621 struct ieee_buf *strdef;
3622
3623 strdef = NULL;
3624 if (! ieee_define_named_type (info, tag, true, size, true, &strdef)
3625 || ! ieee_write_number (info, structp ? 'S' : 'U')
3626 || ! ieee_write_number (info, size))
3627 return false;
3628
3629 info->type_stack->type.strdef = strdef;
3630
3631 return true;
3632 }
3633
3634 /* Add a field to a struct. */
3635
3636 static boolean
3637 ieee_struct_field (p, name, bitpos, bitsize, visibility)
3638 PTR p;
3639 const char *name;
3640 bfd_vma bitpos;
3641 bfd_vma bitsize;
3642 enum debug_visibility visibility;
3643 {
3644 struct ieee_handle *info = (struct ieee_handle *) p;
3645 unsigned int size;
3646 boolean unsignedp;
3647 unsigned int indx;
3648 bfd_vma offset;
3649
3650 size = info->type_stack->type.size;
3651 unsignedp = info->type_stack->type.unsignedp;
3652 indx = ieee_pop_type (info);
3653
3654 assert (info->type_stack != NULL && info->type_stack->type.strdef != NULL);
3655
3656 /* If the bitsize doesn't match the expected size, we need to output
3657 a bitfield type. */
3658 if (size == 0 || bitsize == size * 8)
3659 offset = bitpos / 8;
3660 else
3661 {
3662 if (! ieee_define_type (info, 0, unsignedp)
3663 || ! ieee_write_number (info, 'g')
3664 || ! ieee_write_number (info, unsignedp ? 0 : 1)
3665 || ! ieee_write_number (info, indx))
3666 return false;
3667 indx = ieee_pop_type (info);
3668 offset = bitpos;
3669 }
3670
3671 /* Switch to the struct we are building in order to output this
3672 field definition. */
3673 return (ieee_change_buffer (info, &info->type_stack->type.strdef)
3674 && ieee_write_id (info, name)
3675 && ieee_write_number (info, indx)
3676 && ieee_write_number (info, offset));
3677 }
3678
3679 /* Finish up a struct type. */
3680
3681 static boolean
3682 ieee_end_struct_type (p)
3683 PTR p;
3684 {
3685 struct ieee_handle *info = (struct ieee_handle *) p;
3686 struct ieee_buf **pb;
3687
3688 assert (info->type_stack != NULL && info->type_stack->type.strdef != NULL);
3689
3690 /* Make sure we have started the types block. */
3691 if (info->types == NULL)
3692 {
3693 if (! ieee_change_buffer (info, &info->types)
3694 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
3695 || ! ieee_write_byte (info, 1)
3696 || ! ieee_write_number (info, 0)
3697 || ! ieee_write_id (info, info->modname))
3698 return false;
3699 }
3700
3701 /* Append the struct definition to the types. */
3702 for (pb = &info->types; *pb != NULL; pb = &(*pb)->next)
3703 ;
3704 *pb = info->type_stack->type.strdef;
3705 info->type_stack->type.strdef = NULL;
3706
3707 /* Leave the struct on the type stack. */
3708
3709 return true;
3710 }
3711
3712 /* Start a class type. */
3713
3714 static boolean
3715 ieee_start_class_type (p, tag, id, structp, size, vptr, ownvptr)
3716 PTR p;
3717 const char *tag;
3718 unsigned int id;
3719 boolean structp;
3720 unsigned int size;
3721 boolean vptr;
3722 boolean ownvptr;
3723 {
3724 struct ieee_handle *info = (struct ieee_handle *) p;
3725
3726 /* FIXME. */
3727 if (vptr && ! ownvptr)
3728 (void) ieee_pop_type (info);
3729 return ieee_start_struct_type (p, tag, id, structp, size);
3730 }
3731
3732 /* Add a static member to a class. */
3733
3734 static boolean
3735 ieee_class_static_member (p, name, physname, visibility)
3736 PTR p;
3737 const char *name;
3738 const char *physname;
3739 enum debug_visibility visibility;
3740 {
3741 struct ieee_handle *info = (struct ieee_handle *) p;
3742
3743 /* FIXME. */
3744 (void) ieee_pop_type (info);
3745 return true;
3746 }
3747
3748 /* Add a base class to a class. */
3749
3750 static boolean
3751 ieee_class_baseclass (p, bitpos, virtual, visibility)
3752 PTR p;
3753 bfd_vma bitpos;
3754 boolean virtual;
3755 enum debug_visibility visibility;
3756 {
3757 struct ieee_handle *info = (struct ieee_handle *) p;
3758
3759 /* FIXME. */
3760 (void) ieee_pop_type (info);
3761 return true;
3762 }
3763
3764 /* Start building a method for a class. */
3765
3766 static boolean
3767 ieee_class_start_method (p, name)
3768 PTR p;
3769 const char *name;
3770 {
3771 /* FIXME. */
3772 return true;
3773 }
3774
3775 /* Define a new method variant. */
3776
3777 static boolean
3778 ieee_class_method_variant (p, physname, visibility, constp, volatilep,
3779 voffset, context)
3780 PTR p;
3781 const char *physname;
3782 enum debug_visibility visibility;
3783 boolean constp;
3784 boolean volatilep;
3785 bfd_vma voffset;
3786 boolean context;
3787 {
3788 struct ieee_handle *info = (struct ieee_handle *) p;
3789
3790 /* FIXME. */
3791 (void) ieee_pop_type (info);
3792 if (context)
3793 (void) ieee_pop_type (info);
3794 return true;
3795 }
3796
3797 /* Define a new static method variant. */
3798
3799 static boolean
3800 ieee_class_static_method_variant (p, physname, visibility, constp, volatilep)
3801 PTR p;
3802 const char *physname;
3803 enum debug_visibility visibility;
3804 boolean constp;
3805 boolean volatilep;
3806 {
3807 struct ieee_handle *info = (struct ieee_handle *) p;
3808
3809 /* FIXME. */
3810 (void) ieee_pop_type (info);
3811 return true;
3812 }
3813
3814 /* Finish up a method. */
3815
3816 static boolean
3817 ieee_class_end_method (p)
3818 PTR p;
3819 {
3820 /* FIXME. */
3821 return true;
3822 }
3823
3824 /* Finish up a class. */
3825
3826 static boolean
3827 ieee_end_class_type (p)
3828 PTR p;
3829 {
3830 return ieee_end_struct_type (p);
3831 }
3832
3833 /* Push a previously seen typedef onto the type stack. */
3834
3835 static boolean
3836 ieee_typedef_type (p, name)
3837 PTR p;
3838 const char *name;
3839 {
3840 struct ieee_handle *info = (struct ieee_handle *) p;
3841 register struct ieee_name_type *nt;
3842
3843 for (nt = info->typedefs; nt != NULL; nt = nt->next)
3844 {
3845 if (nt->name[0] == name[0]
3846 && strcmp (nt->name, name) == 0)
3847 {
3848 if (! ieee_push_type (info, nt->type.indx, nt->type.size,
3849 nt->type.unsignedp))
3850 return false;
3851 /* Copy over any other type information we may have. */
3852 info->type_stack->type = nt->type;
3853 return true;
3854 }
3855 }
3856
3857 abort ();
3858 }
3859
3860 /* Push a tagged type onto the type stack. */
3861
3862 static boolean
3863 ieee_tag_type (p, name, id, kind)
3864 PTR p;
3865 const char *name;
3866 unsigned int id;
3867 enum debug_type_kind kind;
3868 {
3869 struct ieee_handle *info = (struct ieee_handle *) p;
3870 register struct ieee_name_type *nt;
3871
3872 if (name == NULL)
3873 return true;
3874
3875 for (nt = info->tags; nt != NULL; nt = nt->next)
3876 {
3877 if (nt->name[0] == name[0]
3878 && strcmp (nt->name, name) == 0)
3879 {
3880 if (! ieee_push_type (info, nt->type.indx, nt->type.size,
3881 nt->type.unsignedp))
3882 return false;
3883 /* Copy over any other type information we may have. */
3884 info->type_stack->type = nt->type;
3885 return true;
3886 }
3887 }
3888
3889 nt = (struct ieee_name_type *) xmalloc (sizeof *nt);
3890 memset (nt, 0, sizeof *nt);
3891
3892 nt->name = name;
3893 nt->type.indx = info->type_indx;
3894 ++info->type_indx;
3895 nt->kind = kind;
3896
3897 nt->next = info->tags;
3898 info->tags = nt;
3899
3900 return ieee_push_type (info, nt->type.indx, 0, false);
3901 }
3902
3903 /* Output a typedef. */
3904
3905 static boolean
3906 ieee_typdef (p, name)
3907 PTR p;
3908 const char *name;
3909 {
3910 struct ieee_handle *info = (struct ieee_handle *) p;
3911 struct ieee_name_type *nt;
3912 unsigned int size;
3913 boolean unsignedp;
3914 unsigned int indx;
3915
3916 nt = (struct ieee_name_type *) xmalloc (sizeof *nt);
3917 memset (nt, 0, sizeof *nt);
3918 nt->name = name;
3919 nt->type = info->type_stack->type;
3920 nt->kind = DEBUG_KIND_ILLEGAL;
3921
3922 nt->next = info->typedefs;
3923 info->typedefs = nt;
3924
3925 size = info->type_stack->type.size;
3926 unsignedp = info->type_stack->type.unsignedp;
3927 indx = ieee_pop_type (info);
3928
3929 /* If this is a simple builtin type using a builtin name, we don't
3930 want to output the typedef itself. We also want to change the
3931 type index to correspond to the name being used. We recognize
3932 names used in stabs debugging output even if they don't exactly
3933 correspond to the names used for the IEEE builtin types. */
3934 if (indx <= (unsigned int) builtin_bcd_float)
3935 {
3936 boolean found;
3937
3938 found = false;
3939 switch ((enum builtin_types) indx)
3940 {
3941 default:
3942 break;
3943
3944 case builtin_void:
3945 if (strcmp (name, "void") == 0)
3946 found = true;
3947 break;
3948
3949 case builtin_signed_char:
3950 case builtin_char:
3951 if (strcmp (name, "signed char") == 0)
3952 {
3953 indx = (unsigned int) builtin_signed_char;
3954 found = true;
3955 }
3956 else if (strcmp (name, "char") == 0)
3957 {
3958 indx = (unsigned int) builtin_char;
3959 found = true;
3960 }
3961 break;
3962
3963 case builtin_unsigned_char:
3964 if (strcmp (name, "unsigned char") == 0)
3965 found = true;
3966 break;
3967
3968 case builtin_signed_short_int:
3969 case builtin_short:
3970 case builtin_short_int:
3971 case builtin_signed_short:
3972 if (strcmp (name, "signed short int") == 0)
3973 {
3974 indx = (unsigned int) builtin_signed_short_int;
3975 found = true;
3976 }
3977 else if (strcmp (name, "short") == 0)
3978 {
3979 indx = (unsigned int) builtin_short;
3980 found = true;
3981 }
3982 else if (strcmp (name, "short int") == 0)
3983 {
3984 indx = (unsigned int) builtin_short_int;
3985 found = true;
3986 }
3987 else if (strcmp (name, "signed short") == 0)
3988 {
3989 indx = (unsigned int) builtin_signed_short;
3990 found = true;
3991 }
3992 break;
3993
3994 case builtin_unsigned_short_int:
3995 case builtin_unsigned_short:
3996 if (strcmp (name, "unsigned short int") == 0
3997 || strcmp (name, "short unsigned int") == 0)
3998 {
3999 indx = builtin_unsigned_short_int;
4000 found = true;
4001 }
4002 else if (strcmp (name, "unsigned short") == 0)
4003 {
4004 indx = builtin_unsigned_short;
4005 found = true;
4006 }
4007 break;
4008
4009 case builtin_signed_long:
4010 case builtin_int: /* FIXME: Size depends upon architecture. */
4011 case builtin_long:
4012 if (strcmp (name, "signed long") == 0)
4013 {
4014 indx = builtin_signed_long;
4015 found = true;
4016 }
4017 else if (strcmp (name, "int") == 0)
4018 {
4019 indx = builtin_int;
4020 found = true;
4021 }
4022 else if (strcmp (name, "long") == 0
4023 || strcmp (name, "long int") == 0)
4024 {
4025 indx = builtin_long;
4026 found = true;
4027 }
4028 break;
4029
4030 case builtin_unsigned_long:
4031 case builtin_unsigned: /* FIXME: Size depends upon architecture. */
4032 case builtin_unsigned_int: /* FIXME: Like builtin_unsigned. */
4033 if (strcmp (name, "unsigned long") == 0
4034 || strcmp (name, "long unsigned int") == 0)
4035 {
4036 indx = builtin_unsigned_long;
4037 found = true;
4038 }
4039 else if (strcmp (name, "unsigned") == 0)
4040 {
4041 indx = builtin_unsigned;
4042 found = true;
4043 }
4044 else if (strcmp (name, "unsigned int") == 0)
4045 {
4046 indx = builtin_unsigned_int;
4047 found = true;
4048 }
4049 break;
4050
4051 case builtin_signed_long_long:
4052 if (strcmp (name, "signed long long") == 0
4053 || strcmp (name, "long long int") == 0)
4054 found = true;
4055 break;
4056
4057 case builtin_unsigned_long_long:
4058 if (strcmp (name, "unsigned long long") == 0
4059 || strcmp (name, "long long unsigned int") == 0)
4060 found = true;
4061 break;
4062
4063 case builtin_float:
4064 if (strcmp (name, "float") == 0)
4065 found = true;
4066 break;
4067
4068 case builtin_double:
4069 if (strcmp (name, "double") == 0)
4070 found = true;
4071 break;
4072
4073 case builtin_long_double:
4074 if (strcmp (name, "long double") == 0)
4075 found = true;
4076 break;
4077
4078 case builtin_long_long_double:
4079 if (strcmp (name, "long long double") == 0)
4080 found = true;
4081 break;
4082 }
4083
4084 if (found)
4085 {
4086 nt->type.indx = indx;
4087 return true;
4088 }
4089 }
4090
4091 if (! ieee_define_named_type (info, name, false, size, unsignedp,
4092 (struct ieee_buf **) NULL)
4093 || ! ieee_write_number (info, 'T')
4094 || ! ieee_write_number (info, indx))
4095 return false;
4096
4097 /* Remove the type we just added to the type stack. */
4098 (void) ieee_pop_type (info);
4099
4100 return true;
4101 }
4102
4103 /* Output a tag for a type. We don't have to do anything here. */
4104
4105 static boolean
4106 ieee_tag (p, name)
4107 PTR p;
4108 const char *name;
4109 {
4110 struct ieee_handle *info = (struct ieee_handle *) p;
4111
4112 (void) ieee_pop_type (info);
4113 return true;
4114 }
4115
4116 /* Output an integer constant. */
4117
4118 static boolean
4119 ieee_int_constant (p, name, val)
4120 PTR p;
4121 const char *name;
4122 bfd_vma val;
4123 {
4124 /* FIXME. */
4125 return true;
4126 }
4127
4128 /* Output a floating point constant. */
4129
4130 static boolean
4131 ieee_float_constant (p, name, val)
4132 PTR p;
4133 const char *name;
4134 double val;
4135 {
4136 /* FIXME. */
4137 return true;
4138 }
4139
4140 /* Output a typed constant. */
4141
4142 static boolean
4143 ieee_typed_constant (p, name, val)
4144 PTR p;
4145 const char *name;
4146 bfd_vma val;
4147 {
4148 struct ieee_handle *info = (struct ieee_handle *) p;
4149
4150 /* FIXME. */
4151 (void) ieee_pop_type (info);
4152 return true;
4153 }
4154
4155 /* Output a variable. */
4156
4157 static boolean
4158 ieee_variable (p, name, kind, val)
4159 PTR p;
4160 const char *name;
4161 enum debug_var_kind kind;
4162 bfd_vma val;
4163 {
4164 struct ieee_handle *info = (struct ieee_handle *) p;
4165 unsigned int name_indx;
4166 unsigned int size;
4167 unsigned int type_indx;
4168 boolean asn;
4169
4170 /* Make sure the variable section is started. */
4171 if (info->vars != NULL)
4172 {
4173 if (! ieee_change_buffer (info, &info->vars))
4174 return false;
4175 }
4176 else
4177 {
4178 if (! ieee_change_buffer (info, &info->vars)
4179 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4180 || ! ieee_write_byte (info, 3)
4181 || ! ieee_write_number (info, 0)
4182 || ! ieee_write_id (info, info->modname))
4183 return false;
4184 }
4185
4186 name_indx = info->name_indx;
4187 ++info->name_indx;
4188
4189 size = info->type_stack->type.size;
4190 type_indx = ieee_pop_type (info);
4191
4192 /* Write out an NN and an ATN record for this variable. */
4193 if (! ieee_write_byte (info, (int) ieee_nn_record)
4194 || ! ieee_write_number (info, name_indx)
4195 || ! ieee_write_id (info, name)
4196 || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
4197 || ! ieee_write_number (info, name_indx)
4198 || ! ieee_write_number (info, type_indx))
4199 return false;
4200 switch (kind)
4201 {
4202 default:
4203 abort ();
4204 return false;
4205 case DEBUG_GLOBAL:
4206 if (! ieee_write_number (info, 8)
4207 || ! ieee_add_range (info, val, val + size))
4208 return false;
4209 asn = true;
4210 break;
4211 case DEBUG_STATIC:
4212 case DEBUG_LOCAL_STATIC:
4213 if (! ieee_write_number (info, 3)
4214 || ! ieee_add_range (info, val, val + size))
4215 return false;
4216 asn = true;
4217 break;
4218 case DEBUG_LOCAL:
4219 if (! ieee_write_number (info, 1)
4220 || ! ieee_write_number (info, val))
4221 return false;
4222 asn = false;
4223 break;
4224 case DEBUG_REGISTER:
4225 if (! ieee_write_number (info, 2)
4226 || ! ieee_write_number (info,
4227 ieee_genreg_to_regno (info->abfd, val)))
4228 return false;
4229 asn = false;
4230 break;
4231 }
4232
4233 if (asn)
4234 {
4235 if (! ieee_write_2bytes (info, (int) ieee_asn_record_enum)
4236 || ! ieee_write_number (info, name_indx)
4237 || ! ieee_write_number (info, val))
4238 return false;
4239 }
4240
4241 return true;
4242 }
4243
4244 /* Start outputting information for a function. */
4245
4246 static boolean
4247 ieee_start_function (p, name, global)
4248 PTR p;
4249 const char *name;
4250 boolean global;
4251 {
4252 struct ieee_handle *info = (struct ieee_handle *) p;
4253 unsigned int indx;
4254
4255 /* Make sure the variable section is started. */
4256 if (info->vars != NULL)
4257 {
4258 if (! ieee_change_buffer (info, &info->vars))
4259 return false;
4260 }
4261 else
4262 {
4263 if (! ieee_change_buffer (info, &info->vars)
4264 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4265 || ! ieee_write_byte (info, 3)
4266 || ! ieee_write_number (info, 0)
4267 || ! ieee_write_id (info, info->modname))
4268 return false;
4269 }
4270
4271 indx = ieee_pop_type (info);
4272
4273 /* The address is written out as the first block. */
4274
4275 ++info->block_depth;
4276
4277 return (ieee_write_byte (info, (int) ieee_bb_record_enum)
4278 && ieee_write_byte (info, global ? 4 : 6)
4279 && ieee_write_number (info, 0)
4280 && ieee_write_id (info, name)
4281 && ieee_write_number (info, 0)
4282 && ieee_write_number (info, indx));
4283 }
4284
4285 /* Add a function parameter. This will normally be called before the
4286 first block, so we postpone them until we see the block. */
4287
4288 static boolean
4289 ieee_function_parameter (p, name, kind, val)
4290 PTR p;
4291 const char *name;
4292 enum debug_parm_kind kind;
4293 bfd_vma val;
4294 {
4295 struct ieee_handle *info = (struct ieee_handle *) p;
4296 struct ieee_pending_parm *m, **pm;
4297
4298 assert (info->block_depth == 1);
4299
4300 m = (struct ieee_pending_parm *) xmalloc (sizeof *m);
4301 memset (m, 0, sizeof *m);
4302
4303 m->next = NULL;
4304 m->name = name;
4305 m->type = ieee_pop_type (info);
4306 m->kind = kind;
4307 m->val = val;
4308
4309 for (pm = &info->pending_parms; *pm != NULL; pm = &(*pm)->next)
4310 ;
4311 *pm = m;
4312
4313 return true;
4314 }
4315
4316 /* Output pending function parameters. */
4317
4318 static boolean
4319 ieee_output_pending_parms (info)
4320 struct ieee_handle *info;
4321 {
4322 struct ieee_pending_parm *m;
4323
4324 m = info->pending_parms;
4325 while (m != NULL)
4326 {
4327 struct ieee_pending_parm *next;
4328 enum debug_var_kind vkind;
4329
4330 switch (m->kind)
4331 {
4332 default:
4333 abort ();
4334 return false;
4335 case DEBUG_PARM_STACK:
4336 case DEBUG_PARM_REFERENCE:
4337 vkind = DEBUG_LOCAL;
4338 break;
4339 case DEBUG_PARM_REG:
4340 case DEBUG_PARM_REF_REG:
4341 vkind = DEBUG_REGISTER;
4342 break;
4343 }
4344
4345 if (! ieee_push_type (info, m->type, 0, false)
4346 || ! ieee_variable ((PTR) info, m->name, vkind, m->val))
4347 return false;
4348
4349 /* FIXME: We should output a pmisc note here for reference
4350 parameters. */
4351
4352 next = m->next;
4353 free (m);
4354 m = next;
4355 }
4356 info->pending_parms = NULL;
4357
4358 return true;
4359 }
4360
4361 /* Start a block. If this is the first block, we output the address
4362 to finish the BB4 or BB6, and then output the function parameters. */
4363
4364 static boolean
4365 ieee_start_block (p, addr)
4366 PTR p;
4367 bfd_vma addr;
4368 {
4369 struct ieee_handle *info = (struct ieee_handle *) p;
4370
4371 if (! ieee_change_buffer (info, &info->vars))
4372 return false;
4373
4374 if (info->block_depth == 1)
4375 {
4376 if (! ieee_write_number (info, addr)
4377 || ! ieee_output_pending_parms (info))
4378 return false;
4379 }
4380 else
4381 {
4382 if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
4383 || ! ieee_write_byte (info, 6)
4384 || ! ieee_write_byte (info, 0)
4385 || ! ieee_write_id (info, "")
4386 || ! ieee_write_number (info, 0)
4387 || ! ieee_write_number (info, 0)
4388 || ! ieee_write_number (info, addr))
4389 return false;
4390 }
4391
4392 if (! ieee_start_range (info, addr))
4393 return false;
4394
4395 ++info->block_depth;
4396
4397 return true;
4398 }
4399
4400 /* End a block. */
4401
4402 static boolean
4403 ieee_end_block (p, addr)
4404 PTR p;
4405 bfd_vma addr;
4406 {
4407 struct ieee_handle *info = (struct ieee_handle *) p;
4408
4409 if (! ieee_change_buffer (info, &info->vars)
4410 || ! ieee_write_byte (info, (int) ieee_be_record_enum)
4411 || ! ieee_write_number (info, addr))
4412 return false;
4413
4414 if (! ieee_end_range (info, addr))
4415 return false;
4416
4417 --info->block_depth;
4418
4419 return true;
4420 }
4421
4422 /* End a function. */
4423
4424 static boolean
4425 ieee_end_function (p)
4426 PTR p;
4427 {
4428 struct ieee_handle *info = (struct ieee_handle *) p;
4429
4430 assert (info->block_depth == 1);
4431
4432 --info->block_depth;
4433
4434 return true;
4435 }
4436
4437 /* Record line number information. */
4438
4439 static boolean
4440 ieee_lineno (p, filename, lineno, addr)
4441 PTR p;
4442 const char *filename;
4443 unsigned long lineno;
4444 bfd_vma addr;
4445 {
4446 struct ieee_handle *info = (struct ieee_handle *) p;
4447
4448 assert (info->filename != NULL);
4449
4450 /* Make sure we have a line number block. */
4451 if (info->linenos != NULL)
4452 {
4453 if (! ieee_change_buffer (info, &info->linenos))
4454 return false;
4455 }
4456 else
4457 {
4458 info->lineno_name_indx = info->name_indx;
4459 ++info->name_indx;
4460 if (! ieee_change_buffer (info, &info->linenos)
4461 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4462 || ! ieee_write_byte (info, 5)
4463 || ! ieee_write_number (info, 0)
4464 || ! ieee_write_id (info, info->filename)
4465 || ! ieee_write_byte (info, (int) ieee_nn_record)
4466 || ! ieee_write_number (info, info->lineno_name_indx)
4467 || ! ieee_write_id (info, ""))
4468 return false;
4469 info->lineno_filename = info->filename;
4470 }
4471
4472 if (strcmp (filename, info->lineno_filename) != 0)
4473 {
4474 if (strcmp (info->filename, info->lineno_filename) != 0)
4475 {
4476 /* We were not in the main file. Close the block for the
4477 included file. */
4478 if (! ieee_write_byte (info, (int) ieee_be_record_enum))
4479 return false;
4480 }
4481 if (strcmp (info->filename, filename) != 0)
4482 {
4483 /* We are not changing to the main file. Open a block for
4484 the new included file. */
4485 if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
4486 || ! ieee_write_byte (info, 5)
4487 || ! ieee_write_number (info, 0)
4488 || ! ieee_write_id (info, filename))
4489 return false;
4490 }
4491 info->lineno_filename = filename;
4492 }
4493
4494 return (ieee_write_2bytes (info, (int) ieee_atn_record_enum)
4495 && ieee_write_number (info, info->lineno_name_indx)
4496 && ieee_write_number (info, 0)
4497 && ieee_write_number (info, 7)
4498 && ieee_write_number (info, lineno)
4499 && ieee_write_number (info, 0)
4500 && ieee_write_2bytes (info, (int) ieee_asn_record_enum)
4501 && ieee_write_number (info, info->lineno_name_indx)
4502 && ieee_write_number (info, addr));
4503 }