/* Definitions for reading symbol files into GDB.
   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
   2000, 2001, 2002, 2003
   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.  */

#if !defined (SYMFILE_H)
#define SYMFILE_H

/* This file requires that you first include "bfd.h".  */

/* Opaque declarations.  */
struct objfile;
struct obstack;
struct block;

/* Partial symbols are stored in the psymbol_cache and pointers to them
   are kept in a dynamically grown array that is obtained from malloc and
   grown as necessary via realloc.  Each objfile typically has two of these,
   one for global symbols and one for static symbols.  Although this adds
   a level of indirection for storing or accessing the partial symbols,
   it allows us to throw away duplicate psymbols and set all pointers
   to the single saved instance. */

struct psymbol_allocation_list
  {

    /* Pointer to beginning of dynamically allocated array of pointers to
       partial symbols.  The array is dynamically expanded as necessary to
       accommodate more pointers. */

    struct partial_symbol **list;

    /* Pointer to next available slot in which to store a pointer to a partial
       symbol. */

    struct partial_symbol **next;

    /* Number of allocated pointer slots in current dynamic array (not the
       number of bytes of storage).  The "next" pointer will always point
       somewhere between list[0] and list[size], and when at list[size] the
       array will be expanded on the next attempt to store a pointer. */

    int size;
  };

/* Define an array of addresses to accommodate non-contiguous dynamic
   loading of modules.  This is for use when entering commands, so we
   can keep track of the section names until we read the file and
   can map them to bfd sections.  This structure is also used by
   solib.c to communicate the section addresses in shared objects to
   symbol_file_add (). */
 
#define MAX_SECTIONS 64
struct section_addr_info 
{
  /* Sections whose names are file format dependent. */
  struct other_sections
  {
    CORE_ADDR addr;
    char *name;
    int sectindex;
  } other[MAX_SECTIONS];
};

/* Structure to keep track of symbol reading functions for various
   object file types.  */

struct sym_fns
  {

    /* BFD flavour that we handle, or (as a special kludge, see xcoffread.c,
       (enum bfd_flavour)-1 for xcoff).  */

    enum bfd_flavour sym_flavour;

    /* Initializes anything that is global to the entire symbol table.  It is
       called during symbol_file_add, when we begin debugging an entirely new
       program. */

    void (*sym_new_init) (struct objfile *);

    /* Reads any initial information from a symbol file, and initializes the
       struct sym_fns SF in preparation for sym_read().  It is called every
       time we read a symbol file for any reason. */

    void (*sym_init) (struct objfile *);

    /* sym_read (objfile, mainline)
       Reads a symbol file into a psymtab (or possibly a symtab).
       OBJFILE is the objfile struct for the file we are reading.
       MAINLINE is 1 if this is the
       main symbol table being read, and 0 if a secondary
       symbol file (e.g. shared library or dynamically loaded file)
       is being read.  */

    void (*sym_read) (struct objfile *, int);

    /* Called when we are finished with an objfile.  Should do all cleanup
       that is specific to the object file format for the particular objfile. */

    void (*sym_finish) (struct objfile *);

    /* This function produces a file-dependent section_offsets structure,
       allocated in the objfile's storage, and based on the parameter.
       The parameter is currently a CORE_ADDR (FIXME!) for backward compatibility
       with the higher levels of GDB.  It should probably be changed to
       a string, where NULL means the default, and others are parsed in a file
       dependent way. */

    void (*sym_offsets) (struct objfile *, struct section_addr_info *);

    /* Finds the next struct sym_fns.  They are allocated and initialized
       in whatever module implements the functions pointed to; an 
       initializer calls add_symtab_fns to add them to the global chain.  */

    struct sym_fns *next;

  };

/* The default version of sym_fns.sym_offsets for readers that don't
   do anything special.  */

extern void default_symfile_offsets (struct objfile *objfile,
				     struct section_addr_info *);


extern void extend_psymbol_list (struct psymbol_allocation_list *,
				 struct objfile *);

/* Add any kind of symbol to a psymbol_allocation_list. */

/* #include "demangle.h" */

extern void
add_psymbol_to_list (char *, int, namespace_enum, enum address_class,
		     struct psymbol_allocation_list *, long, CORE_ADDR,
		     enum language, struct objfile *);

extern void
add_psymbol_with_dem_name_to_list (char *, int, char *, int, namespace_enum,
				   enum address_class,
				   struct psymbol_allocation_list *,
				   long, CORE_ADDR,
				   enum language, struct objfile *);


extern void init_psymbol_list (struct objfile *, int);

extern void sort_pst_symbols (struct partial_symtab *);

extern struct symtab *allocate_symtab (char *, struct objfile *);

extern int free_named_symtabs (char *);

extern void fill_in_vptr_fieldno (struct type *);

extern void add_symtab_fns (struct sym_fns *);

extern void init_entry_point_info (struct objfile *);

extern void syms_from_objfile (struct objfile *,
                               struct section_addr_info *, 
                               struct section_offsets *, int,
                               int, int);

extern void new_symfile_objfile (struct objfile *, int, int);

extern struct objfile *symbol_file_add (char *, int,
					struct section_addr_info *, int, int);

/* Build (allocate and populate) a section_addr_info struct from
   an existing section table. */

struct section_table;
extern struct section_addr_info *
build_section_addr_info_from_section_table (const struct section_table *start,
                                            const struct section_table *end);

/* Free all memory allocated by build_section_addr_info_from_section_table. */

extern void free_section_addr_info (struct section_addr_info *);


extern struct partial_symtab *start_psymtab_common (struct objfile *,
						    struct section_offsets *,
						    char *, CORE_ADDR,
						    struct partial_symbol **,
						    struct partial_symbol **);

/* Sorting your symbols for fast lookup or alphabetical printing.  */

extern void sort_block_syms (struct block *);

extern void sort_symtab_syms (struct symtab *);

/* Make a copy of the string at PTR with SIZE characters in the symbol obstack
   (and add a null character at the end in the copy).
   Returns the address of the copy.  */

extern char *obsavestring (const char *, int, struct obstack *);

/* Concatenate strings S1, S2 and S3; return the new string.
   Space is found in the symbol_obstack.  */

extern char *obconcat (struct obstack *obstackp, const char *, const char *,
		       const char *);

			/*   Variables   */

/* If non-zero, shared library symbols will be added automatically
   when the inferior is created, new libraries are loaded, or when
   attaching to the inferior.  This is almost always what users will
   want to have happen; but for very large programs, the startup time
   will be excessive, and so if this is a problem, the user can clear
   this flag and then add the shared library symbols as needed.  Note
   that there is a potential for confusion, since if the shared
   library symbols are not loaded, commands like "info fun" will *not*
   report all the functions that are actually present. */

extern int auto_solib_add;

/* For systems that support it, a threshold size in megabytes.  If
   automatically adding a new library's symbol table to those already
   known to the debugger would cause the total shared library symbol
   size to exceed this threshhold, then the shlib's symbols are not
   added.  The threshold is ignored if the user explicitly asks for a
   shlib to be added, such as when using the "sharedlibrary"
   command. */

extern int auto_solib_limit;

/* From symfile.c */

extern CORE_ADDR entry_point_address (void);

extern struct partial_symtab *allocate_psymtab (char *, struct objfile *);

extern void discard_psymtab (struct partial_symtab *);

extern void find_lowest_section (bfd *, asection *, void *);

extern bfd *symfile_bfd_open (char *);

extern int get_section_index (struct objfile *, char *);

/* Utility functions for overlay sections: */
extern enum overlay_debugging_state {
  ovly_off, 
  ovly_on, 
  ovly_auto
} overlay_debugging;
extern int overlay_cache_invalid;

/* return the "mapped" overlay section  containing the PC */
extern asection *find_pc_mapped_section (CORE_ADDR);

/* return any overlay section containing the PC (even in its LMA region) */
extern asection *find_pc_overlay (CORE_ADDR);

/* return true if the section is an overlay */
extern int section_is_overlay (asection *);

/* return true if the overlay section is currently "mapped" */
extern int section_is_mapped (asection *);

/* return true if pc belongs to section's VMA */
extern CORE_ADDR pc_in_mapped_range (CORE_ADDR, asection *);

/* return true if pc belongs to section's LMA */
extern CORE_ADDR pc_in_unmapped_range (CORE_ADDR, asection *);

/* map an address from a section's LMA to its VMA */
extern CORE_ADDR overlay_mapped_address (CORE_ADDR, asection *);

/* map an address from a section's VMA to its LMA */
extern CORE_ADDR overlay_unmapped_address (CORE_ADDR, asection *);

/* convert an address in an overlay section (force into VMA range) */
extern CORE_ADDR symbol_overlayed_address (CORE_ADDR, asection *);

/* Load symbols from a file. */
extern void symbol_file_add_main (char *args, int from_tty);

/* Clear GDB symbol tables. */
extern void symbol_file_clear (int from_tty);

extern bfd_byte *symfile_relocate_debug_section (bfd *abfd, asection *sectp,
						 bfd_byte *buf);

/* From dwarfread.c */

extern void
dwarf_build_psymtabs (struct objfile *, int, file_ptr, unsigned int,
		      file_ptr, unsigned int);

/* From dwarf2read.c */

extern int dwarf2_has_info (bfd * abfd);

extern void dwarf2_build_psymtabs (struct objfile *, int);
extern void dwarf2_build_frame_info (struct objfile *);

/* From mdebugread.c */

/* Hack to force structures to exist before use in parameter list.  */
struct ecoff_debug_hack
  {
    struct ecoff_debug_swap *a;
    struct ecoff_debug_info *b;
  };
extern void
mdebug_build_psymtabs (struct objfile *,
		       const struct ecoff_debug_swap *,
		       struct ecoff_debug_info *);

extern void
elfmdebug_build_psymtabs (struct objfile *,
			  const struct ecoff_debug_swap *, asection *);

#endif /* !defined(SYMFILE_H) */
