/* Read apollo DST symbol tables and convert to internal format, for GDB.
   Contributed by Troy Rollo, University of NSW (troy@cbme.unsw.edu.au).
   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000
   Free Software Foundation, Inc.

   This file is part of GDB.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place - Suite 330,
   Boston, MA 02111-1307, USA.  */

#include "defs.h"
#include "symtab.h"
#include "gdbtypes.h"
#include "breakpoint.h"
#include "bfd.h"
#include "symfile.h"
#include "objfiles.h"
#include "buildsym.h"
#include "obstack.h"

#include "gdb_string.h"

#include "dst.h"

CORE_ADDR cur_src_start_addr, cur_src_end_addr;
dst_sec blocks_info, lines_info, symbols_info;

/* Vector of line number information.  */

static struct linetable *line_vector;

/* Index of next entry to go in line_vector_index.  */

static int line_vector_index;

/* Last line number recorded in the line vector.  */

static int prev_line_number;

/* Number of elements allocated for line_vector currently.  */

static int line_vector_length;

static int init_dst_sections (int);

static void read_dst_symtab (struct objfile *);

static void find_dst_sections (bfd *, sec_ptr, PTR);

static void dst_symfile_init (struct objfile *);

static void dst_new_init (struct objfile *);

static void dst_symfile_read (struct objfile *, int);

static void dst_symfile_finish (struct objfile *);

static void dst_end_symtab (struct objfile *);

static void complete_symtab (char *, CORE_ADDR, unsigned int);

static void dst_start_symtab (void);

static void dst_record_line (int, CORE_ADDR);

/* Manage the vector of line numbers.  */
/* FIXME: Use record_line instead.  */

static void
dst_record_line (int line, CORE_ADDR pc)
{
  struct linetable_entry *e;
  /* Make sure line vector is big enough.  */

  if (line_vector_index + 2 >= line_vector_length)
    {
      line_vector_length *= 2;
      line_vector = (struct linetable *)
	xrealloc ((char *) line_vector, sizeof (struct linetable)
		  + (line_vector_length
		     * sizeof (struct linetable_entry)));
    }

  e = line_vector->item + line_vector_index++;
  e->line = line;
  e->pc = pc;
}

/* Start a new symtab for a new source file.
   It indicates the start of data for one original source file.  */
/* FIXME: use start_symtab, like coffread.c now does.  */

static void
dst_start_symtab (void)
{
  /* Initialize the source file line number information for this file.  */

  if (line_vector)		/* Unlikely, but maybe possible? */
    xfree (line_vector);
  line_vector_index = 0;
  line_vector_length = 1000;
  prev_line_number = -2;	/* Force first line number to be explicit */
  line_vector = (struct linetable *)
    xmalloc (sizeof (struct linetable)
	     + line_vector_length * sizeof (struct linetable_entry));
}

/* Save the vital information from when starting to read a file,
   for use when closing off the current file.
   NAME is the file name the symbols came from, START_ADDR is the first
   text address for the file, and SIZE is the number of bytes of text.  */

static void
complete_symtab (char *name, CORE_ADDR start_addr, unsigned int size)
{
  last_source_file = savestring (name, strlen (name));
  cur_src_start_addr = start_addr;
  cur_src_end_addr = start_addr + size;

  if (current_objfile->ei.entry_point >= cur_src_start_addr &&
      current_objfile->ei.entry_point < cur_src_end_addr)
    {
      current_objfile->ei.entry_file_lowpc = cur_src_start_addr;
      current_objfile->ei.entry_file_highpc = cur_src_end_addr;
    }
}

/* Finish the symbol definitions for one main source file,
   close off all the lexical contexts for that file
   (creating struct block's for them), then make the
   struct symtab for that file and put it in the list of all such. */
/* FIXME: Use end_symtab, like coffread.c now does.  */

static void
dst_end_symtab (struct objfile *objfile)
{
  register struct symtab *symtab;
  register struct blockvector *blockvector;
  register struct linetable *lv;

  /* Create the blockvector that points to all the file's blocks.  */

  blockvector = make_blockvector (objfile);

  /* Now create the symtab object for this source file.  */
  symtab = allocate_symtab (last_source_file, objfile);

  /* Fill in its components.  */
  symtab->blockvector = blockvector;
  symtab->free_code = free_linetable;
  symtab->free_ptr = 0;
  symtab->filename = last_source_file;
  symtab->dirname = NULL;
  symtab->debugformat = obsavestring ("Apollo DST", 10,
				      &objfile->symbol_obstack);
  lv = line_vector;
  lv->nitems = line_vector_index;
  symtab->linetable = (struct linetable *)
    xrealloc ((char *) lv, (sizeof (struct linetable)
			    + lv->nitems * sizeof (struct linetable_entry)));

  free_named_symtabs (symtab->filename);

  /* Reinitialize for beginning of new file. */
  line_vector = 0;
  line_vector_length = -1;
  last_source_file = NULL;
}

/* dst_symfile_init ()
   is the dst-specific initialization routine for reading symbols.

   We will only be called if this is a DST or DST-like file.
   BFD handles figuring out the format of the file, and code in symtab.c
   uses BFD's determination to vector to us.

   The ultimate result is a new symtab (or, FIXME, eventually a psymtab).  */

static void
dst_symfile_init (struct objfile *objfile)
{
  asection *section;
  bfd *abfd = objfile->obfd;

  init_entry_point_info (objfile);

}

/* This function is called for every section; it finds the outer limits
   of the line table (minimum and maximum file offset) so that the
   mainline code can read the whole thing for efficiency.  */

/* ARGSUSED */
static void
find_dst_sections (bfd *abfd, sec_ptr asect, PTR vpinfo)
{
  int size, count;
  long base;
  file_ptr offset, maxoff;
  dst_sec *section;

/* WARNING WILL ROBINSON!  ACCESSING BFD-PRIVATE DATA HERE!  FIXME!  */
  size = asect->_raw_size;
  offset = asect->filepos;
  base = asect->vma;
/* End of warning */

  section = NULL;
  if (!strcmp (asect->name, ".blocks"))
    section = &blocks_info;
  else if (!strcmp (asect->name, ".lines"))
    section = &lines_info;
  else if (!strcmp (asect->name, ".symbols"))
    section = &symbols_info;
  if (!section)
    return;
  section->size = size;
  section->position = offset;
  section->base = base;
}


/* The BFD for this file -- only good while we're actively reading
   symbols into a psymtab or a symtab.  */

static bfd *symfile_bfd;

/* Read a symbol file, after initialization by dst_symfile_init.  */
/* FIXME!  Addr and Mainline are not used yet -- this will not work for
   shared libraries or add_file!  */

/* ARGSUSED */
static void
dst_symfile_read (struct objfile *objfile, int mainline)
{
  bfd *abfd = objfile->obfd;
  char *name = bfd_get_filename (abfd);
  int desc;
  register int val;
  int num_symbols;
  int symtab_offset;
  int stringtab_offset;

  symfile_bfd = abfd;		/* Kludge for swap routines */

/* WARNING WILL ROBINSON!  ACCESSING BFD-PRIVATE DATA HERE!  FIXME!  */
  desc = fileno ((FILE *) (abfd->iostream));	/* File descriptor */

  /* Read the line number table, all at once.  */
  bfd_map_over_sections (abfd, find_dst_sections, (PTR) NULL);

  val = init_dst_sections (desc);
  if (val < 0)
    error ("\"%s\": error reading debugging symbol tables\n", name);

  init_minimal_symbol_collection ();
  make_cleanup_discard_minimal_symbols ();

  /* Now that the executable file is positioned at symbol table,
     process it and define symbols accordingly.  */

  read_dst_symtab (objfile);

  /* Sort symbols alphabetically within each block.  */

  {
    struct symtab *s;
    for (s = objfile->symtabs; s != NULL; s = s->next)
      {
	sort_symtab_syms (s);
      }
  }

  /* Install any minimal symbols that have been collected as the current
     minimal symbols for this objfile. */

  install_minimal_symbols (objfile);
}

static void
dst_new_init (struct objfile *ignore)
{
  /* Nothin' to do */
}

/* Perform any local cleanups required when we are done with a particular
   objfile.  I.E, we are in the process of discarding all symbol information
   for an objfile, freeing up all memory held for it, and unlinking the
   objfile struct from the global list of known objfiles. */

static void
dst_symfile_finish (struct objfile *objfile)
{
  /* Nothing to do */
}


/* Get the next line number from the DST. Returns 0 when we hit an
 * end directive or cannot continue for any other reason.
 *
 * Note that ordinary pc deltas are multiplied by two. Apparently
 * this is what was really intended.
 */
static int
get_dst_line (signed char **buffer, long *pc)
{
  static last_pc = 0;
  static long last_line = 0;
  static int last_file = 0;
  dst_ln_entry_ptr_t entry;
  int size;
  dst_src_loc_t *src_loc;

  if (*pc != -1)
    {
      last_pc = *pc;
      *pc = -1;
    }
  entry = (dst_ln_entry_ptr_t) * buffer;

  while (dst_ln_ln_delta (*entry) == dst_ln_escape_flag)
    {
      switch (entry->esc.esc_code)
	{
	case dst_ln_pad:
	  size = 1;		/* pad byte */
	  break;
	case dst_ln_file:
	  /* file escape.  Next 4 bytes are a dst_src_loc_t */
	  size = 5;
	  src_loc = (dst_src_loc_t *) (*buffer + 1);
	  last_line = src_loc->line_number;
	  last_file = src_loc->file_index;
	  break;
	case dst_ln_dln1_dpc1:
	  /* 1 byte line delta, 1 byte pc delta */
	  last_line += (*buffer)[1];
	  last_pc += 2 * (unsigned char) (*buffer)[2];
	  dst_record_line (last_line, last_pc);
	  size = 3;
	  break;
	case dst_ln_dln2_dpc2:
	  /* 2 bytes line delta, 2 bytes pc delta */
	  last_line += *(short *) (*buffer + 1);
	  last_pc += 2 * (*(short *) (*buffer + 3));
	  size = 5;
	  dst_record_line (last_line, last_pc);
	  break;
	case dst_ln_ln4_pc4:
	  /* 4 bytes ABSOLUTE line number, 4 bytes ABSOLUTE pc */
	  last_line = *(unsigned long *) (*buffer + 1);
	  last_pc = *(unsigned long *) (*buffer + 5);
	  size = 9;
	  dst_record_line (last_line, last_pc);
	  break;
	case dst_ln_dln1_dpc0:
	  /* 1 byte line delta, pc delta = 0 */
	  size = 2;
	  last_line += (*buffer)[1];
	  break;
	case dst_ln_ln_off_1:
	  /* statement escape, stmt # = 1 (2nd stmt on line) */
	  size = 1;
	  break;
	case dst_ln_ln_off:
	  /* statement escape, stmt # = next byte */
	  size = 2;
	  break;
	case dst_ln_entry:
	  /* entry escape, next byte is entry number */
	  size = 2;
	  break;
	case dst_ln_exit:
	  /* exit escape */
	  size = 1;
	  break;
	case dst_ln_stmt_end:
	  /* gap escape, 4 bytes pc delta */
	  size = 5;
	  /* last_pc += 2 * (*(long *) (*buffer + 1)); */
	  /* Apparently this isn't supposed to actually modify
	   * the pc value. Totally weird.
	   */
	  break;
	case dst_ln_escape_11:
	case dst_ln_escape_12:
	case dst_ln_escape_13:
	  size = 1;
	  break;
	case dst_ln_nxt_byte:
	  /* This shouldn't happen. If it does, we're SOL */
	  return 0;
	  break;
	case dst_ln_end:
	  /* end escape, final entry follows */
	  return 0;
	}
      *buffer += (size < 0) ? -size : size;
      entry = (dst_ln_entry_ptr_t) * buffer;
    }
  last_line += dst_ln_ln_delta (*entry);
  last_pc += entry->delta.pc_delta * 2;
  (*buffer)++;
  dst_record_line (last_line, last_pc);
  return 1;
}

static void
enter_all_lines (char *buffer, long address)
{
  if (buffer)
    while (get_dst_line (&buffer, &address));
}

static int
get_dst_entry (char *buffer, dst_rec_ptr_t *ret_entry)
{
  int size;
  dst_rec_ptr_t entry;
  static int last_type;
  int ar_size;
  static unsigned lu3;

  entry = (dst_rec_ptr_t) buffer;
  switch (entry->rec_type)
    {
    case dst_typ_pad:
      size = 0;
      break;
    case dst_typ_comp_unit:
      size = sizeof (DST_comp_unit (entry));
      break;
    case dst_typ_section_tab:
      size = sizeof (DST_section_tab (entry))
	+ ((int) DST_section_tab (entry).number_of_sections
	   - dst_dummy_array_size) * sizeof (long);
      break;
    case dst_typ_file_tab:
      size = sizeof (DST_file_tab (entry))
	+ ((int) DST_file_tab (entry).number_of_files
	   - dst_dummy_array_size) * sizeof (dst_file_desc_t);
      break;
    case dst_typ_block:
      size = sizeof (DST_block (entry))
	+ ((int) DST_block (entry).n_of_code_ranges
	   - dst_dummy_array_size) * sizeof (dst_code_range_t);
      break;
    case dst_typ_5:
      size = -1;
      break;
    case dst_typ_var:
      size = sizeof (DST_var (entry)) -
	sizeof (dst_var_loc_long_t) * dst_dummy_array_size +
	DST_var (entry).no_of_locs *
	(DST_var (entry).short_locs ?
	 sizeof (dst_var_loc_short_t) :
	 sizeof (dst_var_loc_long_t));
      break;
    case dst_typ_pointer:
      size = sizeof (DST_pointer (entry));
      break;
    case dst_typ_array:
      size = sizeof (DST_array (entry));
      break;
    case dst_typ_subrange:
      size = sizeof (DST_subrange (entry));
      break;
    case dst_typ_set:
      size = sizeof (DST_set (entry));
      break;
    case dst_typ_implicit_enum:
      size = sizeof (DST_implicit_enum (entry))
	+ ((int) DST_implicit_enum (entry).nelems
	   - dst_dummy_array_size) * sizeof (dst_rel_offset_t);
      break;
    case dst_typ_explicit_enum:
      size = sizeof (DST_explicit_enum (entry))
	+ ((int) DST_explicit_enum (entry).nelems
	   - dst_dummy_array_size) * sizeof (dst_enum_elem_t);
      break;
    case dst_typ_short_rec:
      size = sizeof (DST_short_rec (entry))
	+ DST_short_rec (entry).nfields * sizeof (dst_short_field_t)
	- dst_dummy_array_size * sizeof (dst_field_t);
      break;
    case dst_typ_short_union:
      size = sizeof (DST_short_union (entry))
	+ DST_short_union (entry).nfields * sizeof (dst_short_field_t)
	- dst_dummy_array_size * sizeof (dst_field_t);
      break;
    case dst_typ_file:
      size = sizeof (DST_file (entry));
      break;
    case dst_typ_offset:
      size = sizeof (DST_offset (entry));
      break;
    case dst_typ_alias:
      size = sizeof (DST_alias (entry));
      break;
    case dst_typ_signature:
      size = sizeof (DST_signature (entry)) +
	((int) DST_signature (entry).nargs -
	 dst_dummy_array_size) * sizeof (dst_arg_t);
      break;
    case dst_typ_21:
      size = -1;
      break;
    case dst_typ_old_label:
      size = sizeof (DST_old_label (entry));
      break;
    case dst_typ_scope:
      size = sizeof (DST_scope (entry));
      break;
    case dst_typ_end_scope:
      size = 0;
      break;
    case dst_typ_25:
    case dst_typ_26:
      size = -1;
      break;
    case dst_typ_string_tab:
    case dst_typ_global_name_tab:
      size = sizeof (DST_string_tab (entry))
	+ DST_string_tab (entry).length
	- dst_dummy_array_size;
      break;
    case dst_typ_forward:
      size = sizeof (DST_forward (entry));
      get_dst_entry ((char *) entry + DST_forward (entry).rec_off, &entry);
      break;
    case dst_typ_aux_size:
      size = sizeof (DST_aux_size (entry));
      break;
    case dst_typ_aux_align:
      size = sizeof (DST_aux_align (entry));
      break;
    case dst_typ_aux_field_size:
      size = sizeof (DST_aux_field_size (entry));
      break;
    case dst_typ_aux_field_off:
      size = sizeof (DST_aux_field_off (entry));
      break;
    case dst_typ_aux_field_align:
      size = sizeof (DST_aux_field_align (entry));
      break;
    case dst_typ_aux_qual:
      size = sizeof (DST_aux_qual (entry));
      break;
    case dst_typ_aux_var_bound:
      size = sizeof (DST_aux_var_bound (entry));
      break;
    case dst_typ_extension:
      size = DST_extension (entry).rec_size;
      break;
    case dst_typ_string:
      size = sizeof (DST_string (entry));
      break;
    case dst_typ_old_entry:
      size = 48;		/* Obsolete entry type */
      break;
    case dst_typ_const:
      size = sizeof (DST_const (entry))
	+ DST_const (entry).value.length
	- sizeof (DST_const (entry).value.val);
      break;
    case dst_typ_reference:
      size = sizeof (DST_reference (entry));
      break;
    case dst_typ_old_record:
    case dst_typ_old_union:
    case dst_typ_record:
    case dst_typ_union:
      size = sizeof (DST_record (entry))
	+ ((int) DST_record (entry).nfields
	   - dst_dummy_array_size) * sizeof (dst_field_t);
      break;
    case dst_typ_aux_type_deriv:
      size = sizeof (DST_aux_type_deriv (entry));
      break;
    case dst_typ_locpool:
      size = sizeof (DST_locpool (entry))
	+ ((int) DST_locpool (entry).length -
	   dst_dummy_array_size);
      break;
    case dst_typ_variable:
      size = sizeof (DST_variable (entry));
      break;
    case dst_typ_label:
      size = sizeof (DST_label (entry));
      break;
    case dst_typ_entry:
      size = sizeof (DST_entry (entry));
      break;
    case dst_typ_aux_lifetime:
      size = sizeof (DST_aux_lifetime (entry));
      break;
    case dst_typ_aux_ptr_base:
      size = sizeof (DST_aux_ptr_base (entry));
      break;
    case dst_typ_aux_src_range:
      size = sizeof (DST_aux_src_range (entry));
      break;
    case dst_typ_aux_reg_val:
      size = sizeof (DST_aux_reg_val (entry));
      break;
    case dst_typ_aux_unit_names:
      size = sizeof (DST_aux_unit_names (entry))
	+ ((int) DST_aux_unit_names (entry).number_of_names
	   - dst_dummy_array_size) * sizeof (dst_rel_offset_t);
      break;
    case dst_typ_aux_sect_info:
      size = sizeof (DST_aux_sect_info (entry))
	+ ((int) DST_aux_sect_info (entry).number_of_refs
	   - dst_dummy_array_size) * sizeof (dst_sect_ref_t);
      break;
    default:
      size = -1;
      break;
    }
  if (size == -1)
    {
      fprintf_unfiltered (gdb_stderr, "Warning: unexpected DST entry type (%d) found\nLast valid entry was of type: %d\n",
			  (int) entry->rec_type,
			  last_type);
      fprintf_unfiltered (gdb_stderr, "Last unknown_3 value: %d\n", lu3);
      size = 0;
    }
  else
    last_type = entry->rec_type;
  if (size & 1)			/* Align on a word boundary */
    size++;
  size += 2;
  *ret_entry = entry;
  return size;
}

static int
next_dst_entry (char **buffer, dst_rec_ptr_t *entry, dst_sec *table)
{
  if (*buffer - table->buffer >= table->size)
    {
      *entry = NULL;
      return 0;
    }
  *buffer += get_dst_entry (*buffer, entry);
  return 1;
}

#define NEXT_BLK(a, b) next_dst_entry(a, b, &blocks_info)
#define NEXT_SYM(a, b) next_dst_entry(a, b, &symbols_info)
#define	DST_OFFSET(a, b) ((char *) (a) + (b))

static dst_rec_ptr_t section_table = NULL;

char *
get_sec_ref (dst_sect_ref_t *ref)
{
  dst_sec *section = NULL;
  long offset;

  if (!section_table || !ref->sect_index)
    return NULL;
  offset = DST_section_tab (section_table).section_base[ref->sect_index - 1]
    + ref->sect_offset;
  if (offset >= blocks_info.base &&
      offset < blocks_info.base + blocks_info.size)
    section = &blocks_info;
  else if (offset >= symbols_info.base &&
	   offset < symbols_info.base + symbols_info.size)
    section = &symbols_info;
  else if (offset >= lines_info.base &&
	   offset < lines_info.base + lines_info.size)
    section = &lines_info;
  if (!section)
    return NULL;
  return section->buffer + (offset - section->base);
}

CORE_ADDR
dst_get_addr (int section, long offset)
{
  if (!section_table || !section)
    return 0;
  return DST_section_tab (section_table).section_base[section - 1] + offset;
}

CORE_ADDR
dst_sym_addr (dst_sect_ref_t *ref)
{
  if (!section_table || !ref->sect_index)
    return 0;
  return DST_section_tab (section_table).section_base[ref->sect_index - 1]
    + ref->sect_offset;
}

static struct type *
create_new_type (struct objfile *objfile)
{
  struct type *type;

  type = (struct type *)
    obstack_alloc (&objfile->symbol_obstack, sizeof (struct type));
  memset (type, 0, sizeof (struct type));
  return type;
}

static struct symbol *
create_new_symbol (struct objfile *objfile, char *name)
{
  struct symbol *sym = (struct symbol *)
  obstack_alloc (&objfile->symbol_obstack, sizeof (struct symbol));
  memset (sym, 0, sizeof (struct symbol));
  SYMBOL_NAME (sym) = obsavestring (name, strlen (name),
				    &objfile->symbol_obstack);
  SYMBOL_VALUE (sym) = 0;
  SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;

  SYMBOL_CLASS (sym) = LOC_BLOCK;
  return sym;
};

static struct type *decode_dst_type (struct objfile *, dst_rec_ptr_t);

static struct type *
decode_type_desc (struct objfile *objfile, dst_type_t *type_desc,
		  dst_rec_ptr_t base)
{
  struct type *type;
  dst_rec_ptr_t entry;
  if (type_desc->std_type.user_defined_type)
    {
      entry = (dst_rec_ptr_t) DST_OFFSET (base,
					  dst_user_type_offset (*type_desc));
      type = decode_dst_type (objfile, entry);
    }
  else
    {
      switch (type_desc->std_type.dtc)
	{
	case dst_int8_type:
	  type = builtin_type_signed_char;
	  break;
	case dst_int16_type:
	  type = builtin_type_short;
	  break;
	case dst_int32_type:
	  type = builtin_type_long;
	  break;
	case dst_uint8_type:
	  type = builtin_type_unsigned_char;
	  break;
	case dst_uint16_type:
	  type = builtin_type_unsigned_short;
	  break;
	case dst_uint32_type:
	  type = builtin_type_unsigned_long;
	  break;
	case dst_real32_type:
	  type = builtin_type_float;
	  break;
	case dst_real64_type:
	  type = builtin_type_double;
	  break;
	case dst_complex_type:
	  type = builtin_type_complex;
	  break;
	case dst_dcomplex_type:
	  type = builtin_type_double_complex;
	  break;
	case dst_bool8_type:
	  type = builtin_type_char;
	  break;
	case dst_bool16_type:
	  type = builtin_type_short;
	  break;
	case dst_bool32_type:
	  type = builtin_type_long;
	  break;
	case dst_char_type:
	  type = builtin_type_char;
	  break;
	  /* The next few are more complex. I will take care
	   * of them properly at a later point.
	   */
	case dst_string_type:
	  type = builtin_type_void;
	  break;
	case dst_ptr_type:
	  type = builtin_type_void;
	  break;
	case dst_set_type:
	  type = builtin_type_void;
	  break;
	case dst_proc_type:
	  type = builtin_type_void;
	  break;
	case dst_func_type:
	  type = builtin_type_void;
	  break;
	  /* Back tto some ordinary ones */
	case dst_void_type:
	  type = builtin_type_void;
	  break;
	case dst_uchar_type:
	  type = builtin_type_unsigned_char;
	  break;
	default:
	  type = builtin_type_void;
	  break;
	}
    }
  return type;
}

struct structure_list
{
  struct structure_list *next;
  struct type *type;
};

static struct structure_list *struct_list = NULL;

static struct type *
find_dst_structure (char *name)
{
  struct structure_list *element;

  for (element = struct_list; element; element = element->next)
    if (!strcmp (name, TYPE_NAME (element->type)))
      return element->type;
  return NULL;
}


static struct type *
decode_dst_structure (struct objfile *objfile, dst_rec_ptr_t entry, int code,
		      int version)
{
  struct type *type, *child_type;
  char *struct_name;
  char *name, *field_name;
  int i;
  int fieldoffset, fieldsize;
  dst_type_t type_desc;
  struct structure_list *element;

  struct_name = DST_OFFSET (entry, DST_record (entry).noffset);
  name = concat ((code == TYPE_CODE_UNION) ? "union " : "struct ",
		 struct_name, NULL);
  type = find_dst_structure (name);
  if (type)
    {
      xfree (name);
      return type;
    }
  type = create_new_type (objfile);
  TYPE_NAME (type) = obstack_copy0 (&objfile->symbol_obstack,
				    name, strlen (name));
  xfree (name);
  TYPE_CODE (type) = code;
  TYPE_LENGTH (type) = DST_record (entry).size;
  TYPE_NFIELDS (type) = DST_record (entry).nfields;
  TYPE_FIELDS (type) = (struct field *)
    obstack_alloc (&objfile->symbol_obstack, sizeof (struct field) *
		   DST_record (entry).nfields);
  fieldoffset = fieldsize = 0;
  INIT_CPLUS_SPECIFIC (type);
  element = (struct structure_list *)
    xmalloc (sizeof (struct structure_list));
  element->type = type;
  element->next = struct_list;
  struct_list = element;
  for (i = 0; i < DST_record (entry).nfields; i++)
    {
      switch (version)
	{
	case 2:
	  field_name = DST_OFFSET (entry,
				   DST_record (entry).f.ofields[i].noffset);
	  fieldoffset = DST_record (entry).f.ofields[i].foffset * 8 +
	    DST_record (entry).f.ofields[i].bit_offset;
	  fieldsize = DST_record (entry).f.ofields[i].size;
	  type_desc = DST_record (entry).f.ofields[i].type_desc;
	  break;
	case 1:
	  field_name = DST_OFFSET (entry,
				   DST_record (entry).f.fields[i].noffset);
	  type_desc = DST_record (entry).f.fields[i].type_desc;
	  switch (DST_record (entry).f.fields[i].f.field_loc.format_tag)
	    {
	    case dst_field_byte:
	      fieldoffset = DST_record (entry).f.
		fields[i].f.field_byte.offset * 8;
	      fieldsize = -1;
	      break;
	    case dst_field_bit:
	      fieldoffset = DST_record (entry).f.
		fields[i].f.field_bit.byte_offset * 8 +
		DST_record (entry).f.
		fields[i].f.field_bit.bit_offset;
	      fieldsize = DST_record (entry).f.
		fields[i].f.field_bit.nbits;
	      break;
	    case dst_field_loc:
	      fieldoffset += fieldsize;
	      fieldsize = -1;
	      break;
	    }
	  break;
	case 0:
	  field_name = DST_OFFSET (entry,
				   DST_record (entry).f.sfields[i].noffset);
	  fieldoffset = DST_record (entry).f.sfields[i].foffset;
	  type_desc = DST_record (entry).f.sfields[i].type_desc;
	  if (i < DST_record (entry).nfields - 1)
	    fieldsize = DST_record (entry).f.sfields[i + 1].foffset;
	  else
	    fieldsize = DST_record (entry).size;
	  fieldsize -= fieldoffset;
	  fieldoffset *= 8;
	  fieldsize *= 8;
	}
      TYPE_FIELDS (type)[i].name =
	obstack_copy0 (&objfile->symbol_obstack,
		       field_name, strlen (field_name));
      TYPE_FIELDS (type)[i].type = decode_type_desc (objfile,
						     &type_desc,
						     entry);
      if (fieldsize == -1)
	fieldsize = TYPE_LENGTH (TYPE_FIELDS (type)[i].type) *
	  8;
      TYPE_FIELDS (type)[i].bitsize = fieldsize;
      TYPE_FIELDS (type)[i].bitpos = fieldoffset;
    }
  return type;
}

static struct type *
decode_dst_type (struct objfile *objfile, dst_rec_ptr_t entry)
{
  struct type *child_type, *type, *range_type, *index_type;

  switch (entry->rec_type)
    {
    case dst_typ_var:
      return decode_type_desc (objfile,
			       &DST_var (entry).type_desc,
			       entry);
      break;
    case dst_typ_variable:
      return decode_type_desc (objfile,
			       &DST_variable (entry).type_desc,
			       entry);
      break;
    case dst_typ_short_rec:
      return decode_dst_structure (objfile, entry, TYPE_CODE_STRUCT, 0);
    case dst_typ_short_union:
      return decode_dst_structure (objfile, entry, TYPE_CODE_UNION, 0);
    case dst_typ_union:
      return decode_dst_structure (objfile, entry, TYPE_CODE_UNION, 1);
    case dst_typ_record:
      return decode_dst_structure (objfile, entry, TYPE_CODE_STRUCT, 1);
    case dst_typ_old_union:
      return decode_dst_structure (objfile, entry, TYPE_CODE_UNION, 2);
    case dst_typ_old_record:
      return decode_dst_structure (objfile, entry, TYPE_CODE_STRUCT, 2);
    case dst_typ_pointer:
      return make_pointer_type (
				 decode_type_desc (objfile,
					     &DST_pointer (entry).type_desc,
						   entry),
				 NULL);
    case dst_typ_array:
      child_type = decode_type_desc (objfile,
				     &DST_pointer (entry).type_desc,
				     entry);
      index_type = lookup_fundamental_type (objfile,
					    FT_INTEGER);
      range_type = create_range_type ((struct type *) NULL,
				      index_type, DST_array (entry).lo_bound,
				      DST_array (entry).hi_bound);
      return create_array_type ((struct type *) NULL, child_type,
				range_type);
    case dst_typ_alias:
      return decode_type_desc (objfile,
			       &DST_alias (entry).type_desc,
			       entry);
    default:
      return builtin_type_int;
    }
}

struct symbol_list
{
  struct symbol_list *next;
  struct symbol *symbol;
};

static struct symbol_list *dst_global_symbols = NULL;
static int total_globals = 0;

static void
decode_dst_locstring (char *locstr, struct symbol *sym)
{
  dst_loc_entry_t *entry, *next_entry;
  CORE_ADDR temp;
  int count = 0;

  while (1)
    {
      if (count++ == 100)
	{
	  fprintf_unfiltered (gdb_stderr, "Error reading locstring\n");
	  break;
	}
      entry = (dst_loc_entry_t *) locstr;
      next_entry = (dst_loc_entry_t *) (locstr + 1);
      switch (entry->header.code)
	{
	case dst_lsc_end:	/* End of string */
	  return;
	case dst_lsc_indirect:	/* Indirect through previous. Arg == 6 */
	  /* Or register ax x == arg */
	  if (entry->header.arg < 6)
	    {
	      SYMBOL_CLASS (sym) = LOC_REGISTER;
	      SYMBOL_VALUE (sym) = entry->header.arg + 8;
	    }
	  /* We predict indirects */
	  locstr++;
	  break;
	case dst_lsc_dreg:
	  SYMBOL_CLASS (sym) = LOC_REGISTER;
	  SYMBOL_VALUE (sym) = entry->header.arg;
	  locstr++;
	  break;
	case dst_lsc_section:	/* Section (arg+1) */
	  SYMBOL_VALUE (sym) = dst_get_addr (entry->header.arg + 1, 0);
	  locstr++;
	  break;
	case dst_lsc_sec_byte:	/* Section (next_byte+1) */
	  SYMBOL_VALUE (sym) = dst_get_addr (locstr[1] + 1, 0);
	  locstr += 2;
	  break;
	case dst_lsc_add:	/* Add (arg+1)*2 */
	case dst_lsc_sub:	/* Subtract (arg+1)*2 */
	  temp = (entry->header.arg + 1) * 2;
	  locstr++;
	  if (*locstr == dst_multiply_256)
	    {
	      temp <<= 8;
	      locstr++;
	    }
	  switch (entry->header.code)
	    {
	    case dst_lsc_add:
	      if (SYMBOL_CLASS (sym) == LOC_LOCAL)
		SYMBOL_CLASS (sym) = LOC_ARG;
	      SYMBOL_VALUE (sym) += temp;
	      break;
	    case dst_lsc_sub:
	      SYMBOL_VALUE (sym) -= temp;
	      break;
	    }
	  break;
	case dst_lsc_add_byte:
	case dst_lsc_sub_byte:
	  switch (entry->header.arg & 0x03)
	    {
	    case 1:
	      temp = (unsigned char) locstr[1];
	      locstr += 2;
	      break;
	    case 2:
	      temp = *(unsigned short *) (locstr + 1);
	      locstr += 3;
	      break;
	    case 3:
	      temp = *(unsigned long *) (locstr + 1);
	      locstr += 5;
	      break;
	    }
	  if (*locstr == dst_multiply_256)
	    {
	      temp <<= 8;
	      locstr++;
	    }
	  switch (entry->header.code)
	    {
	    case dst_lsc_add_byte:
	      if (SYMBOL_CLASS (sym) == LOC_LOCAL)
		SYMBOL_CLASS (sym) = LOC_ARG;
	      SYMBOL_VALUE (sym) += temp;
	      break;
	    case dst_lsc_sub_byte:
	      SYMBOL_VALUE (sym) -= temp;
	      break;
	    }
	  break;
	case dst_lsc_sbreg:	/* Stack base register (frame pointer). Arg==0 */
	  if (next_entry->header.code != dst_lsc_indirect)
	    {
	      SYMBOL_VALUE (sym) = 0;
	      SYMBOL_CLASS (sym) = LOC_STATIC;
	      return;
	    }
	  SYMBOL_VALUE (sym) = 0;
	  SYMBOL_CLASS (sym) = LOC_LOCAL;
	  locstr++;
	  break;
	default:
	  SYMBOL_VALUE (sym) = 0;
	  SYMBOL_CLASS (sym) = LOC_STATIC;
	  return;
	}
    }
}

static struct symbol_list *
process_dst_symbols (struct objfile *objfile, dst_rec_ptr_t entry, char *name,
		     int *nsyms_ret)
{
  struct symbol_list *list = NULL, *element;
  struct symbol *sym;
  char *symname;
  int nsyms = 0;
  char *location;
  long line;
  dst_type_t symtype;
  struct type *type;
  dst_var_attr_t attr;
  dst_var_loc_t loc_type;
  unsigned loc_index;
  long loc_value;

  if (!entry)
    {
      *nsyms_ret = 0;
      return NULL;
    }
  location = (char *) entry;
  while (NEXT_SYM (&location, &entry) &&
	 entry->rec_type != dst_typ_end_scope)
    {
      if (entry->rec_type == dst_typ_var)
	{
	  if (DST_var (entry).short_locs)
	    {
	      loc_type = DST_var (entry).locs.shorts[0].loc_type;
	      loc_index = DST_var (entry).locs.shorts[0].loc_index;
	      loc_value = DST_var (entry).locs.shorts[0].location;
	    }
	  else
	    {
	      loc_type = DST_var (entry).locs.longs[0].loc_type;
	      loc_index = DST_var (entry).locs.longs[0].loc_index;
	      loc_value = DST_var (entry).locs.longs[0].location;
	    }
	  if (loc_type == dst_var_loc_external)
	    continue;
	  symname = DST_OFFSET (entry, DST_var (entry).noffset);
	  line = DST_var (entry).src_loc.line_number;
	  symtype = DST_var (entry).type_desc;
	  attr = DST_var (entry).attributes;
	}
      else if (entry->rec_type == dst_typ_variable)
	{
	  symname = DST_OFFSET (entry,
				DST_variable (entry).noffset);
	  line = DST_variable (entry).src_loc.line_number;
	  symtype = DST_variable (entry).type_desc;
	  attr = DST_variable (entry).attributes;
	}
      else
	{
	  continue;
	}
      if (symname && name && !strcmp (symname, name))
	/* It's the function return value */
	continue;
      sym = create_new_symbol (objfile, symname);

      if ((attr & (1 << dst_var_attr_global)) ||
	  (attr & (1 << dst_var_attr_static)))
	SYMBOL_CLASS (sym) = LOC_STATIC;
      else
	SYMBOL_CLASS (sym) = LOC_LOCAL;
      SYMBOL_LINE (sym) = line;
      SYMBOL_TYPE (sym) = decode_type_desc (objfile, &symtype,
					    entry);
      SYMBOL_VALUE (sym) = 0;
      switch (entry->rec_type)
	{
	case dst_typ_var:
	  switch (loc_type)
	    {
	    case dst_var_loc_abs:
	      SYMBOL_VALUE_ADDRESS (sym) = loc_value;
	      break;
	    case dst_var_loc_sect_off:
	    case dst_var_loc_ind_sect_off:	/* What is this? */
	      SYMBOL_VALUE_ADDRESS (sym) = dst_get_addr (
							  loc_index,
							  loc_value);
	      break;
	    case dst_var_loc_ind_reg_rel:	/* What is this? */
	    case dst_var_loc_reg_rel:
	      /* If it isn't fp relative, specify the
	       * register it's relative to.
	       */
	      if (loc_index)
		{
		  sym->aux_value.basereg = loc_index;
		}
	      SYMBOL_VALUE (sym) = loc_value;
	      if (loc_value > 0 &&
		  SYMBOL_CLASS (sym) == LOC_BASEREG)
		SYMBOL_CLASS (sym) = LOC_BASEREG_ARG;
	      break;
	    case dst_var_loc_reg:
	      SYMBOL_VALUE (sym) = loc_index;
	      SYMBOL_CLASS (sym) = LOC_REGISTER;
	      break;
	    }
	  break;
	case dst_typ_variable:
	  /* External variable..... don't try to interpret
	   * its nonexistant locstring.
	   */
	  if (DST_variable (entry).loffset == -1)
	    continue;
	  decode_dst_locstring (DST_OFFSET (entry,
					    DST_variable (entry).loffset),
				sym);
	}
      element = (struct symbol_list *)
	xmalloc (sizeof (struct symbol_list));

      if (attr & (1 << dst_var_attr_global))
	{
	  element->next = dst_global_symbols;
	  dst_global_symbols = element;
	  total_globals++;
	}
      else
	{
	  element->next = list;
	  list = element;
	  nsyms++;
	}
      element->symbol = sym;
    }
  *nsyms_ret = nsyms;
  return list;
}


static struct symbol *
process_dst_function (struct objfile *objfile, dst_rec_ptr_t entry, char *name,
		      CORE_ADDR address)
{
  struct symbol *sym;
  struct type *type, *ftype;
  dst_rec_ptr_t sym_entry, typ_entry;
  char *location;
  struct symbol_list *element;

  type = builtin_type_int;
  sym = create_new_symbol (objfile, name);
  SYMBOL_CLASS (sym) = LOC_BLOCK;

  if (entry)
    {
      location = (char *) entry;
      do
	{
	  NEXT_SYM (&location, &sym_entry);
	}
      while (sym_entry && sym_entry->rec_type != dst_typ_signature);

      if (sym_entry)
	{
	  SYMBOL_LINE (sym) =
	    DST_signature (sym_entry).src_loc.line_number;
	  if (DST_signature (sym_entry).result)
	    {
	      typ_entry = (dst_rec_ptr_t)
		DST_OFFSET (sym_entry,
			    DST_signature (sym_entry).result);
	      type = decode_dst_type (objfile, typ_entry);
	    }
	}
    }

  if (!type->function_type)
    {
      ftype = create_new_type (objfile);
      type->function_type = ftype;
      FUNCTION_RETURN_VALUE (ftype) = type;
      ftype->code = TYPE_CODE_FUNC;
    }
  SYMBOL_TYPE (sym) = type->function_type;

  /* Now add ourselves to the global symbols list */
  element = (struct symbol_list *)
    xmalloc (sizeof (struct symbol_list));

  element->next = dst_global_symbols;
  dst_global_symbols = element;
  total_globals++;
  element->symbol = sym;

  return sym;
}

static struct block *
process_dst_block (struct objfile *objfile, dst_rec_ptr_t entry)
{
  struct block *block;
  struct symbol *function = NULL;
  CORE_ADDR address;
  long size;
  char *name;
  dst_rec_ptr_t child_entry, symbol_entry;
  struct block *child_block;
  int total_symbols = 0;
  char fake_name[20];
  static long fake_seq = 0;
  struct symbol_list *symlist, *nextsym;
  int symnum;

  if (DST_block (entry).noffset)
    name = DST_OFFSET (entry, DST_block (entry).noffset);
  else
    name = NULL;
  if (DST_block (entry).n_of_code_ranges)
    {
      address = dst_sym_addr (
			       &DST_block (entry).code_ranges[0].code_start);
      size = DST_block (entry).code_ranges[0].code_size;
    }
  else
    {
      address = -1;
      size = 0;
    }
  symbol_entry = (dst_rec_ptr_t) get_sec_ref (&DST_block (entry).symbols_start);
  switch (DST_block (entry).block_type)
    {
      /* These are all really functions. Even the "program" type.
       * This is because the Apollo OS was written in Pascal, and
       * in Pascal, the main procedure is described as the Program.
       * Cute, huh?
       */
    case dst_block_procedure:
    case dst_block_function:
    case dst_block_subroutine:
    case dst_block_program:
      prim_record_minimal_symbol (name, address, mst_text, objfile);
      function = process_dst_function (
					objfile,
					symbol_entry,
					name,
					address);
      enter_all_lines (get_sec_ref (&DST_block (entry).code_ranges[0].lines_start), address);
      break;
    case dst_block_block_data:
      break;

    default:
      /* GDB has to call it something, and the module name
       * won't cut it
       */
      sprintf (fake_name, "block_%08lx", fake_seq++);
      function = process_dst_function (
					objfile, NULL, fake_name, address);
      break;
    }
  symlist = process_dst_symbols (objfile, symbol_entry,
				 name, &total_symbols);
  block = (struct block *)
    obstack_alloc (&objfile->symbol_obstack,
		   sizeof (struct block) +
		     (total_symbols - 1) * sizeof (struct symbol *));

  symnum = 0;
  while (symlist)
    {
      nextsym = symlist->next;

      block->sym[symnum] = symlist->symbol;

      xfree (symlist);
      symlist = nextsym;
      symnum++;
    }
  BLOCK_NSYMS (block) = total_symbols;
  BLOCK_START (block) = address;
  BLOCK_END (block) = address + size;
  BLOCK_SUPERBLOCK (block) = 0;
  if (function)
    {
      SYMBOL_BLOCK_VALUE (function) = block;
      BLOCK_FUNCTION (block) = function;
    }
  else
    BLOCK_FUNCTION (block) = 0;

  if (DST_block (entry).child_block_off)
    {
      child_entry = (dst_rec_ptr_t) DST_OFFSET (entry,
					 DST_block (entry).child_block_off);
      while (child_entry)
	{
	  child_block = process_dst_block (objfile, child_entry);
	  if (child_block)
	    {
	      if (BLOCK_START (child_block) <
		  BLOCK_START (block) ||
		  BLOCK_START (block) == -1)
		BLOCK_START (block) =
		  BLOCK_START (child_block);
	      if (BLOCK_END (child_block) >
		  BLOCK_END (block) ||
		  BLOCK_END (block) == -1)
		BLOCK_END (block) =
		  BLOCK_END (child_block);
	      BLOCK_SUPERBLOCK (child_block) = block;
	    }
	  if (DST_block (child_entry).sibling_block_off)
	    child_entry = (dst_rec_ptr_t) DST_OFFSET (
						       child_entry,
				 DST_block (child_entry).sibling_block_off);
	  else
	    child_entry = NULL;
	}
    }
  record_pending_block (objfile, block, NULL);
  return block;
}


static void
read_dst_symtab (struct objfile *objfile)
{
  char *buffer;
  dst_rec_ptr_t entry, file_table, root_block;
  char *source_file;
  struct block *block, *global_block;
  int symnum;
  struct symbol_list *nextsym;
  int module_num = 0;
  struct structure_list *element;

  current_objfile = objfile;
  buffer = blocks_info.buffer;
  while (NEXT_BLK (&buffer, &entry))
    {
      if (entry->rec_type == dst_typ_comp_unit)
	{
	  file_table = (dst_rec_ptr_t) DST_OFFSET (entry,
					  DST_comp_unit (entry).file_table);
	  section_table = (dst_rec_ptr_t) DST_OFFSET (entry,
				       DST_comp_unit (entry).section_table);
	  root_block = (dst_rec_ptr_t) DST_OFFSET (entry,
				   DST_comp_unit (entry).root_block_offset);
	  source_file = DST_OFFSET (file_table,
				DST_file_tab (file_table).files[0].noffset);
	  /* Point buffer to the start of the next comp_unit */
	  buffer = DST_OFFSET (entry,
			       DST_comp_unit (entry).data_size);
	  dst_start_symtab ();

	  block = process_dst_block (objfile, root_block);

	  global_block = (struct block *)
	    obstack_alloc (&objfile->symbol_obstack,
			   sizeof (struct block) +
			     (total_globals - 1) *
			   sizeof (struct symbol *));
	  BLOCK_NSYMS (global_block) = total_globals;
	  for (symnum = 0; symnum < total_globals; symnum++)
	    {
	      nextsym = dst_global_symbols->next;

	      global_block->sym[symnum] =
		dst_global_symbols->symbol;

	      xfree (dst_global_symbols);
	      dst_global_symbols = nextsym;
	    }
	  dst_global_symbols = NULL;
	  total_globals = 0;
	  BLOCK_FUNCTION (global_block) = 0;
	  BLOCK_START (global_block) = BLOCK_START (block);
	  BLOCK_END (global_block) = BLOCK_END (block);
	  BLOCK_SUPERBLOCK (global_block) = 0;
	  BLOCK_SUPERBLOCK (block) = global_block;
	  record_pending_block (objfile, global_block, NULL);

	  complete_symtab (source_file,
			   BLOCK_START (block),
			   BLOCK_END (block) - BLOCK_START (block));
	  module_num++;
	  dst_end_symtab (objfile);
	}
    }
  if (module_num)
    prim_record_minimal_symbol ("<end_of_program>",
				BLOCK_END (block), mst_text, objfile);
  /* One more faked symbol to make sure nothing can ever run off the
   * end of the symbol table. This one represents the end of the
   * text space. It used to be (CORE_ADDR) -1 (effectively the highest
   * int possible), but some parts of gdb treated it as a signed
   * number and failed comparisons. We could equally use 7fffffff,
   * but no functions are ever mapped to an address higher than
   * 40000000
   */
  prim_record_minimal_symbol ("<end_of_text>",
			      (CORE_ADDR) 0x40000000,
			      mst_text, objfile);
  while (struct_list)
    {
      element = struct_list;
      struct_list = element->next;
      xfree (element);
    }
}


/* Support for line number handling */
static char *linetab = NULL;
static long linetab_offset;
static unsigned long linetab_size;

/* Read in all the line numbers for fast lookups later.  Leave them in
   external (unswapped) format in memory; we'll swap them as we enter
   them into GDB's data structures.  */
static int
init_one_section (int chan, dst_sec *secinfo)
{
  if (secinfo->size == 0
      || lseek (chan, secinfo->position, 0) == -1
      || (secinfo->buffer = xmalloc (secinfo->size)) == NULL
      || myread (chan, secinfo->buffer, secinfo->size) == -1)
    return 0;
  else
    return 1;
}

static int
init_dst_sections (int chan)
{

  if (!init_one_section (chan, &blocks_info) ||
      !init_one_section (chan, &lines_info) ||
      !init_one_section (chan, &symbols_info))
    return -1;
  else
    return 0;
}

/* Fake up support for relocating symbol addresses.  FIXME.  */

struct section_offsets dst_symfile_faker =
{0};

void
dst_symfile_offsets (struct objfile *objfile, struct section_addr_info *addrs)
{
  objfile->num_sections = 1;
  objfile->section_offsets = &dst_symfile_faker;
}

/* Register our ability to parse symbols for DST BFD files */

static struct sym_fns dst_sym_fns =
{
  /* FIXME: Can this be integrated with coffread.c?  If not, should it be
     a separate flavour like ecoff?  */
  (enum bfd_flavour) -2,

  dst_new_init,			/* sym_new_init: init anything gbl to entire symtab */
  dst_symfile_init,		/* sym_init: read initial info, setup for sym_read() */
  dst_symfile_read,		/* sym_read: read a symbol file into symtab */
  dst_symfile_finish,		/* sym_finish: finished with file, cleanup */
  dst_symfile_offsets,		/* sym_offsets:  xlate external to internal form */
  NULL				/* next: pointer to next struct sym_fns */
};

void
_initialize_dstread (void)
{
  add_symtab_fns (&dst_sym_fns);
}
