2002-02-19 Daniel Jacobowitz <drow@mvista.com>
[deliverable/binutils-gdb.git] / gdb / dstread.c
1 /* Read apollo DST symbol tables and convert to internal format, for GDB.
2 Contributed by Troy Rollo, University of NSW (troy@cbme.unsw.edu.au).
3 Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000
4 Free Software Foundation, Inc.
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
22 \f
23 #include "defs.h"
24 #include "symtab.h"
25 #include "gdbtypes.h"
26 #include "breakpoint.h"
27 #include "bfd.h"
28 #include "symfile.h"
29 #include "objfiles.h"
30 #include "buildsym.h"
31 #include "obstack.h"
32
33 #include "gdb_string.h"
34
35 #include "dst.h"
36
37 CORE_ADDR cur_src_start_addr, cur_src_end_addr;
38 dst_sec blocks_info, lines_info, symbols_info;
39
40 /* Vector of line number information. */
41
42 static struct linetable *line_vector;
43
44 /* Index of next entry to go in line_vector_index. */
45
46 static int line_vector_index;
47
48 /* Last line number recorded in the line vector. */
49
50 static int prev_line_number;
51
52 /* Number of elements allocated for line_vector currently. */
53
54 static int line_vector_length;
55
56 static int init_dst_sections (int);
57
58 static void read_dst_symtab (struct objfile *);
59
60 static void find_dst_sections (bfd *, sec_ptr, PTR);
61
62 static void dst_symfile_init (struct objfile *);
63
64 static void dst_new_init (struct objfile *);
65
66 static void dst_symfile_read (struct objfile *, int);
67
68 static void dst_symfile_finish (struct objfile *);
69
70 static void dst_end_symtab (struct objfile *);
71
72 static void complete_symtab (char *, CORE_ADDR, unsigned int);
73
74 static void dst_start_symtab (void);
75
76 static void dst_record_line (int, CORE_ADDR);
77
78 /* Manage the vector of line numbers. */
79 /* FIXME: Use record_line instead. */
80
81 static void
82 dst_record_line (int line, CORE_ADDR pc)
83 {
84 struct linetable_entry *e;
85 /* Make sure line vector is big enough. */
86
87 if (line_vector_index + 2 >= line_vector_length)
88 {
89 line_vector_length *= 2;
90 line_vector = (struct linetable *)
91 xrealloc ((char *) line_vector, sizeof (struct linetable)
92 + (line_vector_length
93 * sizeof (struct linetable_entry)));
94 }
95
96 e = line_vector->item + line_vector_index++;
97 e->line = line;
98 e->pc = pc;
99 }
100 \f
101 /* Start a new symtab for a new source file.
102 It indicates the start of data for one original source file. */
103 /* FIXME: use start_symtab, like coffread.c now does. */
104
105 static void
106 dst_start_symtab (void)
107 {
108 /* Initialize the source file line number information for this file. */
109
110 if (line_vector) /* Unlikely, but maybe possible? */
111 xfree (line_vector);
112 line_vector_index = 0;
113 line_vector_length = 1000;
114 prev_line_number = -2; /* Force first line number to be explicit */
115 line_vector = (struct linetable *)
116 xmalloc (sizeof (struct linetable)
117 + line_vector_length * sizeof (struct linetable_entry));
118 }
119
120 /* Save the vital information from when starting to read a file,
121 for use when closing off the current file.
122 NAME is the file name the symbols came from, START_ADDR is the first
123 text address for the file, and SIZE is the number of bytes of text. */
124
125 static void
126 complete_symtab (char *name, CORE_ADDR start_addr, unsigned int size)
127 {
128 last_source_file = savestring (name, strlen (name));
129 cur_src_start_addr = start_addr;
130 cur_src_end_addr = start_addr + size;
131
132 if (current_objfile->ei.entry_point >= cur_src_start_addr &&
133 current_objfile->ei.entry_point < cur_src_end_addr)
134 {
135 current_objfile->ei.entry_file_lowpc = cur_src_start_addr;
136 current_objfile->ei.entry_file_highpc = cur_src_end_addr;
137 }
138 }
139
140 /* Finish the symbol definitions for one main source file,
141 close off all the lexical contexts for that file
142 (creating struct block's for them), then make the
143 struct symtab for that file and put it in the list of all such. */
144 /* FIXME: Use end_symtab, like coffread.c now does. */
145
146 static void
147 dst_end_symtab (struct objfile *objfile)
148 {
149 register struct symtab *symtab;
150 register struct blockvector *blockvector;
151 register struct linetable *lv;
152
153 /* Create the blockvector that points to all the file's blocks. */
154
155 blockvector = make_blockvector (objfile);
156
157 /* Now create the symtab object for this source file. */
158 symtab = allocate_symtab (last_source_file, objfile);
159
160 /* Fill in its components. */
161 symtab->blockvector = blockvector;
162 symtab->free_code = free_linetable;
163 symtab->free_ptr = 0;
164 symtab->filename = last_source_file;
165 symtab->dirname = NULL;
166 symtab->debugformat = obsavestring ("Apollo DST", 10,
167 &objfile->symbol_obstack);
168 lv = line_vector;
169 lv->nitems = line_vector_index;
170 symtab->linetable = (struct linetable *)
171 xrealloc ((char *) lv, (sizeof (struct linetable)
172 + lv->nitems * sizeof (struct linetable_entry)));
173
174 free_named_symtabs (symtab->filename);
175
176 /* Reinitialize for beginning of new file. */
177 line_vector = 0;
178 line_vector_length = -1;
179 last_source_file = NULL;
180 }
181 \f
182 /* dst_symfile_init ()
183 is the dst-specific initialization routine for reading symbols.
184
185 We will only be called if this is a DST or DST-like file.
186 BFD handles figuring out the format of the file, and code in symtab.c
187 uses BFD's determination to vector to us.
188
189 The ultimate result is a new symtab (or, FIXME, eventually a psymtab). */
190
191 static void
192 dst_symfile_init (struct objfile *objfile)
193 {
194 asection *section;
195 bfd *abfd = objfile->obfd;
196
197 init_entry_point_info (objfile);
198
199 }
200
201 /* This function is called for every section; it finds the outer limits
202 of the line table (minimum and maximum file offset) so that the
203 mainline code can read the whole thing for efficiency. */
204
205 /* ARGSUSED */
206 static void
207 find_dst_sections (bfd *abfd, sec_ptr asect, PTR vpinfo)
208 {
209 int size, count;
210 long base;
211 file_ptr offset, maxoff;
212 dst_sec *section;
213
214 /* WARNING WILL ROBINSON! ACCESSING BFD-PRIVATE DATA HERE! FIXME! */
215 size = asect->_raw_size;
216 offset = asect->filepos;
217 base = asect->vma;
218 /* End of warning */
219
220 section = NULL;
221 if (!strcmp (asect->name, ".blocks"))
222 section = &blocks_info;
223 else if (!strcmp (asect->name, ".lines"))
224 section = &lines_info;
225 else if (!strcmp (asect->name, ".symbols"))
226 section = &symbols_info;
227 if (!section)
228 return;
229 section->size = size;
230 section->position = offset;
231 section->base = base;
232 }
233
234
235 /* The BFD for this file -- only good while we're actively reading
236 symbols into a psymtab or a symtab. */
237
238 static bfd *symfile_bfd;
239
240 /* Read a symbol file, after initialization by dst_symfile_init. */
241 /* FIXME! Addr and Mainline are not used yet -- this will not work for
242 shared libraries or add_file! */
243
244 /* ARGSUSED */
245 static void
246 dst_symfile_read (struct objfile *objfile, int mainline)
247 {
248 bfd *abfd = objfile->obfd;
249 char *name = bfd_get_filename (abfd);
250 int desc;
251 register int val;
252 int num_symbols;
253 int symtab_offset;
254 int stringtab_offset;
255
256 symfile_bfd = abfd; /* Kludge for swap routines */
257
258 /* WARNING WILL ROBINSON! ACCESSING BFD-PRIVATE DATA HERE! FIXME! */
259 desc = fileno ((FILE *) (abfd->iostream)); /* File descriptor */
260
261 /* Read the line number table, all at once. */
262 bfd_map_over_sections (abfd, find_dst_sections, (PTR) NULL);
263
264 val = init_dst_sections (desc);
265 if (val < 0)
266 error ("\"%s\": error reading debugging symbol tables\n", name);
267
268 init_minimal_symbol_collection ();
269 make_cleanup_discard_minimal_symbols ();
270
271 /* Now that the executable file is positioned at symbol table,
272 process it and define symbols accordingly. */
273
274 read_dst_symtab (objfile);
275
276 /* Sort symbols alphabetically within each block. */
277
278 {
279 struct symtab *s;
280 for (s = objfile->symtabs; s != NULL; s = s->next)
281 {
282 sort_symtab_syms (s);
283 }
284 }
285
286 /* Install any minimal symbols that have been collected as the current
287 minimal symbols for this objfile. */
288
289 install_minimal_symbols (objfile);
290 }
291
292 static void
293 dst_new_init (struct objfile *ignore)
294 {
295 /* Nothin' to do */
296 }
297
298 /* Perform any local cleanups required when we are done with a particular
299 objfile. I.E, we are in the process of discarding all symbol information
300 for an objfile, freeing up all memory held for it, and unlinking the
301 objfile struct from the global list of known objfiles. */
302
303 static void
304 dst_symfile_finish (struct objfile *objfile)
305 {
306 /* Nothing to do */
307 }
308 \f
309
310 /* Get the next line number from the DST. Returns 0 when we hit an
311 * end directive or cannot continue for any other reason.
312 *
313 * Note that ordinary pc deltas are multiplied by two. Apparently
314 * this is what was really intended.
315 */
316 static int
317 get_dst_line (signed char **buffer, long *pc)
318 {
319 static last_pc = 0;
320 static long last_line = 0;
321 static int last_file = 0;
322 dst_ln_entry_ptr_t entry;
323 int size;
324 dst_src_loc_t *src_loc;
325
326 if (*pc != -1)
327 {
328 last_pc = *pc;
329 *pc = -1;
330 }
331 entry = (dst_ln_entry_ptr_t) * buffer;
332
333 while (dst_ln_ln_delta (*entry) == dst_ln_escape_flag)
334 {
335 switch (entry->esc.esc_code)
336 {
337 case dst_ln_pad:
338 size = 1; /* pad byte */
339 break;
340 case dst_ln_file:
341 /* file escape. Next 4 bytes are a dst_src_loc_t */
342 size = 5;
343 src_loc = (dst_src_loc_t *) (*buffer + 1);
344 last_line = src_loc->line_number;
345 last_file = src_loc->file_index;
346 break;
347 case dst_ln_dln1_dpc1:
348 /* 1 byte line delta, 1 byte pc delta */
349 last_line += (*buffer)[1];
350 last_pc += 2 * (unsigned char) (*buffer)[2];
351 dst_record_line (last_line, last_pc);
352 size = 3;
353 break;
354 case dst_ln_dln2_dpc2:
355 /* 2 bytes line delta, 2 bytes pc delta */
356 last_line += *(short *) (*buffer + 1);
357 last_pc += 2 * (*(short *) (*buffer + 3));
358 size = 5;
359 dst_record_line (last_line, last_pc);
360 break;
361 case dst_ln_ln4_pc4:
362 /* 4 bytes ABSOLUTE line number, 4 bytes ABSOLUTE pc */
363 last_line = *(unsigned long *) (*buffer + 1);
364 last_pc = *(unsigned long *) (*buffer + 5);
365 size = 9;
366 dst_record_line (last_line, last_pc);
367 break;
368 case dst_ln_dln1_dpc0:
369 /* 1 byte line delta, pc delta = 0 */
370 size = 2;
371 last_line += (*buffer)[1];
372 break;
373 case dst_ln_ln_off_1:
374 /* statement escape, stmt # = 1 (2nd stmt on line) */
375 size = 1;
376 break;
377 case dst_ln_ln_off:
378 /* statement escape, stmt # = next byte */
379 size = 2;
380 break;
381 case dst_ln_entry:
382 /* entry escape, next byte is entry number */
383 size = 2;
384 break;
385 case dst_ln_exit:
386 /* exit escape */
387 size = 1;
388 break;
389 case dst_ln_stmt_end:
390 /* gap escape, 4 bytes pc delta */
391 size = 5;
392 /* last_pc += 2 * (*(long *) (*buffer + 1)); */
393 /* Apparently this isn't supposed to actually modify
394 * the pc value. Totally weird.
395 */
396 break;
397 case dst_ln_escape_11:
398 case dst_ln_escape_12:
399 case dst_ln_escape_13:
400 size = 1;
401 break;
402 case dst_ln_nxt_byte:
403 /* This shouldn't happen. If it does, we're SOL */
404 return 0;
405 break;
406 case dst_ln_end:
407 /* end escape, final entry follows */
408 return 0;
409 }
410 *buffer += (size < 0) ? -size : size;
411 entry = (dst_ln_entry_ptr_t) * buffer;
412 }
413 last_line += dst_ln_ln_delta (*entry);
414 last_pc += entry->delta.pc_delta * 2;
415 (*buffer)++;
416 dst_record_line (last_line, last_pc);
417 return 1;
418 }
419
420 static void
421 enter_all_lines (char *buffer, long address)
422 {
423 if (buffer)
424 while (get_dst_line (&buffer, &address));
425 }
426
427 static int
428 get_dst_entry (char *buffer, dst_rec_ptr_t *ret_entry)
429 {
430 int size;
431 dst_rec_ptr_t entry;
432 static int last_type;
433 int ar_size;
434 static unsigned lu3;
435
436 entry = (dst_rec_ptr_t) buffer;
437 switch (entry->rec_type)
438 {
439 case dst_typ_pad:
440 size = 0;
441 break;
442 case dst_typ_comp_unit:
443 size = sizeof (DST_comp_unit (entry));
444 break;
445 case dst_typ_section_tab:
446 size = sizeof (DST_section_tab (entry))
447 + ((int) DST_section_tab (entry).number_of_sections
448 - dst_dummy_array_size) * sizeof (long);
449 break;
450 case dst_typ_file_tab:
451 size = sizeof (DST_file_tab (entry))
452 + ((int) DST_file_tab (entry).number_of_files
453 - dst_dummy_array_size) * sizeof (dst_file_desc_t);
454 break;
455 case dst_typ_block:
456 size = sizeof (DST_block (entry))
457 + ((int) DST_block (entry).n_of_code_ranges
458 - dst_dummy_array_size) * sizeof (dst_code_range_t);
459 break;
460 case dst_typ_5:
461 size = -1;
462 break;
463 case dst_typ_var:
464 size = sizeof (DST_var (entry)) -
465 sizeof (dst_var_loc_long_t) * dst_dummy_array_size +
466 DST_var (entry).no_of_locs *
467 (DST_var (entry).short_locs ?
468 sizeof (dst_var_loc_short_t) :
469 sizeof (dst_var_loc_long_t));
470 break;
471 case dst_typ_pointer:
472 size = sizeof (DST_pointer (entry));
473 break;
474 case dst_typ_array:
475 size = sizeof (DST_array (entry));
476 break;
477 case dst_typ_subrange:
478 size = sizeof (DST_subrange (entry));
479 break;
480 case dst_typ_set:
481 size = sizeof (DST_set (entry));
482 break;
483 case dst_typ_implicit_enum:
484 size = sizeof (DST_implicit_enum (entry))
485 + ((int) DST_implicit_enum (entry).nelems
486 - dst_dummy_array_size) * sizeof (dst_rel_offset_t);
487 break;
488 case dst_typ_explicit_enum:
489 size = sizeof (DST_explicit_enum (entry))
490 + ((int) DST_explicit_enum (entry).nelems
491 - dst_dummy_array_size) * sizeof (dst_enum_elem_t);
492 break;
493 case dst_typ_short_rec:
494 size = sizeof (DST_short_rec (entry))
495 + DST_short_rec (entry).nfields * sizeof (dst_short_field_t)
496 - dst_dummy_array_size * sizeof (dst_field_t);
497 break;
498 case dst_typ_short_union:
499 size = sizeof (DST_short_union (entry))
500 + DST_short_union (entry).nfields * sizeof (dst_short_field_t)
501 - dst_dummy_array_size * sizeof (dst_field_t);
502 break;
503 case dst_typ_file:
504 size = sizeof (DST_file (entry));
505 break;
506 case dst_typ_offset:
507 size = sizeof (DST_offset (entry));
508 break;
509 case dst_typ_alias:
510 size = sizeof (DST_alias (entry));
511 break;
512 case dst_typ_signature:
513 size = sizeof (DST_signature (entry)) +
514 ((int) DST_signature (entry).nargs -
515 dst_dummy_array_size) * sizeof (dst_arg_t);
516 break;
517 case dst_typ_21:
518 size = -1;
519 break;
520 case dst_typ_old_label:
521 size = sizeof (DST_old_label (entry));
522 break;
523 case dst_typ_scope:
524 size = sizeof (DST_scope (entry));
525 break;
526 case dst_typ_end_scope:
527 size = 0;
528 break;
529 case dst_typ_25:
530 case dst_typ_26:
531 size = -1;
532 break;
533 case dst_typ_string_tab:
534 case dst_typ_global_name_tab:
535 size = sizeof (DST_string_tab (entry))
536 + DST_string_tab (entry).length
537 - dst_dummy_array_size;
538 break;
539 case dst_typ_forward:
540 size = sizeof (DST_forward (entry));
541 get_dst_entry ((char *) entry + DST_forward (entry).rec_off, &entry);
542 break;
543 case dst_typ_aux_size:
544 size = sizeof (DST_aux_size (entry));
545 break;
546 case dst_typ_aux_align:
547 size = sizeof (DST_aux_align (entry));
548 break;
549 case dst_typ_aux_field_size:
550 size = sizeof (DST_aux_field_size (entry));
551 break;
552 case dst_typ_aux_field_off:
553 size = sizeof (DST_aux_field_off (entry));
554 break;
555 case dst_typ_aux_field_align:
556 size = sizeof (DST_aux_field_align (entry));
557 break;
558 case dst_typ_aux_qual:
559 size = sizeof (DST_aux_qual (entry));
560 break;
561 case dst_typ_aux_var_bound:
562 size = sizeof (DST_aux_var_bound (entry));
563 break;
564 case dst_typ_extension:
565 size = DST_extension (entry).rec_size;
566 break;
567 case dst_typ_string:
568 size = sizeof (DST_string (entry));
569 break;
570 case dst_typ_old_entry:
571 size = 48; /* Obsolete entry type */
572 break;
573 case dst_typ_const:
574 size = sizeof (DST_const (entry))
575 + DST_const (entry).value.length
576 - sizeof (DST_const (entry).value.val);
577 break;
578 case dst_typ_reference:
579 size = sizeof (DST_reference (entry));
580 break;
581 case dst_typ_old_record:
582 case dst_typ_old_union:
583 case dst_typ_record:
584 case dst_typ_union:
585 size = sizeof (DST_record (entry))
586 + ((int) DST_record (entry).nfields
587 - dst_dummy_array_size) * sizeof (dst_field_t);
588 break;
589 case dst_typ_aux_type_deriv:
590 size = sizeof (DST_aux_type_deriv (entry));
591 break;
592 case dst_typ_locpool:
593 size = sizeof (DST_locpool (entry))
594 + ((int) DST_locpool (entry).length -
595 dst_dummy_array_size);
596 break;
597 case dst_typ_variable:
598 size = sizeof (DST_variable (entry));
599 break;
600 case dst_typ_label:
601 size = sizeof (DST_label (entry));
602 break;
603 case dst_typ_entry:
604 size = sizeof (DST_entry (entry));
605 break;
606 case dst_typ_aux_lifetime:
607 size = sizeof (DST_aux_lifetime (entry));
608 break;
609 case dst_typ_aux_ptr_base:
610 size = sizeof (DST_aux_ptr_base (entry));
611 break;
612 case dst_typ_aux_src_range:
613 size = sizeof (DST_aux_src_range (entry));
614 break;
615 case dst_typ_aux_reg_val:
616 size = sizeof (DST_aux_reg_val (entry));
617 break;
618 case dst_typ_aux_unit_names:
619 size = sizeof (DST_aux_unit_names (entry))
620 + ((int) DST_aux_unit_names (entry).number_of_names
621 - dst_dummy_array_size) * sizeof (dst_rel_offset_t);
622 break;
623 case dst_typ_aux_sect_info:
624 size = sizeof (DST_aux_sect_info (entry))
625 + ((int) DST_aux_sect_info (entry).number_of_refs
626 - dst_dummy_array_size) * sizeof (dst_sect_ref_t);
627 break;
628 default:
629 size = -1;
630 break;
631 }
632 if (size == -1)
633 {
634 fprintf_unfiltered (gdb_stderr, "Warning: unexpected DST entry type (%d) found\nLast valid entry was of type: %d\n",
635 (int) entry->rec_type,
636 last_type);
637 fprintf_unfiltered (gdb_stderr, "Last unknown_3 value: %d\n", lu3);
638 size = 0;
639 }
640 else
641 last_type = entry->rec_type;
642 if (size & 1) /* Align on a word boundary */
643 size++;
644 size += 2;
645 *ret_entry = entry;
646 return size;
647 }
648
649 static int
650 next_dst_entry (char **buffer, dst_rec_ptr_t *entry, dst_sec *table)
651 {
652 if (*buffer - table->buffer >= table->size)
653 {
654 *entry = NULL;
655 return 0;
656 }
657 *buffer += get_dst_entry (*buffer, entry);
658 return 1;
659 }
660
661 #define NEXT_BLK(a, b) next_dst_entry(a, b, &blocks_info)
662 #define NEXT_SYM(a, b) next_dst_entry(a, b, &symbols_info)
663 #define DST_OFFSET(a, b) ((char *) (a) + (b))
664
665 static dst_rec_ptr_t section_table = NULL;
666
667 char *
668 get_sec_ref (dst_sect_ref_t *ref)
669 {
670 dst_sec *section = NULL;
671 long offset;
672
673 if (!section_table || !ref->sect_index)
674 return NULL;
675 offset = DST_section_tab (section_table).section_base[ref->sect_index - 1]
676 + ref->sect_offset;
677 if (offset >= blocks_info.base &&
678 offset < blocks_info.base + blocks_info.size)
679 section = &blocks_info;
680 else if (offset >= symbols_info.base &&
681 offset < symbols_info.base + symbols_info.size)
682 section = &symbols_info;
683 else if (offset >= lines_info.base &&
684 offset < lines_info.base + lines_info.size)
685 section = &lines_info;
686 if (!section)
687 return NULL;
688 return section->buffer + (offset - section->base);
689 }
690
691 CORE_ADDR
692 dst_get_addr (int section, long offset)
693 {
694 if (!section_table || !section)
695 return 0;
696 return DST_section_tab (section_table).section_base[section - 1] + offset;
697 }
698
699 CORE_ADDR
700 dst_sym_addr (dst_sect_ref_t *ref)
701 {
702 if (!section_table || !ref->sect_index)
703 return 0;
704 return DST_section_tab (section_table).section_base[ref->sect_index - 1]
705 + ref->sect_offset;
706 }
707
708 static struct type *
709 create_new_type (struct objfile *objfile)
710 {
711 struct type *type;
712
713 type = (struct type *)
714 obstack_alloc (&objfile->symbol_obstack, sizeof (struct type));
715 memset (type, 0, sizeof (struct type));
716 return type;
717 }
718
719 static struct symbol *
720 create_new_symbol (struct objfile *objfile, char *name)
721 {
722 struct symbol *sym = (struct symbol *)
723 obstack_alloc (&objfile->symbol_obstack, sizeof (struct symbol));
724 memset (sym, 0, sizeof (struct symbol));
725 SYMBOL_NAME (sym) = obsavestring (name, strlen (name),
726 &objfile->symbol_obstack);
727 SYMBOL_VALUE (sym) = 0;
728 SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
729
730 SYMBOL_CLASS (sym) = LOC_BLOCK;
731 return sym;
732 };
733
734 static struct type *decode_dst_type (struct objfile *, dst_rec_ptr_t);
735
736 static struct type *
737 decode_type_desc (struct objfile *objfile, dst_type_t *type_desc,
738 dst_rec_ptr_t base)
739 {
740 struct type *type;
741 dst_rec_ptr_t entry;
742 if (type_desc->std_type.user_defined_type)
743 {
744 entry = (dst_rec_ptr_t) DST_OFFSET (base,
745 dst_user_type_offset (*type_desc));
746 type = decode_dst_type (objfile, entry);
747 }
748 else
749 {
750 switch (type_desc->std_type.dtc)
751 {
752 case dst_int8_type:
753 type = builtin_type_signed_char;
754 break;
755 case dst_int16_type:
756 type = builtin_type_short;
757 break;
758 case dst_int32_type:
759 type = builtin_type_long;
760 break;
761 case dst_uint8_type:
762 type = builtin_type_unsigned_char;
763 break;
764 case dst_uint16_type:
765 type = builtin_type_unsigned_short;
766 break;
767 case dst_uint32_type:
768 type = builtin_type_unsigned_long;
769 break;
770 case dst_real32_type:
771 type = builtin_type_float;
772 break;
773 case dst_real64_type:
774 type = builtin_type_double;
775 break;
776 case dst_complex_type:
777 type = builtin_type_complex;
778 break;
779 case dst_dcomplex_type:
780 type = builtin_type_double_complex;
781 break;
782 case dst_bool8_type:
783 type = builtin_type_char;
784 break;
785 case dst_bool16_type:
786 type = builtin_type_short;
787 break;
788 case dst_bool32_type:
789 type = builtin_type_long;
790 break;
791 case dst_char_type:
792 type = builtin_type_char;
793 break;
794 /* The next few are more complex. I will take care
795 * of them properly at a later point.
796 */
797 case dst_string_type:
798 type = builtin_type_void;
799 break;
800 case dst_ptr_type:
801 type = builtin_type_void;
802 break;
803 case dst_set_type:
804 type = builtin_type_void;
805 break;
806 case dst_proc_type:
807 type = builtin_type_void;
808 break;
809 case dst_func_type:
810 type = builtin_type_void;
811 break;
812 /* Back tto some ordinary ones */
813 case dst_void_type:
814 type = builtin_type_void;
815 break;
816 case dst_uchar_type:
817 type = builtin_type_unsigned_char;
818 break;
819 default:
820 type = builtin_type_void;
821 break;
822 }
823 }
824 return type;
825 }
826
827 struct structure_list
828 {
829 struct structure_list *next;
830 struct type *type;
831 };
832
833 static struct structure_list *struct_list = NULL;
834
835 static struct type *
836 find_dst_structure (char *name)
837 {
838 struct structure_list *element;
839
840 for (element = struct_list; element; element = element->next)
841 if (!strcmp (name, TYPE_NAME (element->type)))
842 return element->type;
843 return NULL;
844 }
845
846
847 static struct type *
848 decode_dst_structure (struct objfile *objfile, dst_rec_ptr_t entry, int code,
849 int version)
850 {
851 struct type *type, *child_type;
852 char *struct_name;
853 char *name, *field_name;
854 int i;
855 int fieldoffset, fieldsize;
856 dst_type_t type_desc;
857 struct structure_list *element;
858
859 struct_name = DST_OFFSET (entry, DST_record (entry).noffset);
860 name = concat ((code == TYPE_CODE_UNION) ? "union " : "struct ",
861 struct_name, NULL);
862 type = find_dst_structure (name);
863 if (type)
864 {
865 xfree (name);
866 return type;
867 }
868 type = create_new_type (objfile);
869 TYPE_NAME (type) = obstack_copy0 (&objfile->symbol_obstack,
870 name, strlen (name));
871 xfree (name);
872 TYPE_CODE (type) = code;
873 TYPE_LENGTH (type) = DST_record (entry).size;
874 TYPE_NFIELDS (type) = DST_record (entry).nfields;
875 TYPE_FIELDS (type) = (struct field *)
876 obstack_alloc (&objfile->symbol_obstack, sizeof (struct field) *
877 DST_record (entry).nfields);
878 fieldoffset = fieldsize = 0;
879 INIT_CPLUS_SPECIFIC (type);
880 element = (struct structure_list *)
881 xmalloc (sizeof (struct structure_list));
882 element->type = type;
883 element->next = struct_list;
884 struct_list = element;
885 for (i = 0; i < DST_record (entry).nfields; i++)
886 {
887 switch (version)
888 {
889 case 2:
890 field_name = DST_OFFSET (entry,
891 DST_record (entry).f.ofields[i].noffset);
892 fieldoffset = DST_record (entry).f.ofields[i].foffset * 8 +
893 DST_record (entry).f.ofields[i].bit_offset;
894 fieldsize = DST_record (entry).f.ofields[i].size;
895 type_desc = DST_record (entry).f.ofields[i].type_desc;
896 break;
897 case 1:
898 field_name = DST_OFFSET (entry,
899 DST_record (entry).f.fields[i].noffset);
900 type_desc = DST_record (entry).f.fields[i].type_desc;
901 switch (DST_record (entry).f.fields[i].f.field_loc.format_tag)
902 {
903 case dst_field_byte:
904 fieldoffset = DST_record (entry).f.
905 fields[i].f.field_byte.offset * 8;
906 fieldsize = -1;
907 break;
908 case dst_field_bit:
909 fieldoffset = DST_record (entry).f.
910 fields[i].f.field_bit.byte_offset * 8 +
911 DST_record (entry).f.
912 fields[i].f.field_bit.bit_offset;
913 fieldsize = DST_record (entry).f.
914 fields[i].f.field_bit.nbits;
915 break;
916 case dst_field_loc:
917 fieldoffset += fieldsize;
918 fieldsize = -1;
919 break;
920 }
921 break;
922 case 0:
923 field_name = DST_OFFSET (entry,
924 DST_record (entry).f.sfields[i].noffset);
925 fieldoffset = DST_record (entry).f.sfields[i].foffset;
926 type_desc = DST_record (entry).f.sfields[i].type_desc;
927 if (i < DST_record (entry).nfields - 1)
928 fieldsize = DST_record (entry).f.sfields[i + 1].foffset;
929 else
930 fieldsize = DST_record (entry).size;
931 fieldsize -= fieldoffset;
932 fieldoffset *= 8;
933 fieldsize *= 8;
934 }
935 TYPE_FIELDS (type)[i].name =
936 obstack_copy0 (&objfile->symbol_obstack,
937 field_name, strlen (field_name));
938 TYPE_FIELDS (type)[i].type = decode_type_desc (objfile,
939 &type_desc,
940 entry);
941 if (fieldsize == -1)
942 fieldsize = TYPE_LENGTH (TYPE_FIELDS (type)[i].type) *
943 8;
944 TYPE_FIELDS (type)[i].bitsize = fieldsize;
945 TYPE_FIELDS (type)[i].bitpos = fieldoffset;
946 }
947 return type;
948 }
949
950 static struct type *
951 decode_dst_type (struct objfile *objfile, dst_rec_ptr_t entry)
952 {
953 struct type *child_type, *type, *range_type, *index_type;
954
955 switch (entry->rec_type)
956 {
957 case dst_typ_var:
958 return decode_type_desc (objfile,
959 &DST_var (entry).type_desc,
960 entry);
961 break;
962 case dst_typ_variable:
963 return decode_type_desc (objfile,
964 &DST_variable (entry).type_desc,
965 entry);
966 break;
967 case dst_typ_short_rec:
968 return decode_dst_structure (objfile, entry, TYPE_CODE_STRUCT, 0);
969 case dst_typ_short_union:
970 return decode_dst_structure (objfile, entry, TYPE_CODE_UNION, 0);
971 case dst_typ_union:
972 return decode_dst_structure (objfile, entry, TYPE_CODE_UNION, 1);
973 case dst_typ_record:
974 return decode_dst_structure (objfile, entry, TYPE_CODE_STRUCT, 1);
975 case dst_typ_old_union:
976 return decode_dst_structure (objfile, entry, TYPE_CODE_UNION, 2);
977 case dst_typ_old_record:
978 return decode_dst_structure (objfile, entry, TYPE_CODE_STRUCT, 2);
979 case dst_typ_pointer:
980 return make_pointer_type (
981 decode_type_desc (objfile,
982 &DST_pointer (entry).type_desc,
983 entry),
984 NULL);
985 case dst_typ_array:
986 child_type = decode_type_desc (objfile,
987 &DST_pointer (entry).type_desc,
988 entry);
989 index_type = lookup_fundamental_type (objfile,
990 FT_INTEGER);
991 range_type = create_range_type ((struct type *) NULL,
992 index_type, DST_array (entry).lo_bound,
993 DST_array (entry).hi_bound);
994 return create_array_type ((struct type *) NULL, child_type,
995 range_type);
996 case dst_typ_alias:
997 return decode_type_desc (objfile,
998 &DST_alias (entry).type_desc,
999 entry);
1000 default:
1001 return builtin_type_int;
1002 }
1003 }
1004
1005 struct symbol_list
1006 {
1007 struct symbol_list *next;
1008 struct symbol *symbol;
1009 };
1010
1011 static struct symbol_list *dst_global_symbols = NULL;
1012 static int total_globals = 0;
1013
1014 static void
1015 decode_dst_locstring (char *locstr, struct symbol *sym)
1016 {
1017 dst_loc_entry_t *entry, *next_entry;
1018 CORE_ADDR temp;
1019 int count = 0;
1020
1021 while (1)
1022 {
1023 if (count++ == 100)
1024 {
1025 fprintf_unfiltered (gdb_stderr, "Error reading locstring\n");
1026 break;
1027 }
1028 entry = (dst_loc_entry_t *) locstr;
1029 next_entry = (dst_loc_entry_t *) (locstr + 1);
1030 switch (entry->header.code)
1031 {
1032 case dst_lsc_end: /* End of string */
1033 return;
1034 case dst_lsc_indirect: /* Indirect through previous. Arg == 6 */
1035 /* Or register ax x == arg */
1036 if (entry->header.arg < 6)
1037 {
1038 SYMBOL_CLASS (sym) = LOC_REGISTER;
1039 SYMBOL_VALUE (sym) = entry->header.arg + 8;
1040 }
1041 /* We predict indirects */
1042 locstr++;
1043 break;
1044 case dst_lsc_dreg:
1045 SYMBOL_CLASS (sym) = LOC_REGISTER;
1046 SYMBOL_VALUE (sym) = entry->header.arg;
1047 locstr++;
1048 break;
1049 case dst_lsc_section: /* Section (arg+1) */
1050 SYMBOL_VALUE (sym) = dst_get_addr (entry->header.arg + 1, 0);
1051 locstr++;
1052 break;
1053 case dst_lsc_sec_byte: /* Section (next_byte+1) */
1054 SYMBOL_VALUE (sym) = dst_get_addr (locstr[1] + 1, 0);
1055 locstr += 2;
1056 break;
1057 case dst_lsc_add: /* Add (arg+1)*2 */
1058 case dst_lsc_sub: /* Subtract (arg+1)*2 */
1059 temp = (entry->header.arg + 1) * 2;
1060 locstr++;
1061 if (*locstr == dst_multiply_256)
1062 {
1063 temp <<= 8;
1064 locstr++;
1065 }
1066 switch (entry->header.code)
1067 {
1068 case dst_lsc_add:
1069 if (SYMBOL_CLASS (sym) == LOC_LOCAL)
1070 SYMBOL_CLASS (sym) = LOC_ARG;
1071 SYMBOL_VALUE (sym) += temp;
1072 break;
1073 case dst_lsc_sub:
1074 SYMBOL_VALUE (sym) -= temp;
1075 break;
1076 }
1077 break;
1078 case dst_lsc_add_byte:
1079 case dst_lsc_sub_byte:
1080 switch (entry->header.arg & 0x03)
1081 {
1082 case 1:
1083 temp = (unsigned char) locstr[1];
1084 locstr += 2;
1085 break;
1086 case 2:
1087 temp = *(unsigned short *) (locstr + 1);
1088 locstr += 3;
1089 break;
1090 case 3:
1091 temp = *(unsigned long *) (locstr + 1);
1092 locstr += 5;
1093 break;
1094 }
1095 if (*locstr == dst_multiply_256)
1096 {
1097 temp <<= 8;
1098 locstr++;
1099 }
1100 switch (entry->header.code)
1101 {
1102 case dst_lsc_add_byte:
1103 if (SYMBOL_CLASS (sym) == LOC_LOCAL)
1104 SYMBOL_CLASS (sym) = LOC_ARG;
1105 SYMBOL_VALUE (sym) += temp;
1106 break;
1107 case dst_lsc_sub_byte:
1108 SYMBOL_VALUE (sym) -= temp;
1109 break;
1110 }
1111 break;
1112 case dst_lsc_sbreg: /* Stack base register (frame pointer). Arg==0 */
1113 if (next_entry->header.code != dst_lsc_indirect)
1114 {
1115 SYMBOL_VALUE (sym) = 0;
1116 SYMBOL_CLASS (sym) = LOC_STATIC;
1117 return;
1118 }
1119 SYMBOL_VALUE (sym) = 0;
1120 SYMBOL_CLASS (sym) = LOC_LOCAL;
1121 locstr++;
1122 break;
1123 default:
1124 SYMBOL_VALUE (sym) = 0;
1125 SYMBOL_CLASS (sym) = LOC_STATIC;
1126 return;
1127 }
1128 }
1129 }
1130
1131 static struct symbol_list *
1132 process_dst_symbols (struct objfile *objfile, dst_rec_ptr_t entry, char *name,
1133 int *nsyms_ret)
1134 {
1135 struct symbol_list *list = NULL, *element;
1136 struct symbol *sym;
1137 char *symname;
1138 int nsyms = 0;
1139 char *location;
1140 long line;
1141 dst_type_t symtype;
1142 struct type *type;
1143 dst_var_attr_t attr;
1144 dst_var_loc_t loc_type;
1145 unsigned loc_index;
1146 long loc_value;
1147
1148 if (!entry)
1149 {
1150 *nsyms_ret = 0;
1151 return NULL;
1152 }
1153 location = (char *) entry;
1154 while (NEXT_SYM (&location, &entry) &&
1155 entry->rec_type != dst_typ_end_scope)
1156 {
1157 if (entry->rec_type == dst_typ_var)
1158 {
1159 if (DST_var (entry).short_locs)
1160 {
1161 loc_type = DST_var (entry).locs.shorts[0].loc_type;
1162 loc_index = DST_var (entry).locs.shorts[0].loc_index;
1163 loc_value = DST_var (entry).locs.shorts[0].location;
1164 }
1165 else
1166 {
1167 loc_type = DST_var (entry).locs.longs[0].loc_type;
1168 loc_index = DST_var (entry).locs.longs[0].loc_index;
1169 loc_value = DST_var (entry).locs.longs[0].location;
1170 }
1171 if (loc_type == dst_var_loc_external)
1172 continue;
1173 symname = DST_OFFSET (entry, DST_var (entry).noffset);
1174 line = DST_var (entry).src_loc.line_number;
1175 symtype = DST_var (entry).type_desc;
1176 attr = DST_var (entry).attributes;
1177 }
1178 else if (entry->rec_type == dst_typ_variable)
1179 {
1180 symname = DST_OFFSET (entry,
1181 DST_variable (entry).noffset);
1182 line = DST_variable (entry).src_loc.line_number;
1183 symtype = DST_variable (entry).type_desc;
1184 attr = DST_variable (entry).attributes;
1185 }
1186 else
1187 {
1188 continue;
1189 }
1190 if (symname && name && !strcmp (symname, name))
1191 /* It's the function return value */
1192 continue;
1193 sym = create_new_symbol (objfile, symname);
1194
1195 if ((attr & (1 << dst_var_attr_global)) ||
1196 (attr & (1 << dst_var_attr_static)))
1197 SYMBOL_CLASS (sym) = LOC_STATIC;
1198 else
1199 SYMBOL_CLASS (sym) = LOC_LOCAL;
1200 SYMBOL_LINE (sym) = line;
1201 SYMBOL_TYPE (sym) = decode_type_desc (objfile, &symtype,
1202 entry);
1203 SYMBOL_VALUE (sym) = 0;
1204 switch (entry->rec_type)
1205 {
1206 case dst_typ_var:
1207 switch (loc_type)
1208 {
1209 case dst_var_loc_abs:
1210 SYMBOL_VALUE_ADDRESS (sym) = loc_value;
1211 break;
1212 case dst_var_loc_sect_off:
1213 case dst_var_loc_ind_sect_off: /* What is this? */
1214 SYMBOL_VALUE_ADDRESS (sym) = dst_get_addr (
1215 loc_index,
1216 loc_value);
1217 break;
1218 case dst_var_loc_ind_reg_rel: /* What is this? */
1219 case dst_var_loc_reg_rel:
1220 /* If it isn't fp relative, specify the
1221 * register it's relative to.
1222 */
1223 if (loc_index)
1224 {
1225 sym->aux_value.basereg = loc_index;
1226 }
1227 SYMBOL_VALUE (sym) = loc_value;
1228 if (loc_value > 0 &&
1229 SYMBOL_CLASS (sym) == LOC_BASEREG)
1230 SYMBOL_CLASS (sym) = LOC_BASEREG_ARG;
1231 break;
1232 case dst_var_loc_reg:
1233 SYMBOL_VALUE (sym) = loc_index;
1234 SYMBOL_CLASS (sym) = LOC_REGISTER;
1235 break;
1236 }
1237 break;
1238 case dst_typ_variable:
1239 /* External variable..... don't try to interpret
1240 * its nonexistant locstring.
1241 */
1242 if (DST_variable (entry).loffset == -1)
1243 continue;
1244 decode_dst_locstring (DST_OFFSET (entry,
1245 DST_variable (entry).loffset),
1246 sym);
1247 }
1248 element = (struct symbol_list *)
1249 xmalloc (sizeof (struct symbol_list));
1250
1251 if (attr & (1 << dst_var_attr_global))
1252 {
1253 element->next = dst_global_symbols;
1254 dst_global_symbols = element;
1255 total_globals++;
1256 }
1257 else
1258 {
1259 element->next = list;
1260 list = element;
1261 nsyms++;
1262 }
1263 element->symbol = sym;
1264 }
1265 *nsyms_ret = nsyms;
1266 return list;
1267 }
1268
1269
1270 static struct symbol *
1271 process_dst_function (struct objfile *objfile, dst_rec_ptr_t entry, char *name,
1272 CORE_ADDR address)
1273 {
1274 struct symbol *sym;
1275 struct type *type, *ftype;
1276 dst_rec_ptr_t sym_entry, typ_entry;
1277 char *location;
1278 struct symbol_list *element;
1279
1280 type = builtin_type_int;
1281 sym = create_new_symbol (objfile, name);
1282 SYMBOL_CLASS (sym) = LOC_BLOCK;
1283
1284 if (entry)
1285 {
1286 location = (char *) entry;
1287 do
1288 {
1289 NEXT_SYM (&location, &sym_entry);
1290 }
1291 while (sym_entry && sym_entry->rec_type != dst_typ_signature);
1292
1293 if (sym_entry)
1294 {
1295 SYMBOL_LINE (sym) =
1296 DST_signature (sym_entry).src_loc.line_number;
1297 if (DST_signature (sym_entry).result)
1298 {
1299 typ_entry = (dst_rec_ptr_t)
1300 DST_OFFSET (sym_entry,
1301 DST_signature (sym_entry).result);
1302 type = decode_dst_type (objfile, typ_entry);
1303 }
1304 }
1305 }
1306
1307 if (!type->function_type)
1308 {
1309 ftype = create_new_type (objfile);
1310 type->function_type = ftype;
1311 ftype->target_type = type;
1312 ftype->code = TYPE_CODE_FUNC;
1313 }
1314 SYMBOL_TYPE (sym) = type->function_type;
1315
1316 /* Now add ourselves to the global symbols list */
1317 element = (struct symbol_list *)
1318 xmalloc (sizeof (struct symbol_list));
1319
1320 element->next = dst_global_symbols;
1321 dst_global_symbols = element;
1322 total_globals++;
1323 element->symbol = sym;
1324
1325 return sym;
1326 }
1327
1328 static struct block *
1329 process_dst_block (struct objfile *objfile, dst_rec_ptr_t entry)
1330 {
1331 struct block *block;
1332 struct symbol *function = NULL;
1333 CORE_ADDR address;
1334 long size;
1335 char *name;
1336 dst_rec_ptr_t child_entry, symbol_entry;
1337 struct block *child_block;
1338 int total_symbols = 0;
1339 char fake_name[20];
1340 static long fake_seq = 0;
1341 struct symbol_list *symlist, *nextsym;
1342 int symnum;
1343
1344 if (DST_block (entry).noffset)
1345 name = DST_OFFSET (entry, DST_block (entry).noffset);
1346 else
1347 name = NULL;
1348 if (DST_block (entry).n_of_code_ranges)
1349 {
1350 address = dst_sym_addr (
1351 &DST_block (entry).code_ranges[0].code_start);
1352 size = DST_block (entry).code_ranges[0].code_size;
1353 }
1354 else
1355 {
1356 address = -1;
1357 size = 0;
1358 }
1359 symbol_entry = (dst_rec_ptr_t) get_sec_ref (&DST_block (entry).symbols_start);
1360 switch (DST_block (entry).block_type)
1361 {
1362 /* These are all really functions. Even the "program" type.
1363 * This is because the Apollo OS was written in Pascal, and
1364 * in Pascal, the main procedure is described as the Program.
1365 * Cute, huh?
1366 */
1367 case dst_block_procedure:
1368 case dst_block_function:
1369 case dst_block_subroutine:
1370 case dst_block_program:
1371 prim_record_minimal_symbol (name, address, mst_text, objfile);
1372 function = process_dst_function (
1373 objfile,
1374 symbol_entry,
1375 name,
1376 address);
1377 enter_all_lines (get_sec_ref (&DST_block (entry).code_ranges[0].lines_start), address);
1378 break;
1379 case dst_block_block_data:
1380 break;
1381
1382 default:
1383 /* GDB has to call it something, and the module name
1384 * won't cut it
1385 */
1386 sprintf (fake_name, "block_%08lx", fake_seq++);
1387 function = process_dst_function (
1388 objfile, NULL, fake_name, address);
1389 break;
1390 }
1391 symlist = process_dst_symbols (objfile, symbol_entry,
1392 name, &total_symbols);
1393 block = (struct block *)
1394 obstack_alloc (&objfile->symbol_obstack,
1395 sizeof (struct block) +
1396 (total_symbols - 1) * sizeof (struct symbol *));
1397
1398 symnum = 0;
1399 while (symlist)
1400 {
1401 nextsym = symlist->next;
1402
1403 block->sym[symnum] = symlist->symbol;
1404
1405 xfree (symlist);
1406 symlist = nextsym;
1407 symnum++;
1408 }
1409 BLOCK_NSYMS (block) = total_symbols;
1410 BLOCK_START (block) = address;
1411 BLOCK_END (block) = address + size;
1412 BLOCK_SUPERBLOCK (block) = 0;
1413 if (function)
1414 {
1415 SYMBOL_BLOCK_VALUE (function) = block;
1416 BLOCK_FUNCTION (block) = function;
1417 }
1418 else
1419 BLOCK_FUNCTION (block) = 0;
1420
1421 if (DST_block (entry).child_block_off)
1422 {
1423 child_entry = (dst_rec_ptr_t) DST_OFFSET (entry,
1424 DST_block (entry).child_block_off);
1425 while (child_entry)
1426 {
1427 child_block = process_dst_block (objfile, child_entry);
1428 if (child_block)
1429 {
1430 if (BLOCK_START (child_block) <
1431 BLOCK_START (block) ||
1432 BLOCK_START (block) == -1)
1433 BLOCK_START (block) =
1434 BLOCK_START (child_block);
1435 if (BLOCK_END (child_block) >
1436 BLOCK_END (block) ||
1437 BLOCK_END (block) == -1)
1438 BLOCK_END (block) =
1439 BLOCK_END (child_block);
1440 BLOCK_SUPERBLOCK (child_block) = block;
1441 }
1442 if (DST_block (child_entry).sibling_block_off)
1443 child_entry = (dst_rec_ptr_t) DST_OFFSET (
1444 child_entry,
1445 DST_block (child_entry).sibling_block_off);
1446 else
1447 child_entry = NULL;
1448 }
1449 }
1450 record_pending_block (objfile, block, NULL);
1451 return block;
1452 }
1453
1454
1455 static void
1456 read_dst_symtab (struct objfile *objfile)
1457 {
1458 char *buffer;
1459 dst_rec_ptr_t entry, file_table, root_block;
1460 char *source_file;
1461 struct block *block, *global_block;
1462 int symnum;
1463 struct symbol_list *nextsym;
1464 int module_num = 0;
1465 struct structure_list *element;
1466
1467 current_objfile = objfile;
1468 buffer = blocks_info.buffer;
1469 while (NEXT_BLK (&buffer, &entry))
1470 {
1471 if (entry->rec_type == dst_typ_comp_unit)
1472 {
1473 file_table = (dst_rec_ptr_t) DST_OFFSET (entry,
1474 DST_comp_unit (entry).file_table);
1475 section_table = (dst_rec_ptr_t) DST_OFFSET (entry,
1476 DST_comp_unit (entry).section_table);
1477 root_block = (dst_rec_ptr_t) DST_OFFSET (entry,
1478 DST_comp_unit (entry).root_block_offset);
1479 source_file = DST_OFFSET (file_table,
1480 DST_file_tab (file_table).files[0].noffset);
1481 /* Point buffer to the start of the next comp_unit */
1482 buffer = DST_OFFSET (entry,
1483 DST_comp_unit (entry).data_size);
1484 dst_start_symtab ();
1485
1486 block = process_dst_block (objfile, root_block);
1487
1488 global_block = (struct block *)
1489 obstack_alloc (&objfile->symbol_obstack,
1490 sizeof (struct block) +
1491 (total_globals - 1) *
1492 sizeof (struct symbol *));
1493 BLOCK_NSYMS (global_block) = total_globals;
1494 for (symnum = 0; symnum < total_globals; symnum++)
1495 {
1496 nextsym = dst_global_symbols->next;
1497
1498 global_block->sym[symnum] =
1499 dst_global_symbols->symbol;
1500
1501 xfree (dst_global_symbols);
1502 dst_global_symbols = nextsym;
1503 }
1504 dst_global_symbols = NULL;
1505 total_globals = 0;
1506 BLOCK_FUNCTION (global_block) = 0;
1507 BLOCK_START (global_block) = BLOCK_START (block);
1508 BLOCK_END (global_block) = BLOCK_END (block);
1509 BLOCK_SUPERBLOCK (global_block) = 0;
1510 BLOCK_SUPERBLOCK (block) = global_block;
1511 record_pending_block (objfile, global_block, NULL);
1512
1513 complete_symtab (source_file,
1514 BLOCK_START (block),
1515 BLOCK_END (block) - BLOCK_START (block));
1516 module_num++;
1517 dst_end_symtab (objfile);
1518 }
1519 }
1520 if (module_num)
1521 prim_record_minimal_symbol ("<end_of_program>",
1522 BLOCK_END (block), mst_text, objfile);
1523 /* One more faked symbol to make sure nothing can ever run off the
1524 * end of the symbol table. This one represents the end of the
1525 * text space. It used to be (CORE_ADDR) -1 (effectively the highest
1526 * int possible), but some parts of gdb treated it as a signed
1527 * number and failed comparisons. We could equally use 7fffffff,
1528 * but no functions are ever mapped to an address higher than
1529 * 40000000
1530 */
1531 prim_record_minimal_symbol ("<end_of_text>",
1532 (CORE_ADDR) 0x40000000,
1533 mst_text, objfile);
1534 while (struct_list)
1535 {
1536 element = struct_list;
1537 struct_list = element->next;
1538 xfree (element);
1539 }
1540 }
1541 \f
1542
1543 /* Support for line number handling */
1544 static char *linetab = NULL;
1545 static long linetab_offset;
1546 static unsigned long linetab_size;
1547
1548 /* Read in all the line numbers for fast lookups later. Leave them in
1549 external (unswapped) format in memory; we'll swap them as we enter
1550 them into GDB's data structures. */
1551 static int
1552 init_one_section (int chan, dst_sec *secinfo)
1553 {
1554 if (secinfo->size == 0
1555 || lseek (chan, secinfo->position, 0) == -1
1556 || (secinfo->buffer = xmalloc (secinfo->size)) == NULL
1557 || myread (chan, secinfo->buffer, secinfo->size) == -1)
1558 return 0;
1559 else
1560 return 1;
1561 }
1562
1563 static int
1564 init_dst_sections (int chan)
1565 {
1566
1567 if (!init_one_section (chan, &blocks_info) ||
1568 !init_one_section (chan, &lines_info) ||
1569 !init_one_section (chan, &symbols_info))
1570 return -1;
1571 else
1572 return 0;
1573 }
1574
1575 /* Fake up support for relocating symbol addresses. FIXME. */
1576
1577 struct section_offsets dst_symfile_faker =
1578 {0};
1579
1580 void
1581 dst_symfile_offsets (struct objfile *objfile, struct section_addr_info *addrs)
1582 {
1583 objfile->num_sections = 1;
1584 objfile->section_offsets = &dst_symfile_faker;
1585 }
1586
1587 /* Register our ability to parse symbols for DST BFD files */
1588
1589 static struct sym_fns dst_sym_fns =
1590 {
1591 /* FIXME: Can this be integrated with coffread.c? If not, should it be
1592 a separate flavour like ecoff? */
1593 (enum bfd_flavour) -2,
1594
1595 dst_new_init, /* sym_new_init: init anything gbl to entire symtab */
1596 dst_symfile_init, /* sym_init: read initial info, setup for sym_read() */
1597 dst_symfile_read, /* sym_read: read a symbol file into symtab */
1598 dst_symfile_finish, /* sym_finish: finished with file, cleanup */
1599 dst_symfile_offsets, /* sym_offsets: xlate external to internal form */
1600 NULL /* next: pointer to next struct sym_fns */
1601 };
1602
1603 void
1604 _initialize_dstread (void)
1605 {
1606 add_symtab_fns (&dst_sym_fns);
1607 }
This page took 0.077869 seconds and 4 git commands to generate.