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