#include "bfd.h"

#include <stdio.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 boolean bfd_sym_mkobject (bfd *abfd);
extern void bfd_sym_print_symbol (bfd *abfd, PTR afile, asymbol *symbol, bfd_print_symbol_type how);
extern boolean bfd_sym_valid (bfd *abfd);
extern unsigned char *bfd_sym_read_name_table (bfd *abfd, bfd_sym_header_block *dshb);
extern void bfd_sym_parse_file_reference_v32 (unsigned char *buf, size_t len, bfd_sym_file_reference *entry);
extern void bfd_sym_parse_disk_table_v32 (unsigned char *buf, size_t len, bfd_sym_table_info *table);
extern void bfd_sym_parse_header_v32 (unsigned char *buf, size_t len, bfd_sym_header_block *header);
extern int bfd_sym_read_header_v32 (bfd *abfd, bfd_sym_header_block *header);
extern int bfd_sym_read_header_v34 (bfd *abfd, bfd_sym_header_block *header);
extern int bfd_sym_read_header (bfd *abfd, bfd_sym_header_block *header, bfd_sym_version version);
extern int bfd_sym_read_version (bfd *abfd, bfd_sym_version *version);
extern void bfd_sym_display_table_summary (FILE *f, bfd_sym_table_info *dti, const char *name);
extern void bfd_sym_display_header (FILE *f, bfd_sym_header_block *dshb);

extern void bfd_sym_parse_resources_table_entry_v32
(unsigned char *buf, size_t len, bfd_sym_resources_table_entry *entry);
extern void bfd_sym_parse_modules_table_entry_v33
(unsigned char *buf, size_t len, bfd_sym_modules_table_entry *entry);
extern void bfd_sym_parse_file_references_table_entry_v32
(unsigned char *buf, size_t len, bfd_sym_file_references_table_entry *entry);
extern void bfd_sym_parse_contained_modules_table_entry_v32
(unsigned char *buf, size_t len, bfd_sym_contained_modules_table_entry *entry);
extern void bfd_sym_parse_contained_variables_table_entry_v32
(unsigned char *buf, size_t len, bfd_sym_contained_variables_table_entry *entry);
extern void bfd_sym_parse_contained_statements_table_entry_v32
(unsigned char *buf, size_t len, bfd_sym_contained_statements_table_entry *entry);
extern void bfd_sym_parse_contained_labels_table_entry_v32
(unsigned char *buf, size_t len, bfd_sym_contained_labels_table_entry *entry);
extern void bfd_sym_parse_type_table_entry_v32
(unsigned char *buf, size_t len, bfd_sym_type_table_entry *entry);

extern int bfd_sym_fetch_resources_table_entry
(bfd *abfd, bfd_sym_resources_table_entry *entry, unsigned long index);
extern int bfd_sym_fetch_modules_table_entry
(bfd *abfd, bfd_sym_modules_table_entry *entry, unsigned long index);
extern int bfd_sym_fetch_file_references_table_entry
(bfd *abfd, bfd_sym_file_references_table_entry *entry, unsigned long index);
extern int bfd_sym_fetch_contained_modules_table_entry
(bfd *abfd, bfd_sym_contained_modules_table_entry *entry, unsigned long index);
extern int bfd_sym_fetch_contained_variables_table_entry
(bfd *abfd, bfd_sym_contained_variables_table_entry *entry, unsigned long index);
extern int bfd_sym_fetch_contained_statements_table_entry
(bfd *abfd, bfd_sym_contained_statements_table_entry *entry, unsigned long index);
extern int bfd_sym_fetch_contained_labels_table_entry
(bfd *abfd, bfd_sym_contained_labels_table_entry *entry, unsigned long index);
extern int bfd_sym_fetch_contained_types_table_entry
(bfd *abfd, bfd_sym_contained_types_table_entry *entry, unsigned long index);
extern int bfd_sym_fetch_file_references_index_table_entry
(bfd *abfd, bfd_sym_file_references_index_table_entry *entry, unsigned long index);
extern int bfd_sym_fetch_constant_pool_entry
(bfd *abfd, bfd_sym_constant_pool_entry *entry, unsigned long index);
extern int bfd_sym_fetch_type_table_entry
(bfd *abfd, bfd_sym_type_table_entry *entry, unsigned long index);
extern int bfd_sym_fetch_type_information_table_entry
(bfd *abfd, bfd_sym_type_information_table_entry *entry, unsigned long offset);
extern int bfd_sym_fetch_type_table_information
(bfd *abfd, bfd_sym_type_information_table_entry *entry, unsigned long index);

extern const unsigned char *bfd_sym_symbol_name (bfd *abfd, unsigned long index);
extern const unsigned char *bfd_sym_module_name (bfd *abfd, unsigned long index);
extern const char *bfd_sym_unparse_storage_kind (enum bfd_sym_storage_kind kind);
extern const char *bfd_sym_unparse_storage_class (enum bfd_sym_storage_class kind);
extern const char *bfd_sym_unparse_module_kind (enum bfd_sym_module_kind kind);
extern const char *bfd_sym_unparse_symbol_scope (enum bfd_sym_symbol_scope scope);

extern void bfd_sym_print_file_reference
(bfd *abfd, FILE *f, bfd_sym_file_reference *entry);
extern void bfd_sym_print_resources_table_entry
(bfd *abfd, FILE *f, bfd_sym_resources_table_entry *entry);
extern void bfd_sym_print_modules_table_entry
(bfd *abfd, FILE *f, bfd_sym_modules_table_entry *entry);
extern void bfd_sym_print_file_references_table_entry
(bfd *abfd, FILE *f, bfd_sym_file_references_table_entry *entry);
extern void bfd_sym_print_contained_modules_table_entry
(bfd *abfd, FILE *f, bfd_sym_contained_modules_table_entry *entry);
extern void bfd_sym_print_contained_variables_table_entry
(bfd *abfd, FILE *f, bfd_sym_contained_variables_table_entry *entry);
extern void bfd_sym_print_contained_statements_table_entry
(bfd *abfd, FILE *f, bfd_sym_contained_statements_table_entry *entry);
extern void bfd_sym_print_contained_labels_table_entry
(bfd *abfd, FILE *f, bfd_sym_contained_labels_table_entry *entry);
extern void bfd_sym_print_contained_types_table_entry
(bfd *abfd, FILE *f, bfd_sym_contained_types_table_entry *entry);
extern const char *bfd_sym_type_operator_name (unsigned char num);
extern const char *bfd_sym_type_basic_name (unsigned char num);

extern int bfd_sym_fetch_long
(unsigned char *buf, unsigned long len, unsigned long offset, unsigned long *offsetptr, long *value);
extern void bfd_sym_print_type_information
(bfd *abfd, FILE *f, unsigned char *buf, unsigned long len, unsigned long offset, unsigned long *offsetptr);

extern void bfd_sym_print_type_information_table_entry
(bfd *abfd, FILE *f, bfd_sym_type_information_table_entry *entry);
extern void bfd_sym_print_file_references_index_table_entry
(bfd *abfd, FILE *f, bfd_sym_file_references_index_table_entry *entry);
void bfd_sym_print_constant_pool_entry
(bfd *abfd, FILE *f, bfd_sym_constant_pool_entry *entry);

extern unsigned char *bfd_sym_display_name_table_entry (bfd *abfd, FILE *f, unsigned char *entry);

extern void bfd_sym_display_name_table (bfd *abfd, FILE *f);
extern void bfd_sym_display_resources_table (bfd *abfd, FILE *f);
extern void bfd_sym_display_modules_table (bfd *abfd, FILE *f);
extern void bfd_sym_display_file_references_table (bfd *abfd, FILE *f);
extern void bfd_sym_display_contained_modules_table (bfd *abfd, FILE *f);
extern void bfd_sym_display_contained_variables_table (bfd *abfd, FILE *f);
extern void bfd_sym_display_contained_statements_table (bfd *abfd, FILE *f);
extern void bfd_sym_display_contained_labels_table (bfd *abfd, FILE *f);
extern void bfd_sym_display_contained_types_table (bfd *abfd, FILE *f);
extern void bfd_sym_display_file_references_index_table (bfd *abfd, FILE *f);
extern void bfd_sym_display_constant_pool (bfd *abfd, FILE *f);
extern void bfd_sym_display_type_information_table (bfd *abfd, FILE *f);

extern const bfd_target *bfd_sym_object_p (bfd *abfd);
extern asymbol *bfd_sym_make_empty_symbol (bfd *abfd);
extern void bfd_sym_get_symbol_info (bfd *ignore_abfd, asymbol *symbol, symbol_info *ret);
extern long bfd_sym_get_symtab_upper_bound (bfd *abfd);
extern long bfd_sym_get_symtab (bfd *abfd, asymbol **sym);
extern int bfd_sym_sizeof_headers (bfd *abfd, boolean exec);
