/* Minimal symbol table definitions for GDB.

   Copyright (C) 2011-2016 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 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, see <http://www.gnu.org/licenses/>.  */

#ifndef MINSYMS_H
#define MINSYMS_H

/* Several lookup functions return both a minimal symbol and the
   objfile in which it is found.  This structure is used in these
   cases.  */

struct bound_minimal_symbol
{
  /* The minimal symbol that was found, or NULL if no minimal symbol
     was found.  */

  struct minimal_symbol *minsym;

  /* If MINSYM is not NULL, then this is the objfile in which the
     symbol is defined.  */

  struct objfile *objfile;
};

/* This header declares most of the API for dealing with minimal
   symbols and minimal symbol tables.  A few things are declared
   elsewhere; see below.

   A minimal symbol is a symbol for which there is no direct debug
   information.  For example, for an ELF binary, minimal symbols are
   created from the ELF symbol table.

   For the definition of the minimal symbol structure, see struct
   minimal_symbol in symtab.h.

   Minimal symbols are stored in tables attached to an objfile; see
   objfiles.h for details.  Code should generally treat these tables
   as opaque and use functions provided by minsyms.c to inspect them.
*/

/* Prepare to start collecting minimal symbols.  This should be called
   by a symbol reader to initialize the minimal symbol module.
   Currently, minimal symbol table creation is not reentrant; it
   relies on global (static) variables in minsyms.c.  */

void init_minimal_symbol_collection (void);

/* Return a cleanup which is used to clean up the global state left
   over by minimal symbol creation.  After calling
   init_minimal_symbol_collection, a symbol reader should call this
   function.  Then, after all minimal symbols have been read,
   regardless of whether they are installed or not, the cleanup
   returned by this function should be run.  */

struct cleanup *make_cleanup_discard_minimal_symbols (void);

/* Record a new minimal symbol.  This is the "full" entry point;
   simpler convenience entry points are also provided below.
   
   This returns a new minimal symbol.  It is ok to modify the returned
   minimal symbol (though generally not necessary).  It is not ok,
   though, to stash the pointer anywhere; as minimal symbols may be
   moved after creation.  The memory for the returned minimal symbol
   is still owned by the minsyms.c code, and should not be freed.
   
   Arguments are:

   NAME - the symbol's name
   NAME_LEN - the length of the name
   COPY_NAME - if true, the minsym code must make a copy of NAME.  If
   false, then NAME must be NUL-terminated, and must have a lifetime
   that is at least as long as OBJFILE's lifetime.
   ADDRESS - the address of the symbol
   MS_TYPE - the type of the symbol
   SECTION - the symbol's section
   appropriate obj_section for the minimal symbol.  This can be NULL.
   OBJFILE - the objfile associated with the minimal symbol.  */

struct minimal_symbol *prim_record_minimal_symbol_full
    (const char *name,
     int name_len,
     int copy_name,
     CORE_ADDR address,
     enum minimal_symbol_type ms_type,
     int section,
     struct objfile *objfile);

/* Like prim_record_minimal_symbol_full, but:
   - uses strlen to compute NAME_LEN,
   - passes COPY_NAME = 1,
   - and passes a default SECTION, depending on the type
   
   This variant does not return the new symbol.  */

void prim_record_minimal_symbol (const char *, CORE_ADDR,
				 enum minimal_symbol_type,
				 struct objfile *);

/* Like prim_record_minimal_symbol_full, but:
   - uses strlen to compute NAME_LEN,
   - passes COPY_NAME = 1.  */

struct minimal_symbol *prim_record_minimal_symbol_and_info
    (const char *,
     CORE_ADDR,
     enum minimal_symbol_type,
     int section,
     struct objfile *);

/* Install the minimal symbols that have been collected into the given
   objfile.  After this is called, the cleanup returned by
   make_cleanup_discard_minimal_symbols should be run in order to
   clean up global state.  */

void install_minimal_symbols (struct objfile *);

/* Create the terminating entry of OBJFILE's minimal symbol table.
   If OBJFILE->msymbols is zero, allocate a single entry from
   OBJFILE->objfile_obstack; otherwise, just initialize
   OBJFILE->msymbols[OBJFILE->minimal_symbol_count].  */

void terminate_minimal_symbol_table (struct objfile *objfile);



/* Compute a hash code for the string argument.  */

unsigned int msymbol_hash (const char *);

/* Like msymbol_hash, but compute a hash code that is compatible with
   strcmp_iw.  */

unsigned int msymbol_hash_iw (const char *);

/* Compute the next hash value from previous HASH and the character C.  This
   is only a GDB in-memory computed value with no external files compatibility
   requirements.  */

#define SYMBOL_HASH_NEXT(hash, c)			\
  ((hash) * 67 + tolower ((unsigned char) (c)) - 113)



/* Look through all the current minimal symbol tables and find the
   first minimal symbol that matches NAME.  If OBJF is non-NULL, limit
   the search to that objfile.  If SFILE is non-NULL, the only
   file-scope symbols considered will be from that source file (global
   symbols are still preferred).  Returns a bound minimal symbol that
   matches, or an empty bound minimal symbol if no match is found.  */

struct bound_minimal_symbol lookup_minimal_symbol (const char *,
						   const char *,
						   struct objfile *);

/* Like lookup_minimal_symbol, but searches all files and
   objfiles.  */

struct bound_minimal_symbol lookup_bound_minimal_symbol (const char *);

/* Find the minimal symbol named NAME, and return both the minsym
   struct and its objfile.  This only checks the linkage name.  */

struct bound_minimal_symbol lookup_minimal_symbol_and_objfile (const char *);

/* Look through all the current minimal symbol tables and find the
   first minimal symbol that matches NAME and has text type.  If OBJF
   is non-NULL, limit the search to that objfile.  Returns a bound
   minimal symbol that matches, or an "empty" bound minimal symbol
   otherwise.

   This function only searches the mangled (linkage) names.  */

struct bound_minimal_symbol lookup_minimal_symbol_text (const char *,
							struct objfile *);

/* Look through all the current minimal symbol tables and find the
   first minimal symbol that matches NAME and is a solib trampoline.
   If OBJF is non-NULL, limit the search to that objfile.  Returns a
   pointer to the minimal symbol that matches, or NULL if no match is
   found.

   This function only searches the mangled (linkage) names.  */

struct bound_minimal_symbol lookup_minimal_symbol_solib_trampoline
    (const char *,
     struct objfile *);

/* Look through all the current minimal symbol tables and find the
   first minimal symbol that matches NAME and PC.  If OBJF is non-NULL,
   limit the search to that objfile.  Returns a pointer to the minimal
   symbol that matches, or NULL if no match is found.  */

struct minimal_symbol *lookup_minimal_symbol_by_pc_name
    (CORE_ADDR, const char *, struct objfile *);

/* Search through the minimal symbol table for each objfile and find
   the symbol whose address is the largest address that is still less
   than or equal to PC, and which matches SECTION.

   If SECTION is NULL, this uses the result of find_pc_section
   instead.

   The result has a non-NULL 'minsym' member if such a symbol is
   found, or NULL if PC is not in a suitable range.  */

struct bound_minimal_symbol lookup_minimal_symbol_by_pc_section
    (CORE_ADDR,
     struct obj_section *);

/* Backward compatibility: search through the minimal symbol table 
   for a matching PC (no section given).
   
   This is a wrapper that calls lookup_minimal_symbol_by_pc_section
   with a NULL section argument.  */

struct bound_minimal_symbol lookup_minimal_symbol_by_pc (CORE_ADDR);

/* Iterate over all the minimal symbols in the objfile OBJF which
   match NAME.  Both the ordinary and demangled names of each symbol
   are considered.  The caller is responsible for canonicalizing NAME,
   should that need to be done.

   For each matching symbol, CALLBACK is called with the symbol and
   USER_DATA as arguments.  */

void iterate_over_minimal_symbols (struct objfile *objf,
				   const char *name,
				   void (*callback) (struct minimal_symbol *,
						     void *),
				   void *user_data);

/* Compute the upper bound of MINSYM.  The upper bound is the last
   address thought to be part of the symbol.  If the symbol has a
   size, it is used.  Otherwise use the lesser of the next minimal
   symbol in the same section, or the end of the section, as the end
   of the function.  */

CORE_ADDR minimal_symbol_upper_bound (struct bound_minimal_symbol minsym);

#endif /* MINSYMS_H */
