/* xSYM symbol-file support for BFD.
   Copyright (C) 1999-2021 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 3 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., 51 Franklin Street - Fifth Floor, Boston,
   MA 02110-1301, USA.  */

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

#endif /* __xSYM_H__ */
