* ieee.c (ieee_enum_type): Handle an undefined enum.
[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_VOID. */
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_empty_type PARAMS ((PTR));
2361 static boolean ieee_void_type PARAMS ((PTR));
2362 static boolean ieee_int_type PARAMS ((PTR, unsigned int, boolean));
2363 static boolean ieee_float_type PARAMS ((PTR, unsigned int));
2364 static boolean ieee_complex_type PARAMS ((PTR, unsigned int));
2365 static boolean ieee_bool_type PARAMS ((PTR, unsigned int));
2366 static boolean ieee_enum_type
2367 PARAMS ((PTR, const char *, const char **, bfd_signed_vma *));
2368 static boolean ieee_pointer_type PARAMS ((PTR));
2369 static boolean ieee_function_type PARAMS ((PTR));
2370 static boolean ieee_reference_type PARAMS ((PTR));
2371 static boolean ieee_range_type PARAMS ((PTR, bfd_signed_vma, bfd_signed_vma));
2372 static boolean ieee_array_type
2373 PARAMS ((PTR, bfd_signed_vma, bfd_signed_vma, boolean));
2374 static boolean ieee_set_type PARAMS ((PTR, boolean));
2375 static boolean ieee_offset_type PARAMS ((PTR));
2376 static boolean ieee_method_type PARAMS ((PTR, boolean, int));
2377 static boolean ieee_const_type PARAMS ((PTR));
2378 static boolean ieee_volatile_type PARAMS ((PTR));
2379 static boolean ieee_start_struct_type
2380 PARAMS ((PTR, const char *, boolean, unsigned int));
2381 static boolean ieee_struct_field
2382 PARAMS ((PTR, const char *, bfd_vma, bfd_vma, enum debug_visibility));
2383 static boolean ieee_end_struct_type PARAMS ((PTR));
2384 static boolean ieee_start_class_type
2385 PARAMS ((PTR, const char *, boolean, unsigned int, boolean, boolean));
2386 static boolean ieee_class_static_member
2387 PARAMS ((PTR, const char *, const char *, enum debug_visibility));
2388 static boolean ieee_class_baseclass
2389 PARAMS ((PTR, bfd_vma, boolean, enum debug_visibility));
2390 static boolean ieee_class_start_method PARAMS ((PTR, const char *));
2391 static boolean ieee_class_method_variant
2392 PARAMS ((PTR, const char *, enum debug_visibility, boolean, boolean,
2393 bfd_vma, boolean));
2394 static boolean ieee_class_static_method_variant
2395 PARAMS ((PTR, const char *, enum debug_visibility, boolean, boolean));
2396 static boolean ieee_class_end_method PARAMS ((PTR));
2397 static boolean ieee_end_class_type PARAMS ((PTR));
2398 static boolean ieee_typedef_type PARAMS ((PTR, const char *));
2399 static boolean ieee_tag_type
2400 PARAMS ((PTR, const char *, enum debug_type_kind));
2401 static boolean ieee_typdef PARAMS ((PTR, const char *));
2402 static boolean ieee_tag PARAMS ((PTR, const char *));
2403 static boolean ieee_int_constant PARAMS ((PTR, const char *, bfd_vma));
2404 static boolean ieee_float_constant PARAMS ((PTR, const char *, double));
2405 static boolean ieee_typed_constant PARAMS ((PTR, const char *, bfd_vma));
2406 static boolean ieee_variable
2407 PARAMS ((PTR, const char *, enum debug_var_kind, bfd_vma));
2408 static boolean ieee_start_function PARAMS ((PTR, const char *, boolean));
2409 static boolean ieee_function_parameter
2410 PARAMS ((PTR, const char *, enum debug_parm_kind, bfd_vma));
2411 static boolean ieee_start_block PARAMS ((PTR, bfd_vma));
2412 static boolean ieee_end_block PARAMS ((PTR, bfd_vma));
2413 static boolean ieee_end_function PARAMS ((PTR));
2414 static boolean ieee_lineno
2415 PARAMS ((PTR, const char *, unsigned long, bfd_vma));
2416
2417 static const struct debug_write_fns ieee_fns =
2418 {
2419 ieee_start_compilation_unit,
2420 ieee_start_source,
2421 ieee_empty_type,
2422 ieee_void_type,
2423 ieee_int_type,
2424 ieee_float_type,
2425 ieee_complex_type,
2426 ieee_bool_type,
2427 ieee_enum_type,
2428 ieee_pointer_type,
2429 ieee_function_type,
2430 ieee_reference_type,
2431 ieee_range_type,
2432 ieee_array_type,
2433 ieee_set_type,
2434 ieee_offset_type,
2435 ieee_method_type,
2436 ieee_const_type,
2437 ieee_volatile_type,
2438 ieee_start_struct_type,
2439 ieee_struct_field,
2440 ieee_end_struct_type,
2441 ieee_start_class_type,
2442 ieee_class_static_member,
2443 ieee_class_baseclass,
2444 ieee_class_start_method,
2445 ieee_class_method_variant,
2446 ieee_class_static_method_variant,
2447 ieee_class_end_method,
2448 ieee_end_class_type,
2449 ieee_typedef_type,
2450 ieee_tag_type,
2451 ieee_typdef,
2452 ieee_tag,
2453 ieee_int_constant,
2454 ieee_float_constant,
2455 ieee_typed_constant,
2456 ieee_variable,
2457 ieee_start_function,
2458 ieee_function_parameter,
2459 ieee_start_block,
2460 ieee_end_block,
2461 ieee_end_function,
2462 ieee_lineno
2463 };
2464
2465 /* Change the current buffer to a specified buffer chain. */
2466
2467 static boolean
2468 ieee_change_buffer (info, ppbuf)
2469 struct ieee_handle *info;
2470 struct ieee_buf **ppbuf;
2471 {
2472 struct ieee_buf *buf;
2473
2474 if (*ppbuf != NULL)
2475 {
2476 for (buf = *ppbuf; buf->next != NULL; buf = buf->next)
2477 ;
2478 }
2479 else
2480 {
2481 buf = (struct ieee_buf *) xmalloc (sizeof *buf);
2482 buf->next = NULL;
2483 buf->c = 0;
2484 *ppbuf = buf;
2485 }
2486
2487 info->current = buf;
2488 return true;
2489 }
2490
2491 /* Push a type index onto the type stack. */
2492
2493 static boolean
2494 ieee_push_type (info, indx, size, unsignedp)
2495 struct ieee_handle *info;
2496 unsigned int indx;
2497 unsigned int size;
2498 boolean unsignedp;
2499 {
2500 struct ieee_type_stack *ts;
2501
2502 ts = (struct ieee_type_stack *) xmalloc (sizeof *ts);
2503 memset (ts, 0, sizeof *ts);
2504
2505 ts->type.indx = indx;
2506 ts->type.size = size;
2507 ts->type.unsignedp = unsignedp;
2508
2509 ts->next = info->type_stack;
2510 info->type_stack = ts;
2511
2512 return true;
2513 }
2514
2515 /* Pop a type index off the type stack. */
2516
2517 static unsigned int
2518 ieee_pop_type (info)
2519 struct ieee_handle *info;
2520 {
2521 struct ieee_type_stack *ts;
2522 unsigned int ret;
2523
2524 ts = info->type_stack;
2525 assert (ts != NULL);
2526 ret = ts->type.indx;
2527 info->type_stack = ts->next;
2528 free (ts);
2529 return ret;
2530 }
2531
2532 /* Add a range of bytes included in the current compilation unit. */
2533
2534 static boolean
2535 ieee_add_range (info, low, high)
2536 struct ieee_handle *info;
2537 bfd_vma low;
2538 bfd_vma high;
2539 {
2540 struct ieee_range *r, **pr;
2541
2542 if (low == (bfd_vma) -1 || high == (bfd_vma) -1)
2543 return true;
2544
2545 for (r = info->ranges; r != NULL; r = r->next)
2546 {
2547 if (high >= r->low && low <= r->high)
2548 {
2549 /* The new range overlaps r. */
2550 if (low < r->low)
2551 r->low = low;
2552 if (high > r->high)
2553 r->high = high;
2554 pr = &r->next;
2555 while (*pr != NULL && (*pr)->low <= r->high)
2556 {
2557 struct ieee_range *n;
2558
2559 if ((*pr)->high > r->high)
2560 r->high = (*pr)->high;
2561 n = (*pr)->next;
2562 free (*pr);
2563 *pr = n;
2564 }
2565 return true;
2566 }
2567 }
2568
2569 r = (struct ieee_range *) xmalloc (sizeof *r);
2570 memset (r, 0, sizeof *r);
2571
2572 r->low = low;
2573 r->high = high;
2574
2575 /* Store the ranges sorted by address. */
2576 for (pr = &info->ranges; *pr != NULL; pr = &(*pr)->next)
2577 if ((*pr)->next != NULL && (*pr)->next->low > high)
2578 break;
2579 r->next = *pr;
2580 *pr = r;
2581
2582 return true;
2583 }
2584
2585 /* Start a new range for which we only have the low address. */
2586
2587 static boolean
2588 ieee_start_range (info, low)
2589 struct ieee_handle *info;
2590 bfd_vma low;
2591 {
2592 struct ieee_range *r;
2593
2594 r = (struct ieee_range *) xmalloc (sizeof *r);
2595 memset (r, 0, sizeof *r);
2596 r->low = low;
2597 r->next = info->pending_ranges;
2598 info->pending_ranges = r;
2599 return true;
2600 }
2601
2602 /* Finish a range started by ieee_start_range. */
2603
2604 static boolean
2605 ieee_end_range (info, high)
2606 struct ieee_handle *info;
2607 bfd_vma high;
2608 {
2609 struct ieee_range *r;
2610 bfd_vma low;
2611
2612 assert (info->pending_ranges != NULL);
2613 r = info->pending_ranges;
2614 low = r->low;
2615 info->pending_ranges = r->next;
2616 free (r);
2617 return ieee_add_range (info, low, high);
2618 }
2619
2620 /* Write a byte into the buffer. We use a macro for speed and a
2621 function for the complex cases. */
2622
2623 #define ieee_write_byte(info, b) \
2624 ((info)->current->c < IEEE_BUFSIZE \
2625 ? ((info)->current->buf[(info)->current->c++] = (b), true) \
2626 : ieee_real_write_byte ((info), (b)))
2627
2628 static boolean
2629 ieee_real_write_byte (info, b)
2630 struct ieee_handle *info;
2631 int b;
2632 {
2633 if (info->current->c >= IEEE_BUFSIZE)
2634 {
2635 struct ieee_buf *n;
2636
2637 n = (struct ieee_buf *) xmalloc (sizeof *n);
2638 n->next = NULL;
2639 n->c = 0;
2640 info->current->next = n;
2641 info->current = n;
2642 }
2643
2644 info->current->buf[info->current->c] = b;
2645 ++info->current->c;
2646
2647 return true;
2648 }
2649
2650 /* Write out two bytes. */
2651
2652 static boolean
2653 ieee_write_2bytes (info, i)
2654 struct ieee_handle *info;
2655 int i;
2656 {
2657 return (ieee_write_byte (info, i >> 8)
2658 && ieee_write_byte (info, i & 0xff));
2659 }
2660
2661 /* Write out an integer. */
2662
2663 static boolean
2664 ieee_write_number (info, v)
2665 struct ieee_handle *info;
2666 bfd_vma v;
2667 {
2668 bfd_vma t;
2669 bfd_byte ab[20];
2670 bfd_byte *p;
2671 unsigned int c;
2672
2673 if (v <= (bfd_vma) ieee_number_end_enum)
2674 return ieee_write_byte (info, (int) v);
2675
2676 t = v;
2677 p = ab + sizeof ab;
2678 while (t != 0)
2679 {
2680 *--p = t & 0xff;
2681 t >>= 8;
2682 }
2683 c = (ab + 20) - p;
2684
2685 if (c > (unsigned int) (ieee_number_repeat_end_enum
2686 - ieee_number_repeat_start_enum))
2687 {
2688 fprintf (stderr, "IEEE numeric overflow: 0x");
2689 fprintf_vma (stderr, v);
2690 fprintf (stderr, "\n");
2691 return false;
2692 }
2693
2694 if (! ieee_write_byte (info, (int) ieee_number_repeat_start_enum + c))
2695 return false;
2696 for (; c > 0; --c, ++p)
2697 {
2698 if (! ieee_write_byte (info, *p))
2699 return false;
2700 }
2701
2702 return true;
2703 }
2704
2705 /* Write out a string. */
2706
2707 static boolean
2708 ieee_write_id (info, s)
2709 struct ieee_handle *info;
2710 const char *s;
2711 {
2712 unsigned int len;
2713
2714 len = strlen (s);
2715 if (len <= 0x7f)
2716 {
2717 if (! ieee_write_byte (info, len))
2718 return false;
2719 }
2720 else if (len <= 0xff)
2721 {
2722 if (! ieee_write_byte (info, (int) ieee_extension_length_1_enum)
2723 || ! ieee_write_byte (info, len))
2724 return false;
2725 }
2726 else if (len <= 0xffff)
2727 {
2728 if (! ieee_write_byte (info, (int) ieee_extension_length_2_enum)
2729 || ! ieee_write_2bytes (info, len))
2730 return false;
2731 }
2732 else
2733 {
2734 fprintf (stderr, "IEEE string length overflow: %u\n", len);
2735 return false;
2736 }
2737
2738 for (; *s != '\0'; s++)
2739 if (! ieee_write_byte (info, *s))
2740 return false;
2741
2742 return true;
2743 }
2744
2745 /* Start defining a type. */
2746
2747 static boolean
2748 ieee_define_type (info, size, unsignedp)
2749 struct ieee_handle *info;
2750 unsigned int size;
2751 boolean unsignedp;
2752 {
2753 return ieee_define_named_type (info, (const char *) NULL, false, size,
2754 unsignedp, (struct ieee_buf **) NULL);
2755 }
2756
2757 /* Start defining a named type. */
2758
2759 static boolean
2760 ieee_define_named_type (info, name, tagp, size, unsignedp, ppbuf)
2761 struct ieee_handle *info;
2762 const char *name;
2763 boolean tagp;
2764 unsigned int size;
2765 boolean unsignedp;
2766 struct ieee_buf **ppbuf;
2767 {
2768 unsigned int type_indx;
2769 unsigned int name_indx;
2770
2771 if (! tagp || name == NULL || *name == '\0')
2772 {
2773 type_indx = info->type_indx;
2774 ++info->type_indx;
2775 }
2776 else
2777 {
2778 struct ieee_name_type *nt;
2779
2780 /* The name is a tag. If we have already defined the tag, we
2781 must use the existing type index. */
2782 for (nt = info->tags; nt != NULL; nt = nt->next)
2783 if (nt->name[0] == name[0]
2784 && strcmp (nt->name, name) == 0)
2785 break;
2786
2787 if (nt == NULL)
2788 {
2789 nt = (struct ieee_name_type *) xmalloc (sizeof *nt);
2790 memset (nt, 0, sizeof *nt);
2791 nt->name = name;
2792 nt->next = info->tags;
2793 info->tags = nt;
2794 nt->type.indx = info->type_indx;
2795 ++info->type_indx;
2796 }
2797
2798 nt->type.size = size;
2799 nt->type.unsignedp = unsignedp;
2800 nt->kind = DEBUG_KIND_VOID;
2801
2802 type_indx = nt->type.indx;
2803 }
2804
2805 name_indx = info->name_indx;
2806 ++info->name_indx;
2807
2808 if (name == NULL)
2809 name = "";
2810
2811 /* If we were given a buffer, use it; otherwise, use the general
2812 type information, and make sure that the type block is started. */
2813 if (ppbuf != NULL)
2814 {
2815 if (! ieee_change_buffer (info, ppbuf))
2816 return false;
2817 }
2818 else if (info->types != NULL)
2819 {
2820 if (! ieee_change_buffer (info, &info->types))
2821 return false;
2822 }
2823 else
2824 {
2825 if (! ieee_change_buffer (info, &info->types)
2826 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
2827 || ! ieee_write_byte (info, 1)
2828 || ! ieee_write_number (info, 0)
2829 || ! ieee_write_id (info, info->modname))
2830 return false;
2831 }
2832
2833 /* Push the new type on the type stack, write out an NN record, and
2834 write out the start of a TY record. The caller will then finish
2835 the TY record. */
2836 return (ieee_push_type (info, type_indx, size, unsignedp)
2837 && ieee_write_byte (info, (int) ieee_nn_record)
2838 && ieee_write_number (info, name_indx)
2839 && ieee_write_id (info, name)
2840 && ieee_write_byte (info, (int) ieee_ty_record_enum)
2841 && ieee_write_number (info, type_indx)
2842 && ieee_write_byte (info, 0xce)
2843 && ieee_write_number (info, name_indx));
2844 }
2845 \f
2846 /* The general routine to write out IEEE debugging information. */
2847
2848 boolean
2849 write_ieee_debugging_info (abfd, dhandle)
2850 bfd *abfd;
2851 PTR dhandle;
2852 {
2853 struct ieee_handle info;
2854 struct ieee_buf *tags;
2855 struct ieee_name_type *nt;
2856 asection *s;
2857 const char *err;
2858 struct ieee_buf *b;
2859
2860 memset (&info, 0, sizeof info);
2861 info.abfd = abfd;
2862 info.type_indx = 256;
2863 info.name_indx = 32;
2864
2865 if (! debug_write (dhandle, &ieee_fns, (PTR) &info))
2866 return false;
2867
2868 if (info.filename != NULL)
2869 {
2870 if (! ieee_finish_compilation_unit (&info))
2871 return false;
2872 }
2873
2874 /* Put any undefined tags in the global typedef information. */
2875 tags = NULL;
2876 for (nt = info.tags; nt != NULL; nt = nt->next)
2877 {
2878 unsigned int name_indx;
2879 char code;
2880
2881 if (nt->kind == DEBUG_KIND_VOID)
2882 continue;
2883 if (tags == NULL)
2884 {
2885 if (! ieee_change_buffer (&info, &tags)
2886 || ! ieee_write_byte (&info, (int) ieee_bb_record_enum)
2887 || ! ieee_write_byte (&info, 2)
2888 || ! ieee_write_number (&info, 0)
2889 || ! ieee_write_id (&info, ""))
2890 return false;
2891 }
2892 name_indx = info.name_indx;
2893 ++info.name_indx;
2894 if (! ieee_write_byte (&info, (int) ieee_nn_record)
2895 || ! ieee_write_number (&info, name_indx)
2896 || ! ieee_write_id (&info, nt->name)
2897 || ! ieee_write_byte (&info, (int) ieee_ty_record_enum)
2898 || ! ieee_write_number (&info, nt->type.indx)
2899 || ! ieee_write_byte (&info, 0xce)
2900 || ! ieee_write_number (&info, name_indx))
2901 return false;
2902 switch (nt->kind)
2903 {
2904 default:
2905 abort ();
2906 return false;
2907 case DEBUG_KIND_STRUCT:
2908 case DEBUG_KIND_CLASS:
2909 code = 'S';
2910 break;
2911 case DEBUG_KIND_UNION:
2912 case DEBUG_KIND_UNION_CLASS:
2913 code = 'U';
2914 break;
2915 case DEBUG_KIND_ENUM:
2916 code = 'E';
2917 break;
2918 }
2919 if (! ieee_write_number (&info, code)
2920 || ! ieee_write_number (&info, 0))
2921 return false;
2922 }
2923 if (tags != NULL)
2924 {
2925 struct ieee_buf **pb;
2926
2927 if (! ieee_write_byte (&info, (int) ieee_be_record_enum))
2928 return false;
2929
2930 for (pb = &tags; *pb != NULL; pb = &(*pb)->next)
2931 ;
2932 *pb = info.data;
2933 info.data = tags;
2934 }
2935
2936 /* Now all the data is in info.data. Write it out to the BFD. We
2937 normally would need to worry about whether all the other sections
2938 are set up yet, but the IEEE backend will handle this particular
2939 case correctly regardless. */
2940 if (info.data == NULL)
2941 {
2942 /* There is no debugging information. */
2943 return true;
2944 }
2945 err = NULL;
2946 s = bfd_make_section (abfd, ".debug");
2947 if (s == NULL)
2948 err = "bfd_make_section";
2949 if (err == NULL)
2950 {
2951 if (! bfd_set_section_flags (abfd, s, SEC_DEBUGGING | SEC_HAS_CONTENTS))
2952 err = "bfd_set_section_flags";
2953 }
2954 if (err == NULL)
2955 {
2956 bfd_size_type size;
2957
2958 size = 0;
2959 for (b = info.data; b != NULL; b = b->next)
2960 size += b->c;
2961 if (! bfd_set_section_size (abfd, s, size))
2962 err = "bfd_set_section_size";
2963 }
2964 if (err == NULL)
2965 {
2966 file_ptr offset;
2967
2968 offset = 0;
2969 for (b = info.data; b != NULL; b = b->next)
2970 {
2971 if (! bfd_set_section_contents (abfd, s, b->buf, offset, b->c))
2972 {
2973 err = "bfd_set_section_contents";
2974 break;
2975 }
2976 offset += b->c;
2977 }
2978 }
2979
2980 if (err != NULL)
2981 {
2982 fprintf (stderr, "%s: %s: %s\n", bfd_get_filename (abfd), err,
2983 bfd_errmsg (bfd_get_error ()));
2984 return false;
2985 }
2986
2987 return true;
2988 }
2989
2990 /* Start writing out information for a compilation unit. */
2991
2992 static boolean
2993 ieee_start_compilation_unit (p, filename)
2994 PTR p;
2995 const char *filename;
2996 {
2997 struct ieee_handle *info = (struct ieee_handle *) p;
2998 const char *modname;
2999 char *c, *s;
3000
3001 if (info->filename != NULL)
3002 {
3003 if (! ieee_finish_compilation_unit (info))
3004 return false;
3005 }
3006
3007 info->filename = filename;
3008 modname = strrchr (filename, '/');
3009 if (modname != NULL)
3010 ++modname;
3011 else
3012 {
3013 modname = strrchr (filename, '\\');
3014 if (modname != NULL)
3015 ++modname;
3016 else
3017 modname = filename;
3018 }
3019 c = xstrdup (modname);
3020 s = strrchr (c, '.');
3021 if (s != NULL)
3022 *s = '\0';
3023 info->modname = c;
3024
3025 info->types = NULL;
3026 info->vars = NULL;
3027 info->linenos = NULL;
3028 info->ranges = NULL;
3029
3030 return true;
3031 }
3032
3033 /* Finish up a compilation unit. */
3034
3035 static boolean
3036 ieee_finish_compilation_unit (info)
3037 struct ieee_handle *info;
3038 {
3039 struct ieee_buf **pp;
3040 struct ieee_range *r;
3041
3042 if (info->types != NULL)
3043 {
3044 if (! ieee_change_buffer (info, &info->types)
3045 || ! ieee_write_byte (info, (int) ieee_be_record_enum))
3046 return false;
3047 }
3048
3049 if (info->vars != NULL)
3050 {
3051 if (! ieee_change_buffer (info, &info->vars)
3052 || ! ieee_write_byte (info, (int) ieee_be_record_enum))
3053 return false;
3054 }
3055
3056 if (info->linenos != NULL)
3057 {
3058 if (! ieee_change_buffer (info, &info->linenos)
3059 || ! ieee_write_byte (info, (int) ieee_be_record_enum))
3060 return false;
3061 }
3062
3063 for (pp = &info->data; *pp != NULL; pp = &(*pp)->next)
3064 ;
3065 *pp = info->types;
3066 for (; *pp != NULL; pp = &(*pp)->next)
3067 ;
3068 *pp = info->vars;
3069 for (; *pp != NULL; pp = &(*pp)->next)
3070 ;
3071 *pp = info->linenos;
3072
3073 /* Build BB10/BB11 blocks based on the ranges we recorded. */
3074 if (! ieee_change_buffer (info, &info->data))
3075 return false;
3076
3077 if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
3078 || ! ieee_write_byte (info, 10)
3079 || ! ieee_write_number (info, 0)
3080 || ! ieee_write_id (info, info->modname)
3081 || ! ieee_write_id (info, "")
3082 || ! ieee_write_number (info, 0)
3083 || ! ieee_write_id (info, "GNU objcopy"))
3084 return false;
3085
3086 for (r = info->ranges; r != NULL; r = r->next)
3087 {
3088 bfd_vma low, high;
3089 asection *s;
3090 int kind;
3091
3092 low = r->low;
3093 high = r->high;
3094
3095 /* Find the section corresponding to this range. */
3096 for (s = info->abfd->sections; s != NULL; s = s->next)
3097 {
3098 if (bfd_get_section_vma (info->abfd, s) <= low
3099 && high <= (bfd_get_section_vma (info->abfd, s)
3100 + bfd_section_size (info->abfd, s)))
3101 break;
3102 }
3103
3104 if (s == NULL)
3105 {
3106 /* Just ignore this range. */
3107 continue;
3108 }
3109
3110 /* Coalesce ranges if it seems reasonable. */
3111 while (r->next != NULL
3112 && high + 64 >= r->next->low
3113 && (r->next->high
3114 <= (bfd_get_section_vma (info->abfd, s)
3115 + bfd_section_size (info->abfd, s))))
3116 {
3117 r = r->next;
3118 high = r->next->high;
3119 }
3120
3121 if ((s->flags & SEC_CODE) != 0)
3122 kind = 1;
3123 else if ((s->flags & SEC_READONLY) != 0)
3124 kind = 3;
3125 else
3126 kind = 2;
3127
3128 if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
3129 || ! ieee_write_byte (info, 11)
3130 || ! ieee_write_number (info, 0)
3131 || ! ieee_write_id (info, "")
3132 || ! ieee_write_number (info, kind)
3133 || ! ieee_write_number (info, s->index)
3134 || ! ieee_write_number (info, low)
3135 || ! ieee_write_byte (info, (int) ieee_be_record_enum)
3136 || ! ieee_write_number (info, high - low))
3137 return false;
3138 }
3139
3140 if (! ieee_write_byte (info, (int) ieee_be_record_enum))
3141 return false;
3142
3143 return true;
3144 }
3145
3146 /* Start recording information from a particular source file. This is
3147 used to record which file defined which types, variables, etc. It
3148 is not used for line numbers, since the lineno entry point passes
3149 down the file name anyhow. IEEE debugging information doesn't seem
3150 to store this information anywhere. */
3151
3152 /*ARGSUSED*/
3153 static boolean
3154 ieee_start_source (p, filename)
3155 PTR p;
3156 const char *filename;
3157 {
3158 return true;
3159 }
3160
3161 /* Make an empty type. */
3162
3163 static boolean
3164 ieee_empty_type (p)
3165 PTR p;
3166 {
3167 struct ieee_handle *info = (struct ieee_handle *) p;
3168
3169 return ieee_push_type (info, 0, 0, false);
3170 }
3171
3172 /* Make a void type. */
3173
3174 static boolean
3175 ieee_void_type (p)
3176 PTR p;
3177 {
3178 struct ieee_handle *info = (struct ieee_handle *) p;
3179
3180 return ieee_push_type (info, 1, 0, false);
3181 }
3182
3183 /* Make an integer type. */
3184
3185 static boolean
3186 ieee_int_type (p, size, unsignedp)
3187 PTR p;
3188 unsigned int size;
3189 boolean unsignedp;
3190 {
3191 struct ieee_handle *info = (struct ieee_handle *) p;
3192 unsigned int indx;
3193
3194 switch (size)
3195 {
3196 case 1:
3197 indx = (int) builtin_signed_char;
3198 break;
3199 case 2:
3200 indx = (int) builtin_signed_short_int;
3201 break;
3202 case 4:
3203 indx = (int) builtin_signed_long;
3204 break;
3205 case 8:
3206 indx = (int) builtin_signed_long_long;
3207 break;
3208 default:
3209 fprintf (stderr, "IEEE unsupported integer type size %u\n", size);
3210 return false;
3211 }
3212
3213 if (unsignedp)
3214 ++indx;
3215
3216 return ieee_push_type (info, indx, size, unsignedp);
3217 }
3218
3219 /* Make a floating point type. */
3220
3221 static boolean
3222 ieee_float_type (p, size)
3223 PTR p;
3224 unsigned int size;
3225 {
3226 struct ieee_handle *info = (struct ieee_handle *) p;
3227 unsigned int indx;
3228
3229 switch (size)
3230 {
3231 case 4:
3232 indx = (int) builtin_float;
3233 break;
3234 case 8:
3235 indx = (int) builtin_double;
3236 break;
3237 case 12:
3238 /* FIXME: This size really depends upon the processor. */
3239 indx = (int) builtin_long_double;
3240 break;
3241 case 16:
3242 indx = (int) builtin_long_long_double;
3243 break;
3244 default:
3245 fprintf (stderr, "IEEE unsupported float type size %u\n", size);
3246 return false;
3247 }
3248
3249 return ieee_push_type (info, indx, size, false);
3250 }
3251
3252 /* Make a complex type. */
3253
3254 static boolean
3255 ieee_complex_type (p, size)
3256 PTR p;
3257 unsigned int size;
3258 {
3259 struct ieee_handle *info = (struct ieee_handle *) p;
3260 char code;
3261
3262 switch (size)
3263 {
3264 case 4:
3265 code = 'c';
3266 break;
3267 case 8:
3268 code = 'd';
3269 break;
3270 default:
3271 fprintf (stderr, "IEEE unsupported complex type size %u\n", size);
3272 return false;
3273 }
3274
3275 /* FIXME: I don't know what the string is for. */
3276 return (ieee_define_type (info, size, false)
3277 && ieee_write_number (info, code)
3278 && ieee_write_id (info, ""));
3279 }
3280
3281 /* Make a boolean type. IEEE doesn't support these, so we just make
3282 an integer type instead. */
3283
3284 static boolean
3285 ieee_bool_type (p, size)
3286 PTR p;
3287 unsigned int size;
3288 {
3289 return ieee_int_type (p, size, true);
3290 }
3291
3292 /* Make an enumeration. */
3293
3294 static boolean
3295 ieee_enum_type (p, tag, names, vals)
3296 PTR p;
3297 const char *tag;
3298 const char **names;
3299 bfd_signed_vma *vals;
3300 {
3301 struct ieee_handle *info = (struct ieee_handle *) p;
3302 boolean simple;
3303 int i;
3304
3305 /* If this is a simple enumeration, in which the values start at 0
3306 and always increment by 1, we can use type E. Otherwise we must
3307 use type N. */
3308
3309 simple = true;
3310 if (names != NULL)
3311 {
3312 for (i = 0; names[i] != NULL; i++)
3313 {
3314 if (vals[i] != i)
3315 {
3316 simple = false;
3317 break;
3318 }
3319 }
3320 }
3321
3322 if (! ieee_define_named_type (info, tag, true, 0, true,
3323 (struct ieee_buf **) NULL)
3324 || ! ieee_write_number (info, simple ? 'E' : 'N'))
3325 return false;
3326 if (simple)
3327 {
3328 /* FIXME: This is supposed to be the enumeration size, but we
3329 don't store that. */
3330 if (! ieee_write_number (info, 4))
3331 return false;
3332 }
3333 if (names != NULL)
3334 {
3335 for (i = 0; names[i] != NULL; i++)
3336 {
3337 if (! ieee_write_id (info, names[i]))
3338 return false;
3339 if (! simple)
3340 {
3341 if (! ieee_write_number (info, vals[i]))
3342 return false;
3343 }
3344 }
3345 }
3346
3347 return true;
3348 }
3349
3350 /* Make a pointer type. */
3351
3352 static boolean
3353 ieee_pointer_type (p)
3354 PTR p;
3355 {
3356 struct ieee_handle *info = (struct ieee_handle *) p;
3357 unsigned int indx;
3358
3359 indx = ieee_pop_type (info);
3360
3361 /* A pointer to a simple builtin type can be obtained by adding 32. */
3362 if (indx < 32)
3363 return ieee_push_type (info, indx + 32, 0, true);
3364
3365 return (ieee_define_type (info, 0, true)
3366 && ieee_write_number (info, 'P')
3367 && ieee_write_number (info, indx));
3368 }
3369
3370 /* Make a function type. */
3371
3372 static boolean
3373 ieee_function_type (p)
3374 PTR p;
3375 {
3376 struct ieee_handle *info = (struct ieee_handle *) p;
3377 unsigned int indx;
3378
3379 indx = ieee_pop_type (info);
3380
3381 /* FIXME: IEEE can represent the argument types for the function,
3382 but we didn't store them. */
3383
3384 /* An attribute of 0x41 means that the frame and push mask are
3385 unknown. */
3386 return (ieee_define_type (info, 0, true)
3387 && ieee_write_number (info, 'x')
3388 && ieee_write_number (info, 0x41)
3389 && ieee_write_number (info, 0)
3390 && ieee_write_number (info, 0)
3391 && ieee_write_number (info, indx)
3392 && ieee_write_number (info, (bfd_vma) -1)
3393 && ieee_write_number (info, 0));
3394 }
3395
3396 /* Make a reference type. */
3397
3398 static boolean
3399 ieee_reference_type (p)
3400 PTR p;
3401 {
3402 struct ieee_handle *info = (struct ieee_handle *) p;
3403
3404 /* IEEE appears to record a normal pointer type, and then use a
3405 pmisc record to indicate that it is really a reference. */
3406
3407 if (! ieee_pointer_type (p))
3408 return false;
3409 info->type_stack->type.referencep = true;
3410 return true;
3411 }
3412
3413 /* Make a range type. */
3414
3415 static boolean
3416 ieee_range_type (p, low, high)
3417 PTR p;
3418 bfd_signed_vma low;
3419 bfd_signed_vma high;
3420 {
3421 struct ieee_handle *info = (struct ieee_handle *) p;
3422 unsigned int size;
3423 boolean unsignedp;
3424
3425 size = info->type_stack->type.size;
3426 unsignedp = info->type_stack->type.unsignedp;
3427 (void) ieee_pop_type (info);
3428 return (ieee_define_type (info, size, unsignedp)
3429 && ieee_write_number (info, 'R')
3430 && ieee_write_number (info, (bfd_vma) low)
3431 && ieee_write_number (info, (bfd_vma) high)
3432 && ieee_write_number (info, unsignedp ? 0 : 1)
3433 && ieee_write_number (info, size));
3434 }
3435
3436 /* Make an array type. */
3437
3438 /*ARGSUSED*/
3439 static boolean
3440 ieee_array_type (p, low, high, stringp)
3441 PTR p;
3442 bfd_signed_vma low;
3443 bfd_signed_vma high;
3444 boolean stringp;
3445 {
3446 struct ieee_handle *info = (struct ieee_handle *) p;
3447 unsigned int eleindx;
3448
3449 /* IEEE does not store the range, so we just ignore it. */
3450 (void) ieee_pop_type (info);
3451 eleindx = ieee_pop_type (info);
3452
3453 if (! ieee_define_type (info, 0, false)
3454 || ! ieee_write_number (info, low == 0 ? 'Z' : 'C')
3455 || ! ieee_write_number (info, eleindx))
3456 return false;
3457 if (low != 0)
3458 {
3459 if (! ieee_write_number (info, low))
3460 return false;
3461 }
3462
3463 return ieee_write_number (info, high);
3464 }
3465
3466 /* Make a set type. */
3467
3468 static boolean
3469 ieee_set_type (p, bitstringp)
3470 PTR p;
3471 boolean bitstringp;
3472 {
3473 struct ieee_handle *info = (struct ieee_handle *) p;
3474 unsigned int eleindx;
3475
3476 eleindx = ieee_pop_type (info);
3477
3478 /* FIXME: We don't know the size, so we just use 4. */
3479
3480 return (ieee_define_type (info, 0, true)
3481 && ieee_write_number (info, 's')
3482 && ieee_write_number (info, 4)
3483 && ieee_write_number (info, eleindx));
3484 }
3485
3486 /* Make an offset type. */
3487
3488 static boolean
3489 ieee_offset_type (p)
3490 PTR p;
3491 {
3492 struct ieee_handle *info = (struct ieee_handle *) p;
3493 unsigned int targetindx, baseindx;
3494
3495 targetindx = ieee_pop_type (info);
3496 baseindx = ieee_pop_type (info);
3497
3498 /* FIXME: The MRI C++ compiler does not appear to generate any
3499 useful type information about an offset type. It just records a
3500 pointer to member as an integer. The MRI/HP IEEE spec does
3501 describe a pmisc record which can be used for a pointer to
3502 member. Unfortunately, it does not describe the target type,
3503 which seems pretty important. I'm going to punt this for now. */
3504
3505 return ieee_int_type (p, 4, true);
3506 }
3507
3508 /* Make a method type. */
3509
3510 static boolean
3511 ieee_method_type (p, domain, argcount)
3512 PTR p;
3513 boolean domain;
3514 int argcount;
3515 {
3516 struct ieee_handle *info = (struct ieee_handle *) p;
3517 unsigned int *args = NULL;
3518 int i;
3519 unsigned int retindx;
3520
3521 /* FIXME: The MRI/HP IEEE spec defines a pmisc record to use for a
3522 method, but the definition is incomplete. We just output an 'x'
3523 type. */
3524
3525 if (domain)
3526 (void) ieee_pop_type (info);
3527
3528 if (argcount > 0)
3529 {
3530 args = (unsigned int *) xmalloc (argcount * sizeof *args);
3531 for (i = argcount - 1; i >= 0; i--)
3532 args[i] = ieee_pop_type (info);
3533 }
3534
3535 retindx = ieee_pop_type (info);
3536
3537 if (! ieee_define_type (info, 0, true)
3538 || ! ieee_write_number (info, 'x')
3539 || ! ieee_write_number (info, 0x41)
3540 || ! ieee_write_number (info, 0)
3541 || ! ieee_write_number (info, 0)
3542 || ! ieee_write_number (info, retindx)
3543 || ! ieee_write_number (info, (bfd_vma) argcount))
3544 return false;
3545 if (argcount > 0)
3546 {
3547 for (i = 0; i < argcount; i++)
3548 if (! ieee_write_number (info, args[i]))
3549 return false;
3550 free (args);
3551 }
3552
3553 return ieee_write_number (info, 0);
3554 }
3555
3556 /* Make a const qualified type. */
3557
3558 static boolean
3559 ieee_const_type (p)
3560 PTR p;
3561 {
3562 struct ieee_handle *info = (struct ieee_handle *) p;
3563 unsigned int size;
3564 boolean unsignedp;
3565 unsigned int indx;
3566
3567 size = info->type_stack->type.size;
3568 unsignedp = info->type_stack->type.unsignedp;
3569 indx = ieee_pop_type (info);
3570 return (ieee_define_type (info, size, unsignedp)
3571 && ieee_write_number (info, 'n')
3572 && ieee_write_number (info, 1)
3573 && ieee_write_number (info, indx));
3574 }
3575
3576 /* Make a volatile qualified type. */
3577
3578 static boolean
3579 ieee_volatile_type (p)
3580 PTR p;
3581 {
3582 struct ieee_handle *info = (struct ieee_handle *) p;
3583 unsigned int size;
3584 boolean unsignedp;
3585 unsigned int indx;
3586
3587 size = info->type_stack->type.size;
3588 unsignedp = info->type_stack->type.unsignedp;
3589 indx = ieee_pop_type (info);
3590 return (ieee_define_type (info, size, unsignedp)
3591 && ieee_write_number (info, 'n')
3592 && ieee_write_number (info, 2)
3593 && ieee_write_number (info, indx));
3594 }
3595
3596 /* Start defining a struct type. We build it in the strdef field on
3597 the stack, to avoid confusing type definitions required by the
3598 fields with the struct type itself. */
3599
3600 static boolean
3601 ieee_start_struct_type (p, tag, structp, size)
3602 PTR p;
3603 const char *tag;
3604 boolean structp;
3605 unsigned int size;
3606 {
3607 struct ieee_handle *info = (struct ieee_handle *) p;
3608 struct ieee_buf *strdef;
3609
3610 strdef = NULL;
3611 if (! ieee_define_named_type (info, tag, true, size, true, &strdef)
3612 || ! ieee_write_number (info, structp ? 'S' : 'U')
3613 || ! ieee_write_number (info, size))
3614 return false;
3615
3616 info->type_stack->type.strdef = strdef;
3617
3618 return true;
3619 }
3620
3621 /* Add a field to a struct. */
3622
3623 static boolean
3624 ieee_struct_field (p, name, bitpos, bitsize, visibility)
3625 PTR p;
3626 const char *name;
3627 bfd_vma bitpos;
3628 bfd_vma bitsize;
3629 enum debug_visibility visibility;
3630 {
3631 struct ieee_handle *info = (struct ieee_handle *) p;
3632 unsigned int size;
3633 boolean unsignedp;
3634 unsigned int indx;
3635 bfd_vma offset;
3636
3637 size = info->type_stack->type.size;
3638 unsignedp = info->type_stack->type.unsignedp;
3639 indx = ieee_pop_type (info);
3640
3641 assert (info->type_stack != NULL && info->type_stack->type.strdef != NULL);
3642
3643 /* If the bitsize doesn't match the expected size, we need to output
3644 a bitfield type. */
3645 if (size == 0 || bitsize == size * 8)
3646 offset = bitpos / 8;
3647 else
3648 {
3649 if (! ieee_define_type (info, 0, unsignedp)
3650 || ! ieee_write_number (info, 'g')
3651 || ! ieee_write_number (info, unsignedp ? 0 : 1)
3652 || ! ieee_write_number (info, indx))
3653 return false;
3654 indx = ieee_pop_type (info);
3655 offset = bitpos;
3656 }
3657
3658 /* Switch to the struct we are building in order to output this
3659 field definition. */
3660 return (ieee_change_buffer (info, &info->type_stack->type.strdef)
3661 && ieee_write_id (info, name)
3662 && ieee_write_number (info, indx)
3663 && ieee_write_number (info, offset));
3664 }
3665
3666 /* Finish up a struct type. */
3667
3668 static boolean
3669 ieee_end_struct_type (p)
3670 PTR p;
3671 {
3672 struct ieee_handle *info = (struct ieee_handle *) p;
3673 struct ieee_buf **pb;
3674
3675 assert (info->type_stack != NULL && info->type_stack->type.strdef != NULL);
3676
3677 /* Make sure we have started the types block. */
3678 if (info->types == NULL)
3679 {
3680 if (! ieee_change_buffer (info, &info->types)
3681 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
3682 || ! ieee_write_byte (info, 1)
3683 || ! ieee_write_number (info, 0)
3684 || ! ieee_write_id (info, info->modname))
3685 return false;
3686 }
3687
3688 /* Append the struct definition to the types. */
3689 for (pb = &info->types; *pb != NULL; pb = &(*pb)->next)
3690 ;
3691 *pb = info->type_stack->type.strdef;
3692 info->type_stack->type.strdef = NULL;
3693
3694 /* Leave the struct on the type stack. */
3695
3696 return true;
3697 }
3698
3699 /* Start a class type. */
3700
3701 static boolean
3702 ieee_start_class_type (p, tag, structp, size, vptr, ownvptr)
3703 PTR p;
3704 const char *tag;
3705 boolean structp;
3706 unsigned int size;
3707 boolean vptr;
3708 boolean ownvptr;
3709 {
3710 struct ieee_handle *info = (struct ieee_handle *) p;
3711
3712 /* FIXME. */
3713 if (vptr && ! ownvptr)
3714 (void) ieee_pop_type (info);
3715 return ieee_start_struct_type (p, tag, structp, size);
3716 }
3717
3718 /* Add a static member to a class. */
3719
3720 static boolean
3721 ieee_class_static_member (p, name, physname, visibility)
3722 PTR p;
3723 const char *name;
3724 const char *physname;
3725 enum debug_visibility visibility;
3726 {
3727 struct ieee_handle *info = (struct ieee_handle *) p;
3728
3729 /* FIXME. */
3730 (void) ieee_pop_type (info);
3731 return true;
3732 }
3733
3734 /* Add a base class to a class. */
3735
3736 static boolean
3737 ieee_class_baseclass (p, bitpos, virtual, visibility)
3738 PTR p;
3739 bfd_vma bitpos;
3740 boolean virtual;
3741 enum debug_visibility visibility;
3742 {
3743 struct ieee_handle *info = (struct ieee_handle *) p;
3744
3745 /* FIXME. */
3746 (void) ieee_pop_type (info);
3747 return true;
3748 }
3749
3750 /* Start building a method for a class. */
3751
3752 static boolean
3753 ieee_class_start_method (p, name)
3754 PTR p;
3755 const char *name;
3756 {
3757 /* FIXME. */
3758 return true;
3759 }
3760
3761 /* Define a new method variant. */
3762
3763 static boolean
3764 ieee_class_method_variant (p, name, visibility, constp, volatilep,
3765 voffset, context)
3766 PTR p;
3767 const char *name;
3768 enum debug_visibility visibility;
3769 boolean constp;
3770 boolean volatilep;
3771 bfd_vma voffset;
3772 boolean context;
3773 {
3774 struct ieee_handle *info = (struct ieee_handle *) p;
3775
3776 /* FIXME. */
3777 (void) ieee_pop_type (info);
3778 if (context)
3779 (void) ieee_pop_type (info);
3780 return true;
3781 }
3782
3783 /* Define a new static method variant. */
3784
3785 static boolean
3786 ieee_class_static_method_variant (p, name, visibility, constp, volatilep)
3787 PTR p;
3788 const char *name;
3789 enum debug_visibility visibility;
3790 boolean constp;
3791 boolean volatilep;
3792 {
3793 struct ieee_handle *info = (struct ieee_handle *) p;
3794
3795 /* FIXME. */
3796 (void) ieee_pop_type (info);
3797 return true;
3798 }
3799
3800 /* Finish up a method. */
3801
3802 static boolean
3803 ieee_class_end_method (p)
3804 PTR p;
3805 {
3806 /* FIXME. */
3807 return true;
3808 }
3809
3810 /* Finish up a class. */
3811
3812 static boolean
3813 ieee_end_class_type (p)
3814 PTR p;
3815 {
3816 return ieee_end_struct_type (p);
3817 }
3818
3819 /* Push a previously seen typedef onto the type stack. */
3820
3821 static boolean
3822 ieee_typedef_type (p, name)
3823 PTR p;
3824 const char *name;
3825 {
3826 struct ieee_handle *info = (struct ieee_handle *) p;
3827 register struct ieee_name_type *nt;
3828
3829 for (nt = info->typedefs; nt != NULL; nt = nt->next)
3830 {
3831 if (nt->name[0] == name[0]
3832 && strcmp (nt->name, name) == 0)
3833 {
3834 if (! ieee_push_type (info, nt->type.indx, nt->type.size,
3835 nt->type.unsignedp))
3836 return false;
3837 /* Copy over any other type information we may have. */
3838 info->type_stack->type = nt->type;
3839 return true;
3840 }
3841 }
3842
3843 abort ();
3844 }
3845
3846 /* Push a tagged type onto the type stack. */
3847
3848 static boolean
3849 ieee_tag_type (p, name, kind)
3850 PTR p;
3851 const char *name;
3852 enum debug_type_kind kind;
3853 {
3854 struct ieee_handle *info = (struct ieee_handle *) p;
3855 register struct ieee_name_type *nt;
3856
3857 for (nt = info->tags; nt != NULL; nt = nt->next)
3858 {
3859 if (nt->name[0] == name[0]
3860 && strcmp (nt->name, name) == 0)
3861 {
3862 if (! ieee_push_type (info, nt->type.indx, nt->type.size,
3863 nt->type.unsignedp))
3864 return false;
3865 /* Copy over any other type information we may have. */
3866 info->type_stack->type = nt->type;
3867 return true;
3868 }
3869 }
3870
3871 nt = (struct ieee_name_type *) xmalloc (sizeof *nt);
3872 memset (nt, 0, sizeof *nt);
3873
3874 nt->name = name;
3875 nt->type.indx = info->type_indx;
3876 ++info->type_indx;
3877 nt->kind = kind;
3878
3879 nt->next = info->tags;
3880 info->tags = nt;
3881
3882 return ieee_push_type (info, nt->type.indx, 0, false);
3883 }
3884
3885 /* Output a typedef. */
3886
3887 static boolean
3888 ieee_typdef (p, name)
3889 PTR p;
3890 const char *name;
3891 {
3892 struct ieee_handle *info = (struct ieee_handle *) p;
3893 struct ieee_name_type *nt;
3894 unsigned int size;
3895 boolean unsignedp;
3896 unsigned int indx;
3897
3898 nt = (struct ieee_name_type *) xmalloc (sizeof *nt);
3899 memset (nt, 0, sizeof *nt);
3900 nt->name = name;
3901 nt->type = info->type_stack->type;
3902 nt->kind = DEBUG_KIND_VOID;
3903
3904 nt->next = info->typedefs;
3905 info->typedefs = nt;
3906
3907 size = info->type_stack->type.size;
3908 unsignedp = info->type_stack->type.unsignedp;
3909 indx = ieee_pop_type (info);
3910
3911 /* If this is a simple builtin type using a builtin name, we don't
3912 want to output the typedef itself. We also want to change the
3913 type index to correspond to the name being used. We recognize
3914 names used in stabs debugging output even if they don't exactly
3915 correspond to the names used for the IEEE builtin types. */
3916 if (indx <= (unsigned int) builtin_bcd_float)
3917 {
3918 boolean found;
3919
3920 found = false;
3921 switch ((enum builtin_types) indx)
3922 {
3923 default:
3924 break;
3925
3926 case builtin_void:
3927 if (strcmp (name, "void") == 0)
3928 found = true;
3929 break;
3930
3931 case builtin_signed_char:
3932 case builtin_char:
3933 if (strcmp (name, "signed char") == 0)
3934 {
3935 indx = (unsigned int) builtin_signed_char;
3936 found = true;
3937 }
3938 else if (strcmp (name, "char") == 0)
3939 {
3940 indx = (unsigned int) builtin_char;
3941 found = true;
3942 }
3943 break;
3944
3945 case builtin_unsigned_char:
3946 if (strcmp (name, "unsigned char") == 0)
3947 found = true;
3948 break;
3949
3950 case builtin_signed_short_int:
3951 case builtin_short:
3952 case builtin_short_int:
3953 case builtin_signed_short:
3954 if (strcmp (name, "signed short int") == 0)
3955 {
3956 indx = (unsigned int) builtin_signed_short_int;
3957 found = true;
3958 }
3959 else if (strcmp (name, "short") == 0)
3960 {
3961 indx = (unsigned int) builtin_short;
3962 found = true;
3963 }
3964 else if (strcmp (name, "short int") == 0)
3965 {
3966 indx = (unsigned int) builtin_short_int;
3967 found = true;
3968 }
3969 else if (strcmp (name, "signed short") == 0)
3970 {
3971 indx = (unsigned int) builtin_signed_short;
3972 found = true;
3973 }
3974 break;
3975
3976 case builtin_unsigned_short_int:
3977 case builtin_unsigned_short:
3978 if (strcmp (name, "unsigned short int") == 0
3979 || strcmp (name, "short unsigned int") == 0)
3980 {
3981 indx = builtin_unsigned_short_int;
3982 found = true;
3983 }
3984 else if (strcmp (name, "unsigned short") == 0)
3985 {
3986 indx = builtin_unsigned_short;
3987 found = true;
3988 }
3989 break;
3990
3991 case builtin_signed_long:
3992 case builtin_int: /* FIXME: Size depends upon architecture. */
3993 case builtin_long:
3994 if (strcmp (name, "signed long") == 0)
3995 {
3996 indx = builtin_signed_long;
3997 found = true;
3998 }
3999 else if (strcmp (name, "int") == 0)
4000 {
4001 indx = builtin_int;
4002 found = true;
4003 }
4004 else if (strcmp (name, "long") == 0
4005 || strcmp (name, "long int") == 0)
4006 {
4007 indx = builtin_long;
4008 found = true;
4009 }
4010 break;
4011
4012 case builtin_unsigned_long:
4013 case builtin_unsigned: /* FIXME: Size depends upon architecture. */
4014 case builtin_unsigned_int: /* FIXME: Like builtin_unsigned. */
4015 if (strcmp (name, "unsigned long") == 0
4016 || strcmp (name, "long unsigned int") == 0)
4017 {
4018 indx = builtin_unsigned_long;
4019 found = true;
4020 }
4021 else if (strcmp (name, "unsigned") == 0)
4022 {
4023 indx = builtin_unsigned;
4024 found = true;
4025 }
4026 else if (strcmp (name, "unsigned int") == 0)
4027 {
4028 indx = builtin_unsigned_int;
4029 found = true;
4030 }
4031 break;
4032
4033 case builtin_signed_long_long:
4034 if (strcmp (name, "signed long long") == 0
4035 || strcmp (name, "long long int") == 0)
4036 found = true;
4037 break;
4038
4039 case builtin_unsigned_long_long:
4040 if (strcmp (name, "unsigned long long") == 0
4041 || strcmp (name, "long long unsigned int") == 0)
4042 found = true;
4043 break;
4044
4045 case builtin_float:
4046 if (strcmp (name, "float") == 0)
4047 found = true;
4048 break;
4049
4050 case builtin_double:
4051 if (strcmp (name, "double") == 0)
4052 found = true;
4053 break;
4054
4055 case builtin_long_double:
4056 if (strcmp (name, "long double") == 0)
4057 found = true;
4058 break;
4059
4060 case builtin_long_long_double:
4061 if (strcmp (name, "long long double") == 0)
4062 found = true;
4063 break;
4064 }
4065
4066 if (found)
4067 {
4068 nt->type.indx = indx;
4069 return true;
4070 }
4071 }
4072
4073 if (! ieee_define_named_type (info, name, false, size, unsignedp,
4074 (struct ieee_buf **) NULL)
4075 || ! ieee_write_number (info, 'T')
4076 || ! ieee_write_number (info, indx))
4077 return false;
4078
4079 /* Remove the type we just added to the type stack. */
4080 (void) ieee_pop_type (info);
4081
4082 return true;
4083 }
4084
4085 /* Output a tag for a type. We don't have to do anything here. */
4086
4087 static boolean
4088 ieee_tag (p, name)
4089 PTR p;
4090 const char *name;
4091 {
4092 struct ieee_handle *info = (struct ieee_handle *) p;
4093
4094 (void) ieee_pop_type (info);
4095 return true;
4096 }
4097
4098 /* Output an integer constant. */
4099
4100 static boolean
4101 ieee_int_constant (p, name, val)
4102 PTR p;
4103 const char *name;
4104 bfd_vma val;
4105 {
4106 /* FIXME. */
4107 return true;
4108 }
4109
4110 /* Output a floating point constant. */
4111
4112 static boolean
4113 ieee_float_constant (p, name, val)
4114 PTR p;
4115 const char *name;
4116 double val;
4117 {
4118 /* FIXME. */
4119 return true;
4120 }
4121
4122 /* Output a typed constant. */
4123
4124 static boolean
4125 ieee_typed_constant (p, name, val)
4126 PTR p;
4127 const char *name;
4128 bfd_vma val;
4129 {
4130 struct ieee_handle *info = (struct ieee_handle *) p;
4131
4132 /* FIXME. */
4133 (void) ieee_pop_type (info);
4134 return true;
4135 }
4136
4137 /* Output a variable. */
4138
4139 static boolean
4140 ieee_variable (p, name, kind, val)
4141 PTR p;
4142 const char *name;
4143 enum debug_var_kind kind;
4144 bfd_vma val;
4145 {
4146 struct ieee_handle *info = (struct ieee_handle *) p;
4147 unsigned int name_indx;
4148 unsigned int size;
4149 unsigned int type_indx;
4150 boolean asn;
4151
4152 /* Make sure the variable section is started. */
4153 if (info->vars != NULL)
4154 {
4155 if (! ieee_change_buffer (info, &info->vars))
4156 return false;
4157 }
4158 else
4159 {
4160 if (! ieee_change_buffer (info, &info->vars)
4161 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4162 || ! ieee_write_byte (info, 3)
4163 || ! ieee_write_number (info, 0)
4164 || ! ieee_write_id (info, info->modname))
4165 return false;
4166 }
4167
4168 name_indx = info->name_indx;
4169 ++info->name_indx;
4170
4171 size = info->type_stack->type.size;
4172 type_indx = ieee_pop_type (info);
4173
4174 /* Write out an NN and an ATN record for this variable. */
4175 if (! ieee_write_byte (info, (int) ieee_nn_record)
4176 || ! ieee_write_number (info, name_indx)
4177 || ! ieee_write_id (info, name)
4178 || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
4179 || ! ieee_write_number (info, name_indx)
4180 || ! ieee_write_number (info, type_indx))
4181 return false;
4182 switch (kind)
4183 {
4184 default:
4185 abort ();
4186 return false;
4187 case DEBUG_GLOBAL:
4188 if (! ieee_write_number (info, 8)
4189 || ! ieee_add_range (info, val, val + size))
4190 return false;
4191 asn = true;
4192 break;
4193 case DEBUG_STATIC:
4194 case DEBUG_LOCAL_STATIC:
4195 if (! ieee_write_number (info, 3)
4196 || ! ieee_add_range (info, val, val + size))
4197 return false;
4198 asn = true;
4199 break;
4200 case DEBUG_LOCAL:
4201 if (! ieee_write_number (info, 1)
4202 || ! ieee_write_number (info, val))
4203 return false;
4204 asn = false;
4205 break;
4206 case DEBUG_REGISTER:
4207 if (! ieee_write_number (info, 2)
4208 || ! ieee_write_number (info,
4209 ieee_genreg_to_regno (info->abfd, val)))
4210 return false;
4211 asn = false;
4212 break;
4213 }
4214
4215 if (asn)
4216 {
4217 if (! ieee_write_2bytes (info, (int) ieee_asn_record_enum)
4218 || ! ieee_write_number (info, name_indx)
4219 || ! ieee_write_number (info, val))
4220 return false;
4221 }
4222
4223 return true;
4224 }
4225
4226 /* Start outputting information for a function. */
4227
4228 static boolean
4229 ieee_start_function (p, name, global)
4230 PTR p;
4231 const char *name;
4232 boolean global;
4233 {
4234 struct ieee_handle *info = (struct ieee_handle *) p;
4235 unsigned int indx;
4236
4237 /* Make sure the variable section is started. */
4238 if (info->vars != NULL)
4239 {
4240 if (! ieee_change_buffer (info, &info->vars))
4241 return false;
4242 }
4243 else
4244 {
4245 if (! ieee_change_buffer (info, &info->vars)
4246 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4247 || ! ieee_write_byte (info, 3)
4248 || ! ieee_write_number (info, 0)
4249 || ! ieee_write_id (info, info->modname))
4250 return false;
4251 }
4252
4253 indx = ieee_pop_type (info);
4254
4255 /* The address is written out as the first block. */
4256
4257 ++info->block_depth;
4258
4259 return (ieee_write_byte (info, (int) ieee_bb_record_enum)
4260 && ieee_write_byte (info, global ? 4 : 6)
4261 && ieee_write_number (info, 0)
4262 && ieee_write_id (info, name)
4263 && ieee_write_number (info, 0)
4264 && ieee_write_number (info, indx));
4265 }
4266
4267 /* Add a function parameter. This will normally be called before the
4268 first block, so we postpone them until we see the block. */
4269
4270 static boolean
4271 ieee_function_parameter (p, name, kind, val)
4272 PTR p;
4273 const char *name;
4274 enum debug_parm_kind kind;
4275 bfd_vma val;
4276 {
4277 struct ieee_handle *info = (struct ieee_handle *) p;
4278 struct ieee_pending_parm *m, **pm;
4279
4280 assert (info->block_depth == 1);
4281
4282 m = (struct ieee_pending_parm *) xmalloc (sizeof *m);
4283 memset (m, 0, sizeof *m);
4284
4285 m->next = NULL;
4286 m->name = name;
4287 m->type = ieee_pop_type (info);
4288 m->kind = kind;
4289 m->val = val;
4290
4291 for (pm = &info->pending_parms; *pm != NULL; pm = &(*pm)->next)
4292 ;
4293 *pm = m;
4294
4295 return true;
4296 }
4297
4298 /* Output pending function parameters. */
4299
4300 static boolean
4301 ieee_output_pending_parms (info)
4302 struct ieee_handle *info;
4303 {
4304 struct ieee_pending_parm *m;
4305
4306 m = info->pending_parms;
4307 while (m != NULL)
4308 {
4309 struct ieee_pending_parm *next;
4310 enum debug_var_kind vkind;
4311
4312 switch (m->kind)
4313 {
4314 default:
4315 abort ();
4316 return false;
4317 case DEBUG_PARM_STACK:
4318 case DEBUG_PARM_REFERENCE:
4319 vkind = DEBUG_LOCAL;
4320 break;
4321 case DEBUG_PARM_REG:
4322 case DEBUG_PARM_REF_REG:
4323 vkind = DEBUG_REGISTER;
4324 break;
4325 }
4326
4327 if (! ieee_push_type (info, m->type, 0, false)
4328 || ! ieee_variable ((PTR) info, m->name, vkind, m->val))
4329 return false;
4330
4331 /* FIXME: We should output a pmisc note here for reference
4332 parameters. */
4333
4334 next = m->next;
4335 free (m);
4336 m = next;
4337 }
4338 info->pending_parms = NULL;
4339
4340 return true;
4341 }
4342
4343 /* Start a block. If this is the first block, we output the address
4344 to finish the BB4 or BB6, and then output the function parameters. */
4345
4346 static boolean
4347 ieee_start_block (p, addr)
4348 PTR p;
4349 bfd_vma addr;
4350 {
4351 struct ieee_handle *info = (struct ieee_handle *) p;
4352
4353 if (! ieee_change_buffer (info, &info->vars))
4354 return false;
4355
4356 if (info->block_depth == 1)
4357 {
4358 if (! ieee_write_number (info, addr)
4359 || ! ieee_output_pending_parms (info))
4360 return false;
4361 }
4362 else
4363 {
4364 if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
4365 || ! ieee_write_byte (info, 6)
4366 || ! ieee_write_byte (info, 0)
4367 || ! ieee_write_id (info, "")
4368 || ! ieee_write_number (info, 0)
4369 || ! ieee_write_number (info, 0)
4370 || ! ieee_write_number (info, addr))
4371 return false;
4372 }
4373
4374 if (! ieee_start_range (info, addr))
4375 return false;
4376
4377 ++info->block_depth;
4378
4379 return true;
4380 }
4381
4382 /* End a block. */
4383
4384 static boolean
4385 ieee_end_block (p, addr)
4386 PTR p;
4387 bfd_vma addr;
4388 {
4389 struct ieee_handle *info = (struct ieee_handle *) p;
4390
4391 if (! ieee_change_buffer (info, &info->vars)
4392 || ! ieee_write_byte (info, (int) ieee_be_record_enum)
4393 || ! ieee_write_number (info, addr))
4394 return false;
4395
4396 if (! ieee_end_range (info, addr))
4397 return false;
4398
4399 --info->block_depth;
4400
4401 return true;
4402 }
4403
4404 /* End a function. */
4405
4406 static boolean
4407 ieee_end_function (p)
4408 PTR p;
4409 {
4410 struct ieee_handle *info = (struct ieee_handle *) p;
4411
4412 assert (info->block_depth == 1);
4413
4414 --info->block_depth;
4415
4416 return true;
4417 }
4418
4419 /* Record line number information. */
4420
4421 static boolean
4422 ieee_lineno (p, filename, lineno, addr)
4423 PTR p;
4424 const char *filename;
4425 unsigned long lineno;
4426 bfd_vma addr;
4427 {
4428 struct ieee_handle *info = (struct ieee_handle *) p;
4429
4430 assert (info->filename != NULL);
4431
4432 /* Make sure we have a line number block. */
4433 if (info->linenos != NULL)
4434 {
4435 if (! ieee_change_buffer (info, &info->linenos))
4436 return false;
4437 }
4438 else
4439 {
4440 info->lineno_name_indx = info->name_indx;
4441 ++info->name_indx;
4442 if (! ieee_change_buffer (info, &info->linenos)
4443 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4444 || ! ieee_write_byte (info, 5)
4445 || ! ieee_write_number (info, 0)
4446 || ! ieee_write_id (info, info->filename)
4447 || ! ieee_write_byte (info, (int) ieee_nn_record)
4448 || ! ieee_write_number (info, info->lineno_name_indx)
4449 || ! ieee_write_id (info, ""))
4450 return false;
4451 info->lineno_filename = info->filename;
4452 }
4453
4454 if (strcmp (filename, info->lineno_filename) != 0)
4455 {
4456 if (strcmp (info->filename, info->lineno_filename) != 0)
4457 {
4458 /* We were not in the main file. Close the block for the
4459 included file. */
4460 if (! ieee_write_byte (info, (int) ieee_be_record_enum))
4461 return false;
4462 }
4463 if (strcmp (info->filename, filename) != 0)
4464 {
4465 /* We are not changing to the main file. Open a block for
4466 the new included file. */
4467 if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
4468 || ! ieee_write_byte (info, 5)
4469 || ! ieee_write_number (info, 0)
4470 || ! ieee_write_id (info, filename))
4471 return false;
4472 }
4473 info->lineno_filename = filename;
4474 }
4475
4476 return (ieee_write_2bytes (info, (int) ieee_atn_record_enum)
4477 && ieee_write_number (info, info->lineno_name_indx)
4478 && ieee_write_number (info, 0)
4479 && ieee_write_number (info, 7)
4480 && ieee_write_number (info, lineno)
4481 && ieee_write_number (info, 0)
4482 && ieee_write_2bytes (info, (int) ieee_asn_record_enum)
4483 && ieee_write_number (info, info->lineno_name_indx)
4484 && ieee_write_number (info, addr));
4485 }