/* xSYM symbol-file support for BFD.
   Copyright 1999, 2000, 2001, 2002
   Free Software Foundation, Inc.

   This file is part of BFD, the Binary File Descriptor library.

   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 "bfd.h"
#include <stdio.h>

#ifndef __xSYM_H__
#define __xSYM_H__

#define BFD_SYM_VERSION_STR_3_1 	"\013Version 3.1"
#define BFD_SYM_VERSION_STR_3_2 	"\013Version 3.2"
#define BFD_SYM_VERSION_STR_3_3 	"\013Version 3.3"
#define BFD_SYM_VERSION_STR_3_4 	"\013Version 3.4"
#define BFD_SYM_VERSION_STR_3_5 	"\013Version 3.5"
#define BFD_SYM_END_OF_LIST_3_2		0xffff
#define BFD_SYM_END_OF_LIST_3_4		0xffffffff
#define BFD_SYM_END_OF_LIST 		BFD_SYM_END_OF_LIST_3_4
#define BFD_SYM_FILE_NAME_INDEX_3_2	0xfffe
#define BFD_SYM_FILE_NAME_INDEX_3_4	0xfffffffe
#define BFD_SYM_FILE_NAME_INDEX		BFD_SYM_FILE_NAME_INDEX_3_4
#define BFD_SYM_SOURCE_FILE_CHANGE_3_2	0xfffe
#define BFD_SYM_SOURCE_FILE_CHANGE_3_4	0xfffffffe
#define BFD_SYM_SOURCE_FILE_CHANGE	BFD_SYM_SOURCE_FILE_CHANGE_3_4
#define BFD_SYM_MAXIMUM_LEGAL_INDEX_3_2 0xfffd
#define BFD_SYM_MAXIMUM_LEGAL_INDEX_3_4 0xfffffffd
#define BFD_SYM_MAXIMUM_LEGAL_INDEX	BFD_SYM_MAXIMUM_LEGAL_INDEX_3_4

enum bfd_sym_storage_class
{
  BFD_SYM_STORAGE_CLASS_REGISTER = 0,
  BFD_SYM_STORAGE_CLASS_GLOBAL = 1,
  BFD_SYM_STORAGE_CLASS_FRAME_RELATIVE = 2,
  BFD_SYM_STORAGE_CLASS_STACK_RELATIVE = 3,
  BFD_SYM_STORAGE_CLASS_ABSOLUTE = 4,
  BFD_SYM_STORAGE_CLASS_CONSTANT = 5,
  BFD_SYM_STORAGE_CLASS_BIGCONSTANT = 6,
  BFD_SYM_STORAGE_CLASS_RESOURCE = 99
};
typedef enum bfd_sym_storage_class bfd_sym_storage_class;

enum bfd_sym_storage_kind
{
  BFD_SYM_STORAGE_KIND_LOCAL = 0,
  BFD_SYM_STORAGE_KIND_VALUE = 1,
  BFD_SYM_STORAGE_KIND_REFERENCE = 2,
  BFD_SYM_STORAGE_KIND_WITH = 3
};
typedef enum bfd_sym_storage_kind bfd_sym_storage_kind;

enum bfd_sym_version
{
  BFD_SYM_VERSION_3_1,
  BFD_SYM_VERSION_3_2,
  BFD_SYM_VERSION_3_3,
  BFD_SYM_VERSION_3_4,
  BFD_SYM_VERSION_3_5
};
typedef enum bfd_sym_version bfd_sym_version;

enum bfd_sym_module_kind
{
  BFD_SYM_MODULE_KIND_NONE = 0,
  BFD_SYM_MODULE_KIND_PROGRAM = 1,
  BFD_SYM_MODULE_KIND_UNIT = 2,
  BFD_SYM_MODULE_KIND_PROCEDURE = 3,
  BFD_SYM_MODULE_KIND_FUNCTION = 4,
  BFD_SYM_MODULE_KIND_DATA = 5,
  BFD_SYM_MODULE_KIND_BLOCK = 6
};
typedef enum bfd_sym_module_kind bfd_sym_module_kind;

enum bfd_sym_symbol_scope
{
  BFD_SYM_SYMBOL_SCOPE_LOCAL = 0,  /* Object is seen only inside current scope.  */
  BFD_SYM_SYMBOL_SCOPE_GLOBAL = 1  /* Object has global scope.  */
};
typedef enum bfd_sym_symbol_scope bfd_sym_symbol_scope;

struct bfd_sym_file_reference
{
  unsigned long fref_frte_index; /* File reference table index.  */
  unsigned long fref_offset;     /* Absolute offset into source file.  */
};
typedef struct bfd_sym_file_reference bfd_sym_file_reference;

/* NAME TABLE (NTE).  */

/* RESOURCES TABLE (RTE)

   All code and data is *defined* to reside in a resource.  Even A5
   relative data is defined to reside in a dummy resource of ResType
   'gbld'.  Code always resides in a resource.  Because a code/data
   is built of many modules, when walking through a resource we must
   point back to the modules in the order they were defined.  This is
   done by requiring the entries in the Modules Entry table to be
   ordered by resource/resource-number and by the location in that
   resource.  Hence, the resource table entry points to the first
   module making up that resource.  All modules table entries following
   that first one with the same restype/resnum are contiguous and offset
   from that first entry.  */

struct bfd_sym_resources_table_entry
{
  unsigned char rte_res_type[4];  /* Resource Type.  */
  unsigned short rte_res_number;  /* Resource Number.  */
  unsigned long rte_nte_index;    /* Name of the resource.  */
  unsigned long rte_mte_first;    /* Index of first module in the resource.  */
  unsigned long rte_mte_last;     /* Index of the last module in the resource.	*/
  unsigned long	rte_res_size;     /* Size of the resource.  */
};
typedef struct bfd_sym_resources_table_entry bfd_sym_resources_table_entry;

/* MODULES TABLE (MTE)

   Modules table entries are ordered by their appearance in a resource.
   (Note that having a single module copied into two resources is not
   possible).  Modules map back to their resource via an index into the
   resource table and an offset into the resource.  Modules also point
   to their source files, both the definition module and implemention
   module.  Because modules can be textually nested within other
   modules, a link to the parent (containing) module is required.  This
   module can textually contain other modules.  A link to the contiguous
   list of child (contained) modules is required.  Variables, statements,
   and types defined in the module are pointed to by indexing the head of
   the contiguous lists of contained variables, contained statements,
   and contained types.  */

struct bfd_sym_modules_table_entry
{
  unsigned long mte_rte_index;         /* Which resource it is in.  */
  unsigned long mte_res_offset;        /* Offset into the resource.  */
  unsigned long mte_size;              /* Size of module.  */
  char mte_kind;                       /* What kind of module this is.  */
  char mte_scope;                      /* How visible is it?  */
  unsigned long mte_parent;            /* Containing module.  */
  bfd_sym_file_reference mte_imp_fref; /* Implementation source.  */
  unsigned long mte_imp_end;           /* End of implementation source.  */
  unsigned long mte_nte_index;         /* The name of the module.  */
  unsigned long mte_cmte_index;        /* Modules contained in this.  */
  unsigned long mte_cvte_index;        /* Variables contained in this.  */
  unsigned long mte_clte_index;        /* Local labels defined here.  */
  unsigned long mte_ctte_index;        /* Types contained in this.  */
  unsigned long mte_csnte_idx_1;       /* CSNTE index of mte_snbr_first.  */
  unsigned long mte_csnte_idx_2;       /* CSNTE index of mte_snbr_last.  */
};
typedef struct bfd_sym_modules_table_entry bfd_sym_modules_table_entry;

/* FILE REFERENCES TABLE (FRTE)

   The FILE REFERENCES TABLE maps from source file to module & offset.
   The table is ordered by increasing file offset.  Each new offset
   references a module.

 				FRT	= FILE_SOURCE_START
 							FILE_SOURCE_INCREMENT*
 							END_OF_LIST.

	*** THIS MECHANISM IS VERY SLOW FOR FILE+STATEMENT_NUMBER TO
 	*** MODULE/CODE ADDRESS OPERATIONS.  ANOTHER MECHANISM IS
 	***	REQUIRED!!  */

union bfd_sym_file_references_table_entry
{
  struct
  {
    /* END_OF_LIST, FILE_NAME_INDEX, or module table entry.  */
    unsigned long type;
  }
  generic;

  struct
  {
    /* FILE_NAME_INDEX.  */
    unsigned long type;
    unsigned long nte_index;
    unsigned long mod_date;
  }
  filename;

  struct
  {
    /* < FILE_NAME_INDEX.  */
    unsigned long mte_index;
    unsigned long file_offset;
  }
  entry;
};
typedef union bfd_sym_file_references_table_entry bfd_sym_file_references_table_entry;

/* CONTAINED MODULES TABLE (CMTE)

   Contained Modules are lists of indices into the modules table.  The
   lists are terminated by an END_OF_LIST index.  All entries are of the
   same size, hence mapping an index into a CMTE list is simple.

   CMT = MTE_INDEX* END_OF_LIST.  */

union bfd_sym_contained_modules_table_entry
{
  struct
  {
    /* END_OF_LIST, index.  */
    unsigned long type;
  }
  generic;

  struct
  {
    unsigned long mte_index; /* Index into the Modules Table.  */
    unsigned long nte_index; /* The name of the module.  */
  }
  entry;
};
typedef union bfd_sym_contained_modules_table_entry bfd_sym_contained_modules_table_entry;

/* CONTAINED VARIABLES TABLE (CVTE)

   Contained Variables map into the module table, file table, name table, and type
   table.  Contained Variables are a contiguous list of source file change record,
   giving the name of and offset into the source file corresponding to all variables
   following.  Variable definition records contain an index into the name table (giving
   the text of the variable as it appears in the source code), an index into the type
   table giving the type of the variable, an increment added to the source file
   offset giving the start of the implementation of the variable, and a storage
   class address, giving information on variable's runtime address.

   CVT = SOURCE_FILE_CHANGE SYMBOL_INFO* END_OF_LIST.
   SYMBOL_INFO = SYMBOL_DEFINITION | SOURCE_FILE_CHANGE .

   All entries are of the same size, making the fetching of data simple.  The
   variable entries in the list are in ALPHABETICAL ORDER to simplify the display of
   available variables for several of the debugger's windows.  */

/* 'la_size' determines the variant used below:

     == BFD_SYM_CVTE_SCA
     Traditional STORAGE_CLASS_ADDRESS;

     <= BFD_SYM_CVTE_LA_MAX_SIZE
     That many logical address bytes ("in-situ");

     == BFD_SYM_CVTE_BIG_LA
     Logical address bytes in constant pool, at offset 'big_la'.  */

#define	BFD_SYM_CVTE_SCA 0          /* Indicate SCA variant of CVTE.  */
#define	BFD_SYM_CVTE_LA_MAX_SIZE 13 /* Max# of logical address bytes in a CVTE.  */
#define	BFD_SYM_CVTE_BIG_LA 127     /* Indicates LA redirection to constant pool.  */

union bfd_sym_contained_variables_table_entry
{
  struct
  {
    /* END_OF_LIST, SOURCE_FILE_CHANGE, or type table entry.  */
    unsigned long type;
  }
  generic;

  struct
  {
    /* SOURCE_FILE_CHANGE.  */
    unsigned long type;
    bfd_sym_file_reference fref;
  }
  file;

  struct
  {
    /* < SOURCE_FILE_CHANGE.  */
    unsigned long tte_index;
    unsigned long nte_index;
    unsigned long file_delta;                       /* Increment from previous source.  */
    unsigned char scope;
    unsigned char la_size;                          /* #bytes of LAs below.  */

    union
    {
      /* la_size == BFD_SYM_CVTE_SCA.  */
      struct
      {
	unsigned char sca_kind;	                    /* Distinguish local from value/var formal.  */
	unsigned char sca_class;                    /* The storage class itself.  */
	unsigned long sca_offset;
      }
      scstruct;

      /* la_size <= BFD_SYM_CVTE_LA_MAX_SIZE.  */
      struct {
	unsigned char la[BFD_SYM_CVTE_LA_MAX_SIZE]; /* Logical address bytes.  */
	unsigned char la_kind;                      /* Eqv. cvte_location.sca_kind.  */
      }
      lastruct;

      /* la_size == BFD_SYM_CVTE_BIG_LA 127.  */
      struct
      {
	unsigned long big_la;                       /* Logical address bytes in constant pool.  */
	unsigned char big_la_kind;                  /* Eqv. cvte_location.sca_kind.  */
      }
      biglastruct;
    }
    address;
  }
  entry;
};
typedef union bfd_sym_contained_variables_table_entry bfd_sym_contained_variables_table_entry;

/* CONTAINED STATEMENTS TABLE (CSNTE)

   Contained Statements table.  This table is similar to the Contained
   Variables table except that instead of VARIABLE_DEFINITION entries, this
   module contains STATEMENT_NUMBER_DEFINITION entries.  A statement number
   definition points back to the containing module (via an index into
   the module entry table) and contains the file and resource deltas
   to add to the previous values to get to this statement.
   All entries are of the same size, making the fetching of data simple.  The
   entries in the table are in order of increasing statement number within the
   source file.

   The Contained Statements table is indexed from two places.  An MTE contains
   an index to the first statement number within the module.  An FRTE contains
   an index to the first statement in the table (Possibly.  This is slow.)  Or
   a table of fast statement number to CSNTE entry mappings indexes into the
   table.  Choice not yet made.  */

union bfd_sym_contained_statements_table_entry
{
  struct
  {
    /* END_OF_LIST, SOURCE_FILE_CHANGE, or statement table entry.  */
    unsigned long type;
  }
  generic;

  struct
  {
    /* SOURCE_FILE_CHANGE.  */
    unsigned long type;
    bfd_sym_file_reference fref; /* File name table.  */
  }
  file;

  struct
  {
    unsigned long mte_index;     /* Which module contains it.  */
    unsigned long file_delta;    /* Where it is defined.  */
    unsigned long mte_offset;    /* Where it is in the module.  */
  }
  entry;
};
typedef union bfd_sym_contained_statements_table_entry bfd_sym_contained_statements_table_entry;

/* CONTAINED LABELS TABLE (CLTE)

   Contained Labels table names those labels local to the module.  It is similar
   to the Contained Statements table.  */

union bfd_sym_contained_labels_table_entry
{
  struct
  {
    /* END_OF_LIST, SOURCE_FILE_CHANGE, index.  */
    unsigned long type;
  }
  generic;

  struct
  {
    /* SOURCE_FILE_CHANGE.  */
    unsigned long type;
    bfd_sym_file_reference fref;
  }
  file;

  struct
  {
    /* < SOURCE_FILE_CHANGE.  */
    unsigned long mte_index;   /* Which module contains us.  */
    unsigned long mte_offset;  /* Where it is in the module.  */
    unsigned long nte_index;   /* The name of the label.  */
    unsigned long file_delta;  /* Where it is defined.  */
    unsigned short scope;      /* How visible the label is.  */
  }
  entry;
};
typedef union bfd_sym_contained_labels_table_entry bfd_sym_contained_labels_table_entry;

/* CONTAINED TYPES TABLE (CTTE)

   Contained Types define the named types that are in the module.  It is used to
   map name indices into type indices.  The type entries in the table are in
   alphabetical order by type name.  */

union bfd_sym_contained_types_table_entry
{
  struct
  {
    /* END_OF_LIST, SOURCE_FILE_CHANGE, or type table entry.  */
    unsigned long type;
  }
  generic;

  struct
  {
    /* SOURCE_FILE_CHANGE.  */
    unsigned long type;
    bfd_sym_file_reference fref;
  }
  file;

  struct
  {
    /* < SOURCE_FILE_CHANGE.  */
    unsigned long tte_index;
    unsigned long nte_index;
    unsigned long file_delta; /* From last file definition.  */
  }
  entry;
};
typedef union bfd_sym_contained_types_table_entry bfd_sym_contained_types_table_entry;

/* TYPE TABLE (TTE).  */

typedef unsigned long bfd_sym_type_table_entry;

/* TYPE INFORMATION TABLE (TINFO).  */

struct bfd_sym_type_information_table_entry
{
  unsigned long nte_index;
  unsigned long physical_size;
  unsigned long logical_size;
  unsigned long offset;
};
typedef struct bfd_sym_type_information_table_entry bfd_sym_type_information_table_entry;

/* FILE REFERENCES INDEX TABLE (FITE)

   The FRTE INDEX TABLE indexes into the FILE REFERENCE TABLE above.  The FRTE
   at that index is the FILE_SOURCE_START for a series of files.  The FRTEs are
   indexed from 1.  The list is terminated with an END_OF_LIST.  */

union bfd_sym_file_references_index_table_entry
{
  struct
  {
    unsigned long type;
  }
  generic;

  struct
  {
    unsigned long frte_index;  /* Index into the FRTE table.  */
    unsigned long nte_index;   /* Name table index, gives filename.  */
  }
  entry;
};
typedef union bfd_sym_file_references_index_table_entry bfd_sym_file_references_index_table_entry;

/* CONSTANT POOL (CONST)

   The CONSTANT_POOL consists of entries that start on word boundaries.  The entries
   are referenced by byte index into the constant pool, not by record number.

   Each entry takes the form:

   <16-bit size>
   <that many bytes of stuff>

   Entries do not cross page boundaries.  */

typedef short bfd_sym_constant_pool_entry;

/* The DISK_SYMBOL_HEADER_BLOCK is the first record in a .SYM file,
   defining the physical characteristics of the symbolic information.
   The remainder of the * .SYM file is stored in fixed block
   allocations. For the purposes of paging, the * file is considered
   to be an array of dshb_page_size blocks, with block 0 (and *
   possibly more) devoted to the DISK_SYMBOL_HEADER_BLOCK.

   The dti_object_count field means that the allowed indices for that
   type of object are 0 .. dti_object_count. An index of 0, although
   allowed, is never done.  However, an 0th entry is created in the
   table.  That entry is filled with all zeroes.  The reason for this
   is to avoid off-by-one programming errors that would otherwise
   occur: an index of k *MEANS* k, not k-1 when going to the disk
   table.  */

struct bfd_sym_table_info
{
  unsigned long dti_first_page;   /* First page for this table.  */
  unsigned long dti_page_count;   /* Number of pages for the table.  */
  unsigned long dti_object_count; /* Number of objects in the table.  */
};
typedef struct bfd_sym_table_info bfd_sym_table_info;

struct bfd_sym_header_block
{
  unsigned char dshb_id[32];      /* Version information.  */
  unsigned short dshb_page_size;  /* Size of the pages/blocks.  */
  unsigned long dshb_hash_page;   /* Disk page for the hash table.  */
  unsigned long dshb_root_mte;    /* MTE index of the program root.  */
  unsigned long dshb_mod_date;    /* modification date of executable.  */
  bfd_sym_table_info dshb_frte;   /* Per TABLE information.  */
  bfd_sym_table_info dshb_rte;
  bfd_sym_table_info dshb_mte;
  bfd_sym_table_info dshb_cmte;
  bfd_sym_table_info dshb_cvte;
  bfd_sym_table_info dshb_csnte;
  bfd_sym_table_info dshb_clte;
  bfd_sym_table_info dshb_ctte;
  bfd_sym_table_info dshb_tte;
  bfd_sym_table_info dshb_nte;
  bfd_sym_table_info dshb_tinfo;
  bfd_sym_table_info dshb_fite;   /* File information.  */
  bfd_sym_table_info dshb_const;  /* Constant pool.  */

  unsigned char dshb_file_creator[4]; /* Executable's creator.  */
  unsigned char dshb_file_type[4];    /* Executable's file type.  */
};
typedef struct bfd_sym_header_block bfd_sym_header_block;

struct bfd_sym_data_struct
{
  unsigned char *name_table;
  bfd_sym_header_block header;
  bfd_sym_version version;
  bfd *sbfd;
};
typedef struct bfd_sym_data_struct bfd_sym_data_struct;

extern bfd_boolean bfd_sym_mkobject
  PARAMS ((bfd *));
extern void bfd_sym_print_symbol
  PARAMS ((bfd *, PTR, asymbol *, bfd_print_symbol_type));
extern bfd_boolean bfd_sym_valid
  PARAMS ((bfd *));
extern unsigned char * bfd_sym_read_name_table
  PARAMS ((bfd *, bfd_sym_header_block *));
extern void bfd_sym_parse_file_reference_v32
  PARAMS ((unsigned char *, size_t, bfd_sym_file_reference *));
extern void bfd_sym_parse_disk_table_v32
  PARAMS ((unsigned char *, size_t, bfd_sym_table_info *));
extern void bfd_sym_parse_header_v32
  PARAMS ((unsigned char *, size_t, bfd_sym_header_block *));
extern int bfd_sym_read_header_v32
  PARAMS ((bfd *, bfd_sym_header_block *));
extern int bfd_sym_read_header_v34
  PARAMS ((bfd *, bfd_sym_header_block *));
extern int bfd_sym_read_header
  PARAMS ((bfd *, bfd_sym_header_block *, bfd_sym_version));
extern int bfd_sym_read_version
  PARAMS ((bfd *, bfd_sym_version *));
extern void bfd_sym_display_table_summary
  PARAMS ((FILE *, bfd_sym_table_info *, const char *));
extern void bfd_sym_display_header
  PARAMS ((FILE *, bfd_sym_header_block *));
extern void bfd_sym_parse_resources_table_entry_v32
  PARAMS ((unsigned char *, size_t, bfd_sym_resources_table_entry *));
extern void bfd_sym_parse_modules_table_entry_v33
  PARAMS ((unsigned char *, size_t, bfd_sym_modules_table_entry *));
extern void bfd_sym_parse_file_references_table_entry_v32
  PARAMS ((unsigned char *, size_t, bfd_sym_file_references_table_entry *));
extern void bfd_sym_parse_contained_modules_table_entry_v32
  PARAMS ((unsigned char *, size_t, bfd_sym_contained_modules_table_entry *));
extern void bfd_sym_parse_contained_variables_table_entry_v32
  PARAMS ((unsigned char *, size_t, bfd_sym_contained_variables_table_entry *));
extern void bfd_sym_parse_contained_statements_table_entry_v32
  PARAMS ((unsigned char *, size_t, bfd_sym_contained_statements_table_entry *));
extern void bfd_sym_parse_contained_labels_table_entry_v32
  PARAMS ((unsigned char *, size_t, bfd_sym_contained_labels_table_entry *));
extern void bfd_sym_parse_type_table_entry_v32
  PARAMS ((unsigned char *, size_t, bfd_sym_type_table_entry *));
extern int bfd_sym_fetch_resources_table_entry
  PARAMS ((bfd *, bfd_sym_resources_table_entry *, unsigned long));
extern int bfd_sym_fetch_modules_table_entry
  PARAMS ((bfd *, bfd_sym_modules_table_entry *, unsigned long));
extern int bfd_sym_fetch_file_references_table_entry
  PARAMS ((bfd *, bfd_sym_file_references_table_entry *, unsigned long));
extern int bfd_sym_fetch_contained_modules_table_entry
  PARAMS ((bfd *, bfd_sym_contained_modules_table_entry *, unsigned long));
extern int bfd_sym_fetch_contained_variables_table_entry
  PARAMS ((bfd *, bfd_sym_contained_variables_table_entry *, unsigned long));
extern int bfd_sym_fetch_contained_statements_table_entry
  PARAMS ((bfd *, bfd_sym_contained_statements_table_entry *, unsigned long));
extern int bfd_sym_fetch_contained_labels_table_entry
  PARAMS ((bfd *, bfd_sym_contained_labels_table_entry *, unsigned long));
extern int bfd_sym_fetch_contained_types_table_entry
  PARAMS ((bfd *, bfd_sym_contained_types_table_entry *, unsigned long));
extern int bfd_sym_fetch_file_references_index_table_entry
  PARAMS ((bfd *, bfd_sym_file_references_index_table_entry *, unsigned long));
extern int bfd_sym_fetch_constant_pool_entry
  PARAMS ((bfd *, bfd_sym_constant_pool_entry *, unsigned long));
extern int bfd_sym_fetch_type_table_entry
  PARAMS ((bfd *, bfd_sym_type_table_entry *, unsigned long));
extern int bfd_sym_fetch_type_information_table_entry
  PARAMS ((bfd *, bfd_sym_type_information_table_entry *, unsigned long));
extern int bfd_sym_fetch_type_table_information
  PARAMS ((bfd *, bfd_sym_type_information_table_entry *, unsigned long));
extern const unsigned char * bfd_sym_symbol_name
  PARAMS ((bfd *, unsigned long));
extern const unsigned char * bfd_sym_module_name
  PARAMS ((bfd *, unsigned long));
extern const char * bfd_sym_unparse_storage_kind
  PARAMS ((enum bfd_sym_storage_kind));
extern const char * bfd_sym_unparse_storage_class
  PARAMS ((enum bfd_sym_storage_class));
extern const char * bfd_sym_unparse_module_kind
  PARAMS ((enum bfd_sym_module_kind));
extern const char * bfd_sym_unparse_symbol_scope
  PARAMS ((enum bfd_sym_symbol_scope));
extern void bfd_sym_print_file_reference
  PARAMS ((bfd *, FILE *, bfd_sym_file_reference *));
extern void bfd_sym_print_resources_table_entry
  PARAMS ((bfd *, FILE *, bfd_sym_resources_table_entry *));
extern void bfd_sym_print_modules_table_entry
  PARAMS ((bfd *, FILE *, bfd_sym_modules_table_entry *));
extern void bfd_sym_print_file_references_table_entry
  PARAMS ((bfd *, FILE *, bfd_sym_file_references_table_entry *));
extern void bfd_sym_print_contained_modules_table_entry
  PARAMS ((bfd *, FILE *, bfd_sym_contained_modules_table_entry *));
extern void bfd_sym_print_contained_variables_table_entry
  PARAMS ((bfd *, FILE *f, bfd_sym_contained_variables_table_entry *));
extern void bfd_sym_print_contained_statements_table_entry
  PARAMS ((bfd *, FILE *, bfd_sym_contained_statements_table_entry *));
extern void bfd_sym_print_contained_labels_table_entry
  PARAMS ((bfd *, FILE *, bfd_sym_contained_labels_table_entry *));
extern void bfd_sym_print_contained_types_table_entry
  PARAMS ((bfd *, FILE *, bfd_sym_contained_types_table_entry *));
extern const char * bfd_sym_type_operator_name
  PARAMS ((unsigned char));
extern const char * bfd_sym_type_basic_name
  PARAMS ((unsigned char));
extern int bfd_sym_fetch_long
  PARAMS ((unsigned char *, unsigned long, unsigned long, unsigned long *, long *));
extern void bfd_sym_print_type_information
  PARAMS ((bfd *, FILE *, unsigned char *, unsigned long, unsigned long, unsigned long *));
extern void bfd_sym_print_type_information_table_entry
  PARAMS ((bfd *, FILE *, bfd_sym_type_information_table_entry *));
extern void bfd_sym_print_file_references_index_table_entry
  PARAMS ((bfd *, FILE *, bfd_sym_file_references_index_table_entry *));
extern void bfd_sym_print_constant_pool_entry
  PARAMS ((bfd *, FILE *, bfd_sym_constant_pool_entry *));
extern unsigned char * bfd_sym_display_name_table_entry
  PARAMS ((bfd *, FILE *, unsigned char *));
extern void bfd_sym_display_name_table
  PARAMS ((bfd *, FILE *));
extern void bfd_sym_display_resources_table
  PARAMS ((bfd *, FILE *));
extern void bfd_sym_display_modules_table
  PARAMS ((bfd *, FILE *));
extern void bfd_sym_display_file_references_table
  PARAMS ((bfd *, FILE *));
extern void bfd_sym_display_contained_modules_table
  PARAMS ((bfd *, FILE *));
extern void bfd_sym_display_contained_variables_table
  PARAMS ((bfd *, FILE *));
extern void bfd_sym_display_contained_statements_table
  PARAMS ((bfd *, FILE *));
extern void bfd_sym_display_contained_labels_table
  PARAMS ((bfd *, FILE *));
extern void bfd_sym_display_contained_types_table
  PARAMS ((bfd *, FILE *));
extern void bfd_sym_display_file_references_index_table
  PARAMS ((bfd *, FILE *));
extern void bfd_sym_display_constant_pool
  PARAMS ((bfd *, FILE *));
extern void bfd_sym_display_type_information_table
  PARAMS ((bfd *, FILE *));
extern int bfd_sym_scan
  PARAMS ((bfd *, bfd_sym_version, bfd_sym_data_struct *));
extern const bfd_target * bfd_sym_object_p
  PARAMS ((bfd *));
extern asymbol * bfd_sym_make_empty_symbol
  PARAMS ((bfd *));
extern void bfd_sym_get_symbol_info
  PARAMS ((bfd *, asymbol *, symbol_info *));
extern long bfd_sym_get_symtab_upper_bound
  PARAMS ((bfd *));
extern long bfd_sym_get_symtab
  PARAMS ((bfd *, asymbol **));
extern int bfd_sym_sizeof_headers
  PARAMS ((bfd *, bfd_boolean));

#endif /* __xSYM_H__ */
