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