/* Symbol table definitions for GDB.

   Copyright (C) 1986-2022 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/>.  */

#if !defined (SYMTAB_H)
#define SYMTAB_H 1

#include <array>
#include <vector>
#include <string>
#include <set>
#include "gdbsupport/gdb_vecs.h"
#include "gdbtypes.h"
#include "gdbsupport/gdb_obstack.h"
#include "gdbsupport/gdb_regex.h"
#include "gdbsupport/enum-flags.h"
#include "gdbsupport/function-view.h"
#include "gdbsupport/gdb_optional.h"
#include "gdbsupport/gdb_string_view.h"
#include "gdbsupport/next-iterator.h"
#include "gdbsupport/iterator-range.h"
#include "completer.h"
#include "gdb-demangle.h"
#include "split-name.h"

/* Opaque declarations.  */
struct ui_file;
class frame_info_ptr;
struct symbol;
struct obstack;
struct objfile;
struct block;
struct blockvector;
struct axs_value;
struct agent_expr;
struct program_space;
struct language_defn;
struct common_block;
struct obj_section;
struct cmd_list_element;
class probe;
struct lookup_name_info;
struct code_breakpoint;

/* How to match a lookup name against a symbol search name.  */
enum class symbol_name_match_type
{
  /* Wild matching.  Matches unqualified symbol names in all
     namespace/module/packages, etc.  */
  WILD,

  /* Full matching.  The lookup name indicates a fully-qualified name,
     and only matches symbol search names in the specified
     namespace/module/package.  */
  FULL,

  /* Search name matching.  This is like FULL, but the search name did
     not come from the user; instead it is already a search name
     retrieved from a search_name () call.
     For Ada, this avoids re-encoding an already-encoded search name
     (which would potentially incorrectly lowercase letters in the
     linkage/search name that should remain uppercase).  For C++, it
     avoids trying to demangle a name we already know is
     demangled.  */
  SEARCH_NAME,

  /* Expression matching.  The same as FULL matching in most
     languages.  The same as WILD matching in Ada.  */
  EXPRESSION,
};

/* Hash the given symbol search name according to LANGUAGE's
   rules.  */
extern unsigned int search_name_hash (enum language language,
				      const char *search_name);

/* Ada-specific bits of a lookup_name_info object.  This is lazily
   constructed on demand.  */

class ada_lookup_name_info final
{
 public:
  /* Construct.  */
  explicit ada_lookup_name_info (const lookup_name_info &lookup_name);

  /* Compare SYMBOL_SEARCH_NAME with our lookup name, using MATCH_TYPE
     as name match type.  Returns true if there's a match, false
     otherwise.  If non-NULL, store the matching results in MATCH.  */
  bool matches (const char *symbol_search_name,
		symbol_name_match_type match_type,
		completion_match_result *comp_match_res) const;

  /* The Ada-encoded lookup name.  */
  const std::string &lookup_name () const
  { return m_encoded_name; }

  /* Return true if we're supposed to be doing a wild match look
     up.  */
  bool wild_match_p () const
  { return m_wild_match_p; }

  /* Return true if we're looking up a name inside package
     Standard.  */
  bool standard_p () const
  { return m_standard_p; }

  /* Return true if doing a verbatim match.  */
  bool verbatim_p () const
  { return m_verbatim_p; }

  /* A wrapper for ::split_name that handles some Ada-specific
     peculiarities.  */
  std::vector<gdb::string_view> split_name () const
  {
    if (m_verbatim_p || m_standard_p)
      {
	std::vector<gdb::string_view> result;
	if (m_standard_p)
	  result.emplace_back ("standard");
	result.emplace_back (m_encoded_name);
	return result;
      }
    return ::split_name (m_encoded_name.c_str (), split_style::UNDERSCORE);
  }

private:
  /* The Ada-encoded lookup name.  */
  std::string m_encoded_name;

  /* Whether the user-provided lookup name was Ada encoded.  If so,
     then return encoded names in the 'matches' method's 'completion
     match result' output.  */
  bool m_encoded_p : 1;

  /* True if really doing wild matching.  Even if the user requests
     wild matching, some cases require full matching.  */
  bool m_wild_match_p : 1;

  /* True if doing a verbatim match.  This is true if the decoded
     version of the symbol name is wrapped in '<'/'>'.  This is an
     escape hatch users can use to look up symbols the Ada encoding
     does not understand.  */
  bool m_verbatim_p : 1;

   /* True if the user specified a symbol name that is inside package
      Standard.  Symbol names inside package Standard are handled
      specially.  We always do a non-wild match of the symbol name
      without the "standard__" prefix, and only search static and
      global symbols.  This was primarily introduced in order to allow
      the user to specifically access the standard exceptions using,
      for instance, Standard.Constraint_Error when Constraint_Error is
      ambiguous (due to the user defining its own Constraint_Error
      entity inside its program).  */
  bool m_standard_p : 1;
};

/* Language-specific bits of a lookup_name_info object, for languages
   that do name searching using demangled names (C++/D/Go).  This is
   lazily constructed on demand.  */

struct demangle_for_lookup_info final
{
public:
  demangle_for_lookup_info (const lookup_name_info &lookup_name,
			    language lang);

  /* The demangled lookup name.  */
  const std::string &lookup_name () const
  { return m_demangled_name; }

private:
  /* The demangled lookup name.  */
  std::string m_demangled_name;
};

/* Object that aggregates all information related to a symbol lookup
   name.  I.e., the name that is matched against the symbol's search
   name.  Caches per-language information so that it doesn't require
   recomputing it for every symbol comparison, like for example the
   Ada encoded name and the symbol's name hash for a given language.
   The object is conceptually immutable once constructed, and thus has
   no setters.  This is to prevent some code path from tweaking some
   property of the lookup name for some local reason and accidentally
   altering the results of any continuing search(es).
   lookup_name_info objects are generally passed around as a const
   reference to reinforce that.  (They're not passed around by value
   because they're not small.)  */
class lookup_name_info final
{
 public:
  /* We delete this overload so that the callers are required to
     explicitly handle the lifetime of the name.  */
  lookup_name_info (std::string &&name,
		    symbol_name_match_type match_type,
		    bool completion_mode = false,
		    bool ignore_parameters = false) = delete;

  /* This overload requires that NAME have a lifetime at least as long
     as the lifetime of this object.  */
  lookup_name_info (const std::string &name,
		    symbol_name_match_type match_type,
		    bool completion_mode = false,
		    bool ignore_parameters = false)
    : m_match_type (match_type),
      m_completion_mode (completion_mode),
      m_ignore_parameters (ignore_parameters),
      m_name (name)
  {}

  /* This overload requires that NAME have a lifetime at least as long
     as the lifetime of this object.  */
  lookup_name_info (const char *name,
		    symbol_name_match_type match_type,
		    bool completion_mode = false,
		    bool ignore_parameters = false)
    : m_match_type (match_type),
      m_completion_mode (completion_mode),
      m_ignore_parameters (ignore_parameters),
      m_name (name)
  {}

  /* Getters.  See description of each corresponding field.  */
  symbol_name_match_type match_type () const { return m_match_type; }
  bool completion_mode () const { return m_completion_mode; }
  gdb::string_view name () const { return m_name; }
  const bool ignore_parameters () const { return m_ignore_parameters; }

  /* Like the "name" method but guarantees that the returned string is
     \0-terminated.  */
  const char *c_str () const
  {
    /* Actually this is always guaranteed due to how the class is
       constructed.  */
    return m_name.data ();
  }

  /* Return a version of this lookup name that is usable with
     comparisons against symbols have no parameter info, such as
     psymbols and GDB index symbols.  */
  lookup_name_info make_ignore_params () const
  {
    return lookup_name_info (c_str (), m_match_type, m_completion_mode,
			     true /* ignore params */);
  }

  /* Get the search name hash for searches in language LANG.  */
  unsigned int search_name_hash (language lang) const
  {
    /* Only compute each language's hash once.  */
    if (!m_demangled_hashes_p[lang])
      {
	m_demangled_hashes[lang]
	  = ::search_name_hash (lang, language_lookup_name (lang));
	m_demangled_hashes_p[lang] = true;
      }
    return m_demangled_hashes[lang];
  }

  /* Get the search name for searches in language LANG.  */
  const char *language_lookup_name (language lang) const
  {
    switch (lang)
      {
      case language_ada:
	return ada ().lookup_name ().c_str ();
      case language_cplus:
	return cplus ().lookup_name ().c_str ();
      case language_d:
	return d ().lookup_name ().c_str ();
      case language_go:
	return go ().lookup_name ().c_str ();
      default:
	return m_name.data ();
      }
  }

  /* A wrapper for ::split_name (see split-name.h) that splits this
     name, and that handles any language-specific peculiarities.  */  
  std::vector<gdb::string_view> split_name (language lang) const
  {
    if (lang == language_ada)
      return ada ().split_name ();
    split_style style = split_style::NONE;
    switch (lang)
      {
      case language_cplus:
      case language_rust:
	style = split_style::CXX;
	break;
      case language_d:
      case language_go:
	style = split_style::DOT;
	break;
      }
    return ::split_name (language_lookup_name (lang), style);
  }

  /* Get the Ada-specific lookup info.  */
  const ada_lookup_name_info &ada () const
  {
    maybe_init (m_ada);
    return *m_ada;
  }

  /* Get the C++-specific lookup info.  */
  const demangle_for_lookup_info &cplus () const
  {
    maybe_init (m_cplus, language_cplus);
    return *m_cplus;
  }

  /* Get the D-specific lookup info.  */
  const demangle_for_lookup_info &d () const
  {
    maybe_init (m_d, language_d);
    return *m_d;
  }

  /* Get the Go-specific lookup info.  */
  const demangle_for_lookup_info &go () const
  {
    maybe_init (m_go, language_go);
    return *m_go;
  }

  /* Get a reference to a lookup_name_info object that matches any
     symbol name.  */
  static const lookup_name_info &match_any ();

private:
  /* Initialize FIELD, if not initialized yet.  */
  template<typename Field, typename... Args>
  void maybe_init (Field &field, Args&&... args) const
  {
    if (!field)
      field.emplace (*this, std::forward<Args> (args)...);
  }

  /* The lookup info as passed to the ctor.  */
  symbol_name_match_type m_match_type;
  bool m_completion_mode;
  bool m_ignore_parameters;
  gdb::string_view m_name;

  /* Language-specific info.  These fields are filled lazily the first
     time a lookup is done in the corresponding language.  They're
     mutable because lookup_name_info objects are typically passed
     around by const reference (see intro), and they're conceptually
     "cache" that can always be reconstructed from the non-mutable
     fields.  */
  mutable gdb::optional<ada_lookup_name_info> m_ada;
  mutable gdb::optional<demangle_for_lookup_info> m_cplus;
  mutable gdb::optional<demangle_for_lookup_info> m_d;
  mutable gdb::optional<demangle_for_lookup_info> m_go;

  /* The demangled hashes.  Stored in an array with one entry for each
     possible language.  The second array records whether we've
     already computed the each language's hash.  (These are separate
     arrays instead of a single array of optional<unsigned> to avoid
     alignment padding).  */
  mutable std::array<unsigned int, nr_languages> m_demangled_hashes;
  mutable std::array<bool, nr_languages> m_demangled_hashes_p {};
};

/* Comparison function for completion symbol lookup.

   Returns true if the symbol name matches against LOOKUP_NAME.

   SYMBOL_SEARCH_NAME should be a symbol's "search" name.

   On success and if non-NULL, COMP_MATCH_RES->match is set to point
   to the symbol name as should be presented to the user as a
   completion match list element.  In most languages, this is the same
   as the symbol's search name, but in some, like Ada, the display
   name is dynamically computed within the comparison routine.

   Also, on success and if non-NULL, COMP_MATCH_RES->match_for_lcd
   points the part of SYMBOL_SEARCH_NAME that was considered to match
   LOOKUP_NAME.  E.g., in C++, in linespec/wild mode, if the symbol is
   "foo::function()" and LOOKUP_NAME is "function(", MATCH_FOR_LCD
   points to "function()" inside SYMBOL_SEARCH_NAME.  */
typedef bool (symbol_name_matcher_ftype)
  (const char *symbol_search_name,
   const lookup_name_info &lookup_name,
   completion_match_result *comp_match_res);

/* Some of the structures in this file are space critical.
   The space-critical structures are:

     struct general_symbol_info
     struct symbol
     struct partial_symbol

   These structures are laid out to encourage good packing.
   They use ENUM_BITFIELD and short int fields, and they order the
   structure members so that fields less than a word are next
   to each other so they can be packed together.  */

/* Rearranged: used ENUM_BITFIELD and rearranged field order in
   all the space critical structures (plus struct minimal_symbol).
   Memory usage dropped from 99360768 bytes to 90001408 bytes.
   I measured this with before-and-after tests of
   "HEAD-old-gdb -readnow HEAD-old-gdb" and
   "HEAD-new-gdb -readnow HEAD-old-gdb" on native i686-pc-linux-gnu,
   red hat linux 8, with LD_LIBRARY_PATH=/usr/lib/debug,
   typing "maint space 1" at the first command prompt.

   Here is another measurement (from andrew c):
     # no /usr/lib/debug, just plain glibc, like a normal user
     gdb HEAD-old-gdb
     (gdb) break internal_error
     (gdb) run
     (gdb) maint internal-error
     (gdb) backtrace
     (gdb) maint space 1

   gdb gdb_6_0_branch  2003-08-19  space used: 8896512
   gdb HEAD            2003-08-19  space used: 8904704
   gdb HEAD            2003-08-21  space used: 8396800 (+symtab.h)
   gdb HEAD            2003-08-21  space used: 8265728 (+gdbtypes.h)

   The third line shows the savings from the optimizations in symtab.h.
   The fourth line shows the savings from the optimizations in
   gdbtypes.h.  Both optimizations are in gdb HEAD now.

   --chastain 2003-08-21  */

/* Define a structure for the information that is common to all symbol types,
   including minimal symbols, partial symbols, and full symbols.  In a
   multilanguage environment, some language specific information may need to
   be recorded along with each symbol.  */

/* This structure is space critical.  See space comments at the top.  */

struct general_symbol_info
{
  /* Short version as to when to use which name accessor:
     Use natural_name () to refer to the name of the symbol in the original
     source code.  Use linkage_name () if you want to know what the linker
     thinks the symbol's name is.  Use print_name () for output.  Use
     demangled_name () if you specifically need to know whether natural_name ()
     and linkage_name () are different.  */

  const char *linkage_name () const
  { return m_name; }

  /* Return SYMBOL's "natural" name, i.e. the name that it was called in
     the original source code.  In languages like C++ where symbols may
     be mangled for ease of manipulation by the linker, this is the
     demangled name.  */
  const char *natural_name () const;

  /* Returns a version of the name of a symbol that is
     suitable for output.  In C++ this is the "demangled" form of the
     name if demangle is on and the "mangled" form of the name if
     demangle is off.  In other languages this is just the symbol name.
     The result should never be NULL.  Don't use this for internal
     purposes (e.g. storing in a hashtable): it's only suitable for output.  */
  const char *print_name () const
  { return demangle ? natural_name () : linkage_name (); }

  /* Return the demangled name for a symbol based on the language for
     that symbol.  If no demangled name exists, return NULL.  */
  const char *demangled_name () const;

  /* Returns the name to be used when sorting and searching symbols.
     In C++, we search for the demangled form of a name,
     and so sort symbols accordingly.  In Ada, however, we search by mangled
     name.  If there is no distinct demangled name, then this
     returns the same value (same pointer) as linkage_name ().  */
  const char *search_name () const;

  /* Set just the linkage name of a symbol; do not try to demangle
     it.  Used for constructs which do not have a mangled name,
     e.g. struct tags.  Unlike compute_and_set_names, linkage_name must
     be terminated and either already on the objfile's obstack or
     permanently allocated.  */
  void set_linkage_name (const char *linkage_name)
  { m_name = linkage_name; }

  /* Set the demangled name of this symbol to NAME.  NAME must be
     already correctly allocated.  If the symbol's language is Ada,
     then the name is ignored and the obstack is set.  */
  void set_demangled_name (const char *name, struct obstack *obstack);

  enum language language () const
  { return m_language; }

  /* Initializes the language dependent portion of a symbol
     depending upon the language for the symbol.  */
  void set_language (enum language language, struct obstack *obstack);

  /* Set the linkage and natural names of a symbol, by demangling
     the linkage name.  If linkage_name may not be nullterminated,
     copy_name must be set to true.  */
  void compute_and_set_names (gdb::string_view linkage_name, bool copy_name,
			      struct objfile_per_bfd_storage *per_bfd,
			      gdb::optional<hashval_t> hash
				= gdb::optional<hashval_t> ());

  CORE_ADDR value_address () const
  {
    return m_value.address;
  }

  void set_value_address (CORE_ADDR address)
  {
    m_value.address = address;
  }

  /* Name of the symbol.  This is a required field.  Storage for the
     name is allocated on the objfile_obstack for the associated
     objfile.  For languages like C++ that make a distinction between
     the mangled name and demangled name, this is the mangled
     name.  */

  const char *m_name;

  /* Value of the symbol.  Which member of this union to use, and what
     it means, depends on what kind of symbol this is and its
     SYMBOL_CLASS.  See comments there for more details.  All of these
     are in host byte order (though what they point to might be in
     target byte order, e.g. LOC_CONST_BYTES).  */

  union
  {
    LONGEST ivalue;

    const struct block *block;

    const gdb_byte *bytes;

    CORE_ADDR address;

    /* A common block.  Used with LOC_COMMON_BLOCK.  */

    const struct common_block *common_block;

    /* For opaque typedef struct chain.  */

    struct symbol *chain;
  }
  m_value;

  /* Since one and only one language can apply, wrap the language specific
     information inside a union.  */

  union
  {
    /* A pointer to an obstack that can be used for storage associated
       with this symbol.  This is only used by Ada, and only when the
       'ada_mangled' field is zero.  */
    struct obstack *obstack;

    /* This is used by languages which wish to store a demangled name.
       currently used by Ada, C++, and Objective C.  */
    const char *demangled_name;
  }
  language_specific;

  /* Record the source code language that applies to this symbol.
     This is used to select one of the fields from the language specific
     union above.  */

  ENUM_BITFIELD(language) m_language : LANGUAGE_BITS;

  /* This is only used by Ada.  If set, then the 'demangled_name' field
     of language_specific is valid.  Otherwise, the 'obstack' field is
     valid.  */
  unsigned int ada_mangled : 1;

  /* Which section is this symbol in?  This is an index into
     section_offsets for this objfile.  Negative means that the symbol
     does not get relocated relative to a section.  */

  short m_section;

  /* Set the index into the obj_section list (within the containing
     objfile) for the section that contains this symbol.  See M_SECTION
     for more details.  */

  void set_section_index (short idx)
  { m_section = idx; }

  /* Return the index into the obj_section list (within the containing
     objfile) for the section that contains this symbol.  See M_SECTION
     for more details.  */

  short section_index () const
  { return m_section; }

  /* Return the obj_section from OBJFILE for this symbol.  The symbol
     returned is based on the SECTION member variable, and can be nullptr
     if SECTION is negative.  */

  struct obj_section *obj_section (const struct objfile *objfile) const;
};

extern CORE_ADDR symbol_overlayed_address (CORE_ADDR, struct obj_section *);

/* Return the address of SYM.  The MAYBE_COPIED flag must be set on
   SYM.  If SYM appears in the main program's minimal symbols, then
   that minsym's address is returned; otherwise, SYM's address is
   returned.  This should generally only be used via the
   SYMBOL_VALUE_ADDRESS macro.  */

extern CORE_ADDR get_symbol_address (const struct symbol *sym);

/* Try to determine the demangled name for a symbol, based on the
   language of that symbol.  If the language is set to language_auto,
   it will attempt to find any demangling algorithm that works and
   then set the language appropriately.  The returned name is allocated
   by the demangler and should be xfree'd.  */

extern gdb::unique_xmalloc_ptr<char> symbol_find_demangled_name
     (struct general_symbol_info *gsymbol, const char *mangled);

/* Return true if NAME matches the "search" name of GSYMBOL, according
   to the symbol's language.  */
extern bool symbol_matches_search_name
  (const struct general_symbol_info *gsymbol,
   const lookup_name_info &name);

/* Compute the hash of the given symbol search name of a symbol of
   language LANGUAGE.  */
extern unsigned int search_name_hash (enum language language,
				      const char *search_name);

/* Classification types for a minimal symbol.  These should be taken as
   "advisory only", since if gdb can't easily figure out a
   classification it simply selects mst_unknown.  It may also have to
   guess when it can't figure out which is a better match between two
   types (mst_data versus mst_bss) for example.  Since the minimal
   symbol info is sometimes derived from the BFD library's view of a
   file, we need to live with what information bfd supplies.  */

enum minimal_symbol_type
{
  mst_unknown = 0,		/* Unknown type, the default */
  mst_text,			/* Generally executable instructions */

  /* A GNU ifunc symbol, in the .text section.  GDB uses to know
     whether the user is setting a breakpoint on a GNU ifunc function,
     and thus GDB needs to actually set the breakpoint on the target
     function.  It is also used to know whether the program stepped
     into an ifunc resolver -- the resolver may get a separate
     symbol/alias under a different name, but it'll have the same
     address as the ifunc symbol.  */
  mst_text_gnu_ifunc,           /* Executable code returning address
				   of executable code */

  /* A GNU ifunc function descriptor symbol, in a data section
     (typically ".opd").  Seen on architectures that use function
     descriptors, like PPC64/ELFv1.  In this case, this symbol's value
     is the address of the descriptor.  There'll be a corresponding
     mst_text_gnu_ifunc synthetic symbol for the text/entry
     address.  */
  mst_data_gnu_ifunc,		/* Executable code returning address
				   of executable code */

  mst_slot_got_plt,		/* GOT entries for .plt sections */
  mst_data,			/* Generally initialized data */
  mst_bss,			/* Generally uninitialized data */
  mst_abs,			/* Generally absolute (nonrelocatable) */
  /* GDB uses mst_solib_trampoline for the start address of a shared
     library trampoline entry.  Breakpoints for shared library functions
     are put there if the shared library is not yet loaded.
     After the shared library is loaded, lookup_minimal_symbol will
     prefer the minimal symbol from the shared library (usually
     a mst_text symbol) over the mst_solib_trampoline symbol, and the
     breakpoints will be moved to their true address in the shared
     library via breakpoint_re_set.  */
  mst_solib_trampoline,		/* Shared library trampoline code */
  /* For the mst_file* types, the names are only guaranteed to be unique
     within a given .o file.  */
  mst_file_text,		/* Static version of mst_text */
  mst_file_data,		/* Static version of mst_data */
  mst_file_bss,			/* Static version of mst_bss */
  nr_minsym_types
};

/* The number of enum minimal_symbol_type values, with some padding for
   reasonable growth.  */
#define MINSYM_TYPE_BITS 4
gdb_static_assert (nr_minsym_types <= (1 << MINSYM_TYPE_BITS));

/* Return the address of MINSYM, which comes from OBJF.  The
   MAYBE_COPIED flag must be set on MINSYM.  If MINSYM appears in the
   main program's minimal symbols, then that minsym's address is
   returned; otherwise, MINSYM's address is returned.  This should
   generally only be used via the MSYMBOL_VALUE_ADDRESS macro.  */

extern CORE_ADDR get_msymbol_address (struct objfile *objf,
				      const struct minimal_symbol *minsym);

/* Define a simple structure used to hold some very basic information about
   all defined global symbols (text, data, bss, abs, etc).  The only required
   information is the general_symbol_info.

   In many cases, even if a file was compiled with no special options for
   debugging at all, as long as was not stripped it will contain sufficient
   information to build a useful minimal symbol table using this structure.
   Even when a file contains enough debugging information to build a full
   symbol table, these minimal symbols are still useful for quickly mapping
   between names and addresses, and vice versa.  They are also sometimes
   used to figure out what full symbol table entries need to be read in.  */

struct minimal_symbol : public general_symbol_info
{
  LONGEST value_longest () const
  {
    return m_value.ivalue;
  }

  /* The relocated address of the minimal symbol, using the section
     offsets from OBJFILE.  */
  CORE_ADDR value_address (objfile *objfile) const;

  /* The unrelocated address of the minimal symbol.  */
  CORE_ADDR value_raw_address () const
  {
    return m_value.address;
  }

  /* Return this minimal symbol's type.  */

  minimal_symbol_type type () const
  {
    return m_type;
  }

  /* Set this minimal symbol's type.  */

  void set_type (minimal_symbol_type type)
  {
    m_type = type;
  }

  /* Return this minimal symbol's size.  */

  unsigned long size () const
  {
    return m_size;
  }

  /* Set this minimal symbol's size.  */

  void set_size (unsigned long size)
  {
    m_size = size;
    m_has_size = 1;
  }

  /* Return true if this minimal symbol's size is known.  */

  bool has_size () const
  {
    return m_has_size;
  }

  /* Return this minimal symbol's first target-specific flag.  */

  bool target_flag_1 () const
  {
    return m_target_flag_1;
  }

  /* Set this minimal symbol's first target-specific flag.  */

  void set_target_flag_1 (bool target_flag_1)
  {
    m_target_flag_1 = target_flag_1;
  }

  /* Return this minimal symbol's second target-specific flag.  */

  bool target_flag_2 () const
  {
    return m_target_flag_2;
  }

  /* Set this minimal symbol's second target-specific flag.  */

  void set_target_flag_2 (bool target_flag_2)
  {
    m_target_flag_2 = target_flag_2;
  }

  /* Size of this symbol.  dbx_end_psymtab in dbxread.c uses this
     information to calculate the end of the partial symtab based on the
     address of the last symbol plus the size of the last symbol.  */

  unsigned long m_size;

  /* Which source file is this symbol in?  Only relevant for mst_file_*.  */
  const char *filename;

  /* Classification type for this minimal symbol.  */

  ENUM_BITFIELD(minimal_symbol_type) m_type : MINSYM_TYPE_BITS;

  /* Non-zero if this symbol was created by gdb.
     Such symbols do not appear in the output of "info var|fun".  */
  unsigned int created_by_gdb : 1;

  /* Two flag bits provided for the use of the target.  */
  unsigned int m_target_flag_1 : 1;
  unsigned int m_target_flag_2 : 1;

  /* Nonzero iff the size of the minimal symbol has been set.
     Symbol size information can sometimes not be determined, because
     the object file format may not carry that piece of information.  */
  unsigned int m_has_size : 1;

  /* For data symbols only, if this is set, then the symbol might be
     subject to copy relocation.  In this case, a minimal symbol
     matching the symbol's linkage name is first looked for in the
     main objfile.  If found, then that address is used; otherwise the
     address in this symbol is used.  */

  unsigned maybe_copied : 1;

  /* Non-zero if this symbol ever had its demangled name set (even if
     it was set to NULL).  */
  unsigned int name_set : 1;

  /* Minimal symbols with the same hash key are kept on a linked
     list.  This is the link.  */

  struct minimal_symbol *hash_next;

  /* Minimal symbols are stored in two different hash tables.  This is
     the `next' pointer for the demangled hash table.  */

  struct minimal_symbol *demangled_hash_next;

  /* True if this symbol is of some data type.  */

  bool data_p () const;

  /* True if MSYMBOL is of some text type.  */

  bool text_p () const;
};

#include "minsyms.h"



/* Represent one symbol name; a variable, constant, function or typedef.  */

/* Different name domains for symbols.  Looking up a symbol specifies a
   domain and ignores symbol definitions in other name domains.  */

enum domain_enum
{
  /* UNDEF_DOMAIN is used when a domain has not been discovered or
     none of the following apply.  This usually indicates an error either
     in the symbol information or in gdb's handling of symbols.  */

  UNDEF_DOMAIN,

  /* VAR_DOMAIN is the usual domain.  In C, this contains variables,
     function names, typedef names and enum type values.  */

  VAR_DOMAIN,

  /* STRUCT_DOMAIN is used in C to hold struct, union and enum type names.
     Thus, if `struct foo' is used in a C program, it produces a symbol named
     `foo' in the STRUCT_DOMAIN.  */

  STRUCT_DOMAIN,

  /* MODULE_DOMAIN is used in Fortran to hold module type names.  */

  MODULE_DOMAIN,

  /* LABEL_DOMAIN may be used for names of labels (for gotos).  */

  LABEL_DOMAIN,

  /* Fortran common blocks.  Their naming must be separate from VAR_DOMAIN.
     They also always use LOC_COMMON_BLOCK.  */
  COMMON_BLOCK_DOMAIN,

  /* This must remain last.  */
  NR_DOMAINS
};

/* The number of bits in a symbol used to represent the domain.  */

#define SYMBOL_DOMAIN_BITS 3
gdb_static_assert (NR_DOMAINS <= (1 << SYMBOL_DOMAIN_BITS));

extern const char *domain_name (domain_enum);

/* Searching domains, used when searching for symbols.  Element numbers are
   hardcoded in GDB, check all enum uses before changing it.  */

enum search_domain
{
  /* Everything in VAR_DOMAIN minus FUNCTIONS_DOMAIN and
     TYPES_DOMAIN.  */
  VARIABLES_DOMAIN = 0,

  /* All functions -- for some reason not methods, though.  */
  FUNCTIONS_DOMAIN = 1,

  /* All defined types */
  TYPES_DOMAIN = 2,

  /* All modules.  */
  MODULES_DOMAIN = 3,

  /* Any type.  */
  ALL_DOMAIN = 4
};

extern const char *search_domain_name (enum search_domain);

/* An address-class says where to find the value of a symbol.  */

enum address_class
{
  /* Not used; catches errors.  */

  LOC_UNDEF,

  /* Value is constant int SYMBOL_VALUE, host byteorder.  */

  LOC_CONST,

  /* Value is at fixed address SYMBOL_VALUE_ADDRESS.  */

  LOC_STATIC,

  /* Value is in register.  SYMBOL_VALUE is the register number
     in the original debug format.  SYMBOL_REGISTER_OPS holds a
     function that can be called to transform this into the
     actual register number this represents in a specific target
     architecture (gdbarch).

     For some symbol formats (stabs, for some compilers at least),
     the compiler generates two symbols, an argument and a register.
     In some cases we combine them to a single LOC_REGISTER in symbol
     reading, but currently not for all cases (e.g. it's passed on the
     stack and then loaded into a register).  */

  LOC_REGISTER,

  /* It's an argument; the value is at SYMBOL_VALUE offset in arglist.  */

  LOC_ARG,

  /* Value address is at SYMBOL_VALUE offset in arglist.  */

  LOC_REF_ARG,

  /* Value is in specified register.  Just like LOC_REGISTER except the
     register holds the address of the argument instead of the argument
     itself.  This is currently used for the passing of structs and unions
     on sparc and hppa.  It is also used for call by reference where the
     address is in a register, at least by mipsread.c.  */

  LOC_REGPARM_ADDR,

  /* Value is a local variable at SYMBOL_VALUE offset in stack frame.  */

  LOC_LOCAL,

  /* Value not used; definition in SYMBOL_TYPE.  Symbols in the domain
     STRUCT_DOMAIN all have this class.  */

  LOC_TYPEDEF,

  /* Value is address SYMBOL_VALUE_ADDRESS in the code.  */

  LOC_LABEL,

  /* In a symbol table, value is SYMBOL_BLOCK_VALUE of a `struct block'.
     In a partial symbol table, SYMBOL_VALUE_ADDRESS is the start address
     of the block.  Function names have this class.  */

  LOC_BLOCK,

  /* Value is a constant byte-sequence pointed to by SYMBOL_VALUE_BYTES, in
     target byte order.  */

  LOC_CONST_BYTES,

  /* Value is at fixed address, but the address of the variable has
     to be determined from the minimal symbol table whenever the
     variable is referenced.
     This happens if debugging information for a global symbol is
     emitted and the corresponding minimal symbol is defined
     in another object file or runtime common storage.
     The linker might even remove the minimal symbol if the global
     symbol is never referenced, in which case the symbol remains
     unresolved.
     
     GDB would normally find the symbol in the minimal symbol table if it will
     not find it in the full symbol table.  But a reference to an external
     symbol in a local block shadowing other definition requires full symbol
     without possibly having its address available for LOC_STATIC.  Testcase
     is provided as `gdb.dwarf2/dw2-unresolved.exp'.

     This is also used for thread local storage (TLS) variables.  In this case,
     the address of the TLS variable must be determined when the variable is
     referenced, from the MSYMBOL_VALUE_RAW_ADDRESS, which is the offset
     of the TLS variable in the thread local storage of the shared
     library/object.  */

  LOC_UNRESOLVED,

  /* The variable does not actually exist in the program.
     The value is ignored.  */

  LOC_OPTIMIZED_OUT,

  /* The variable's address is computed by a set of location
     functions (see "struct symbol_computed_ops" below).  */
  LOC_COMPUTED,

  /* The variable uses general_symbol_info->value->common_block field.
     It also always uses COMMON_BLOCK_DOMAIN.  */
  LOC_COMMON_BLOCK,

  /* Not used, just notes the boundary of the enum.  */
  LOC_FINAL_VALUE
};

/* The number of bits needed for values in enum address_class, with some
   padding for reasonable growth, and room for run-time registered address
   classes. See symtab.c:MAX_SYMBOL_IMPLS.
   This is a #define so that we can have a assertion elsewhere to
   verify that we have reserved enough space for synthetic address
   classes.  */
#define SYMBOL_ACLASS_BITS 5
gdb_static_assert (LOC_FINAL_VALUE <= (1 << SYMBOL_ACLASS_BITS));

/* The methods needed to implement LOC_COMPUTED.  These methods can
   use the symbol's .aux_value for additional per-symbol information.

   At present this is only used to implement location expressions.  */

struct symbol_computed_ops
{

  /* Return the value of the variable SYMBOL, relative to the stack
     frame FRAME.  If the variable has been optimized out, return
     zero.

     Iff `read_needs_frame (SYMBOL)' is not SYMBOL_NEEDS_FRAME, then
     FRAME may be zero.  */

  struct value *(*read_variable) (struct symbol * symbol,
				  frame_info_ptr frame);

  /* Read variable SYMBOL like read_variable at (callee) FRAME's function
     entry.  SYMBOL should be a function parameter, otherwise
     NO_ENTRY_VALUE_ERROR will be thrown.  */
  struct value *(*read_variable_at_entry) (struct symbol *symbol,
					   frame_info_ptr frame);

  /* Find the "symbol_needs_kind" value for the given symbol.  This
     value determines whether reading the symbol needs memory (e.g., a
     global variable), just registers (a thread-local), or a frame (a
     local variable).  */
  enum symbol_needs_kind (*get_symbol_read_needs) (struct symbol * symbol);

  /* Write to STREAM a natural-language description of the location of
     SYMBOL, in the context of ADDR.  */
  void (*describe_location) (struct symbol * symbol, CORE_ADDR addr,
			     struct ui_file * stream);

  /* Non-zero if this symbol's address computation is dependent on PC.  */
  unsigned char location_has_loclist;

  /* Tracepoint support.  Append bytecodes to the tracepoint agent
     expression AX that push the address of the object SYMBOL.  Set
     VALUE appropriately.  Note --- for objects in registers, this
     needn't emit any code; as long as it sets VALUE properly, then
     the caller will generate the right code in the process of
     treating this as an lvalue or rvalue.  */

  void (*tracepoint_var_ref) (struct symbol *symbol, struct agent_expr *ax,
			      struct axs_value *value);

  /* Generate C code to compute the location of SYMBOL.  The C code is
     emitted to STREAM.  GDBARCH is the current architecture and PC is
     the PC at which SYMBOL's location should be evaluated.
     REGISTERS_USED is a vector indexed by register number; the
     generator function should set an element in this vector if the
     corresponding register is needed by the location computation.
     The generated C code must assign the location to a local
     variable; this variable's name is RESULT_NAME.  */

  void (*generate_c_location) (struct symbol *symbol, string_file *stream,
			       struct gdbarch *gdbarch,
			       std::vector<bool> &registers_used,
			       CORE_ADDR pc, const char *result_name);

};

/* The methods needed to implement LOC_BLOCK for inferior functions.
   These methods can use the symbol's .aux_value for additional
   per-symbol information.  */

struct symbol_block_ops
{
  /* Fill in *START and *LENGTH with DWARF block data of function
     FRAMEFUNC valid for inferior context address PC.  Set *LENGTH to
     zero if such location is not valid for PC; *START is left
     uninitialized in such case.  */
  void (*find_frame_base_location) (struct symbol *framefunc, CORE_ADDR pc,
				    const gdb_byte **start, size_t *length);

  /* Return the frame base address.  FRAME is the frame for which we want to
     compute the base address while FRAMEFUNC is the symbol for the
     corresponding function.  Return 0 on failure (FRAMEFUNC may not hold the
     information we need).

     This method is designed to work with static links (nested functions
     handling).  Static links are function properties whose evaluation returns
     the frame base address for the enclosing frame.  However, there are
     multiple definitions for "frame base": the content of the frame base
     register, the CFA as defined by DWARF unwinding information, ...

     So this specific method is supposed to compute the frame base address such
     as for nested functions, the static link computes the same address.  For
     instance, considering DWARF debugging information, the static link is
     computed with DW_AT_static_link and this method must be used to compute
     the corresponding DW_AT_frame_base attribute.  */
  CORE_ADDR (*get_frame_base) (struct symbol *framefunc,
			       frame_info_ptr frame);
};

/* Functions used with LOC_REGISTER and LOC_REGPARM_ADDR.  */

struct symbol_register_ops
{
  int (*register_number) (struct symbol *symbol, struct gdbarch *gdbarch);
};

/* Objects of this type are used to find the address class and the
   various computed ops vectors of a symbol.  */

struct symbol_impl
{
  enum address_class aclass;

  /* Used with LOC_COMPUTED.  */
  const struct symbol_computed_ops *ops_computed;

  /* Used with LOC_BLOCK.  */
  const struct symbol_block_ops *ops_block;

  /* Used with LOC_REGISTER and LOC_REGPARM_ADDR.  */
  const struct symbol_register_ops *ops_register;
};

/* struct symbol has some subclasses.  This enum is used to
   differentiate between them.  */

enum symbol_subclass_kind
{
  /* Plain struct symbol.  */
  SYMBOL_NONE,

  /* struct template_symbol.  */
  SYMBOL_TEMPLATE,

  /* struct rust_vtable_symbol.  */
  SYMBOL_RUST_VTABLE
};

extern gdb::array_view<const struct symbol_impl> symbol_impls;

/* This structure is space critical.  See space comments at the top.  */

struct symbol : public general_symbol_info, public allocate_on_obstack
{
  symbol ()
    /* Class-initialization of bitfields is only allowed in C++20.  */
    : m_domain (UNDEF_DOMAIN),
      m_aclass_index (0),
      m_is_objfile_owned (1),
      m_is_argument (0),
      m_is_inlined (0),
      maybe_copied (0),
      subclass (SYMBOL_NONE),
      m_artificial (false)
    {
      /* We can't use an initializer list for members of a base class, and
	 general_symbol_info needs to stay a POD type.  */
      m_name = nullptr;
      m_value.ivalue = 0;
      language_specific.obstack = nullptr;
      m_language = language_unknown;
      ada_mangled = 0;
      m_section = -1;
      /* GCC 4.8.5 (on CentOS 7) does not correctly compile class-
	 initialization of unions, so we initialize it manually here.  */
      owner.symtab = nullptr;
    }

  symbol (const symbol &) = default;
  symbol &operator= (const symbol &) = default;

  void set_aclass_index (unsigned int aclass_index)
  {
    m_aclass_index = aclass_index;
  }

  const symbol_impl &impl () const
  {
    return symbol_impls[this->m_aclass_index];
  }

  address_class aclass () const
  {
    return this->impl ().aclass;
  }

  domain_enum domain () const
  {
    return m_domain;
  }

  void set_domain (domain_enum domain)
  {
    m_domain = domain;
  }

  bool is_objfile_owned () const
  {
    return m_is_objfile_owned;
  }

  void set_is_objfile_owned (bool is_objfile_owned)
  {
    m_is_objfile_owned = is_objfile_owned;
  }

  bool is_argument () const
  {
    return m_is_argument;
  }

  void set_is_argument (bool is_argument)
  {
    m_is_argument = is_argument;
  }

  bool is_inlined () const
  {
    return m_is_inlined;
  }

  void set_is_inlined (bool is_inlined)
  {
    m_is_inlined = is_inlined;
  }

  bool is_cplus_template_function () const
  {
    return this->subclass == SYMBOL_TEMPLATE;
  }

  struct type *type () const
  {
    return m_type;
  }

  void set_type (struct type *type)
  {
    m_type = type;
  }

  unsigned short line () const
  {
    return m_line;
  }

  void set_line (unsigned short line)
  {
    m_line = line;
  }

  LONGEST value_longest () const
  {
    return m_value.ivalue;
  }

  void set_value_longest (LONGEST value)
  {
    m_value.ivalue = value;
  }

  CORE_ADDR value_address () const
  {
    if (this->maybe_copied)
      return get_symbol_address (this);
    else
      return m_value.address;
  }

  void set_value_address (CORE_ADDR address)
  {
    m_value.address = address;
  }

  const gdb_byte *value_bytes () const
  {
    return m_value.bytes;
  }

  void set_value_bytes (const gdb_byte *bytes)
  {
    m_value.bytes = bytes;
  }

  const common_block *value_common_block () const
  {
    return m_value.common_block;
  }

  void set_value_common_block (const common_block *common_block)
  {
    m_value.common_block = common_block;
  }

  const block *value_block () const
  {
    return m_value.block;
  }

  void set_value_block (const block *block)
  {
    m_value.block = block;
  }

  symbol *value_chain () const
  {
    return m_value.chain;
  }

  void set_value_chain (symbol *sym)
  {
    m_value.chain = sym;
  }

  /* Return true if this symbol was marked as artificial.  */
  bool is_artificial () const
  {
    return m_artificial;
  }

  /* Set the 'artificial' flag on this symbol.  */
  void set_is_artificial (bool artificial)
  {
    m_artificial = artificial;
  }

  /* Return the OBJFILE of this symbol.  It is an error to call this
     if is_objfile_owned is false, which only happens for
     architecture-provided types.  */

  struct objfile *objfile () const;

  /* Return the ARCH of this symbol.  */

  struct gdbarch *arch () const;

  /* Return the symtab of this symbol.  It is an error to call this if
     is_objfile_owned is false, which only happens for
     architecture-provided types.  */

  struct symtab *symtab () const;

  /* Set the symtab of this symbol to SYMTAB.  It is an error to call
     this if is_objfile_owned is false, which only happens for
     architecture-provided types.  */

  void set_symtab (struct symtab *symtab);

  /* Data type of value */

  struct type *m_type = nullptr;

  /* The owner of this symbol.
     Which one to use is defined by symbol.is_objfile_owned.  */

  union
  {
    /* The symbol table containing this symbol.  This is the file associated
       with LINE.  It can be NULL during symbols read-in but it is never NULL
       during normal operation.  */
    struct symtab *symtab;

    /* For types defined by the architecture.  */
    struct gdbarch *arch;
  } owner;

  /* Domain code.  */

  ENUM_BITFIELD(domain_enum) m_domain : SYMBOL_DOMAIN_BITS;

  /* Address class.  This holds an index into the 'symbol_impls'
     table.  The actual enum address_class value is stored there,
     alongside any per-class ops vectors.  */

  unsigned int m_aclass_index : SYMBOL_ACLASS_BITS;

  /* If non-zero then symbol is objfile-owned, use owner.symtab.
       Otherwise symbol is arch-owned, use owner.arch.  */

  unsigned int m_is_objfile_owned : 1;

  /* Whether this is an argument.  */

  unsigned m_is_argument : 1;

  /* Whether this is an inlined function (class LOC_BLOCK only).  */
  unsigned m_is_inlined : 1;

  /* For LOC_STATIC only, if this is set, then the symbol might be
     subject to copy relocation.  In this case, a minimal symbol
     matching the symbol's linkage name is first looked for in the
     main objfile.  If found, then that address is used; otherwise the
     address in this symbol is used.  */

  unsigned maybe_copied : 1;

  /* The concrete type of this symbol.  */

  ENUM_BITFIELD (symbol_subclass_kind) subclass : 2;

  /* Whether this symbol is artificial.  */

  bool m_artificial : 1;

  /* Line number of this symbol's definition, except for inlined
     functions.  For an inlined function (class LOC_BLOCK and
     SYMBOL_INLINED set) this is the line number of the function's call
     site.  Inlined function symbols are not definitions, and they are
     never found by symbol table lookup.
     If this symbol is arch-owned, LINE shall be zero.

     FIXME: Should we really make the assumption that nobody will try
     to debug files longer than 64K lines?  What about machine
     generated programs?  */

  unsigned short m_line = 0;

  /* An arbitrary data pointer, allowing symbol readers to record
     additional information on a per-symbol basis.  Note that this data
     must be allocated using the same obstack as the symbol itself.  */
  /* So far it is only used by:
     LOC_COMPUTED: to find the location information
     LOC_BLOCK (DWARF2 function): information used internally by the
     DWARF 2 code --- specifically, the location expression for the frame
     base for this function.  */
  /* FIXME drow/2003-02-21: For the LOC_BLOCK case, it might be better
     to add a magic symbol to the block containing this information,
     or to have a generic debug info annotation slot for symbols.  */

  void *aux_value = nullptr;

  struct symbol *hash_next = nullptr;
};

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

struct block_symbol
{
  /* The symbol that was found, or NULL if no symbol was found.  */
  struct symbol *symbol;

  /* If SYMBOL is not NULL, then this is the block in which the symbol is
     defined.  */
  const struct block *block;
};

/* Note: There is no accessor macro for symbol.owner because it is
   "private".  */

#define SYMBOL_COMPUTED_OPS(symbol)	((symbol)->impl ().ops_computed)
#define SYMBOL_BLOCK_OPS(symbol)	((symbol)->impl ().ops_block)
#define SYMBOL_REGISTER_OPS(symbol)	((symbol)->impl ().ops_register)
#define SYMBOL_LOCATION_BATON(symbol)   (symbol)->aux_value

extern int register_symbol_computed_impl (enum address_class,
					  const struct symbol_computed_ops *);

extern int register_symbol_block_impl (enum address_class aclass,
				       const struct symbol_block_ops *ops);

extern int register_symbol_register_impl (enum address_class,
					  const struct symbol_register_ops *);

/* An instance of this type is used to represent a C++ template
   function.  A symbol is really of this type iff
   symbol::is_cplus_template_function is true.  */

struct template_symbol : public symbol
{
  /* The number of template arguments.  */
  int n_template_arguments = 0;

  /* The template arguments.  This is an array with
     N_TEMPLATE_ARGUMENTS elements.  */
  struct symbol **template_arguments = nullptr;
};

/* A symbol that represents a Rust virtual table object.  */

struct rust_vtable_symbol : public symbol
{
  /* The concrete type for which this vtable was created; that is, in
     "impl Trait for Type", this is "Type".  */
  struct type *concrete_type = nullptr;
};


/* Each item represents a line-->pc (or the reverse) mapping.  This is
   somewhat more wasteful of space than one might wish, but since only
   the files which are actually debugged are read in to core, we don't
   waste much space.  */

struct linetable_entry
{
  /* The line number for this entry.  */
  int line;

  /* True if this PC is a good location to place a breakpoint for LINE.  */
  unsigned is_stmt : 1;

  /* True if this location is a good location to place a breakpoint after a
     function prologue.  */
  bool prologue_end : 1;

  /* The address for this entry.  */
  CORE_ADDR pc;
};

/* The order of entries in the linetable is significant.  They should
   be sorted by increasing values of the pc field.  If there is more than
   one entry for a given pc, then I'm not sure what should happen (and
   I not sure whether we currently handle it the best way).

   Example: a C for statement generally looks like this

   10   0x100   - for the init/test part of a for stmt.
   20   0x200
   30   0x300
   10   0x400   - for the increment part of a for stmt.

   If an entry has a line number of zero, it marks the start of a PC
   range for which no line number information is available.  It is
   acceptable, though wasteful of table space, for such a range to be
   zero length.  */

struct linetable
{
  int nitems;

  /* Actually NITEMS elements.  If you don't like this use of the
     `struct hack', you can shove it up your ANSI (seriously, if the
     committee tells us how to do it, we can probably go along).  */
  struct linetable_entry item[1];
};

/* How to relocate the symbols from each section in a symbol file.
   The ordering and meaning of the offsets is file-type-dependent;
   typically it is indexed by section numbers or symbol types or
   something like that.  */

typedef std::vector<CORE_ADDR> section_offsets;

/* Each source file or header is represented by a struct symtab.
   The name "symtab" is historical, another name for it is "filetab".
   These objects are chained through the `next' field.  */

struct symtab
{
  struct compunit_symtab *compunit () const
  {
    return m_compunit;
  }

  void set_compunit (struct compunit_symtab *compunit)
  {
    m_compunit = compunit;
  }

  struct linetable *linetable () const
  {
    return m_linetable;
  }

  void set_linetable (struct linetable *linetable)
  {
    m_linetable = linetable;
  }

  enum language language () const
  {
    return m_language;
  }

  void set_language (enum language language)
  {
    m_language = language;
  }

  /* Unordered chain of all filetabs in the compunit,  with the exception
     that the "main" source file is the first entry in the list.  */

  struct symtab *next;

  /* Backlink to containing compunit symtab.  */

  struct compunit_symtab *m_compunit;

  /* Table mapping core addresses to line numbers for this file.
     Can be NULL if none.  Never shared between different symtabs.  */

  struct linetable *m_linetable;

  /* Name of this source file, in a form appropriate to print to the user.

     This pointer is never nullptr.  */

  const char *filename;

  /* Filename for this source file, used as an identifier to link with
     related objects such as associated macro_source_file objects.  It must
     therefore match the name of any macro_source_file object created for this
     source file.  The value can be the same as FILENAME if it is known to
     follow that rule, or another form of the same file name, this is up to
     the specific debug info reader.

     This pointer is never nullptr.*/
  const char *filename_for_id;

  /* Language of this source file.  */

  enum language m_language;

  /* Full name of file as found by searching the source path.
     NULL if not yet known.  */

  char *fullname;
};

/* A range adapter to allowing iterating over all the file tables in a list.  */

using symtab_range = next_range<symtab>;

/* Compunit symtabs contain the actual "symbol table", aka blockvector, as well
   as the list of all source files (what gdb has historically associated with
   the term "symtab").
   Additional information is recorded here that is common to all symtabs in a
   compilation unit (DWARF or otherwise).

   Example:
   For the case of a program built out of these files:

   foo.c
     foo1.h
     foo2.h
   bar.c
     foo1.h
     bar.h

   This is recorded as:

   objfile -> foo.c(cu) -> bar.c(cu) -> NULL
		|            |
		v            v
	      foo.c        bar.c
		|            |
		v            v
	      foo1.h       foo1.h
		|            |
		v            v
	      foo2.h       bar.h
		|            |
		v            v
	       NULL         NULL

   where "foo.c(cu)" and "bar.c(cu)" are struct compunit_symtab objects,
   and the files foo.c, etc. are struct symtab objects.  */

struct compunit_symtab
{
  struct objfile *objfile () const
  {
    return m_objfile;
  }

  void set_objfile (struct objfile *objfile)
  {
    m_objfile = objfile;
  }

  symtab_range filetabs () const
  {
    return symtab_range (m_filetabs);
  }

  void add_filetab (symtab *filetab)
  {
    if (m_filetabs == nullptr)
      {
	m_filetabs = filetab;
	m_last_filetab = filetab;
      }
    else
      {
	m_last_filetab->next = filetab;
	m_last_filetab = filetab;
      }
  }

  const char *debugformat () const
  {
    return m_debugformat;
  }

  void set_debugformat (const char *debugformat)
  {
    m_debugformat = debugformat;
  }

  const char *producer () const
  {
    return m_producer;
  }

  void set_producer (const char *producer)
  {
    m_producer = producer;
  }

  const char *dirname () const
  {
    return m_dirname;
  }

  void set_dirname (const char *dirname)
  {
    m_dirname = dirname;
  }

  struct blockvector *blockvector ()
  {
    return m_blockvector;
  }

  const struct blockvector *blockvector () const
  {
    return m_blockvector;
  }

  void set_blockvector (struct blockvector *blockvector)
  {
    m_blockvector = blockvector;
  }

  int block_line_section () const
  {
    return m_block_line_section;
  }

  void set_block_line_section (int block_line_section)
  {
    m_block_line_section = block_line_section;
  }

  bool locations_valid () const
  {
    return m_locations_valid;
  }

  void set_locations_valid (bool locations_valid)
  {
    m_locations_valid = locations_valid;
  }

  bool epilogue_unwind_valid () const
  {
    return m_epilogue_unwind_valid;
  }

  void set_epilogue_unwind_valid (bool epilogue_unwind_valid)
  {
    m_epilogue_unwind_valid = epilogue_unwind_valid;
  }

  struct macro_table *macro_table () const
  {
    return m_macro_table;
  }

  void set_macro_table (struct macro_table *macro_table)
  {
    m_macro_table = macro_table;
  }

  /* Make PRIMARY_FILETAB the primary filetab of this compunit symtab.

     PRIMARY_FILETAB must already be a filetab of this compunit symtab.  */

  void set_primary_filetab (symtab *primary_filetab);

  /* Return the primary filetab of the compunit.  */
  symtab *primary_filetab () const;

  /* Set m_call_site_htab.  */
  void set_call_site_htab (htab_t call_site_htab);

  /* Find call_site info for PC.  */
  call_site *find_call_site (CORE_ADDR pc) const;

  /* Return the language of this compunit_symtab.  */
  enum language language () const;

  /* Unordered chain of all compunit symtabs of this objfile.  */
  struct compunit_symtab *next;

  /* Object file from which this symtab information was read.  */
  struct objfile *m_objfile;

  /* Name of the symtab.
     This is *not* intended to be a usable filename, and is
     for debugging purposes only.  */
  const char *name;

  /* Unordered list of file symtabs, except that by convention the "main"
     source file (e.g., .c, .cc) is guaranteed to be first.
     Each symtab is a file, either the "main" source file (e.g., .c, .cc)
     or header (e.g., .h).  */
  symtab *m_filetabs;

  /* Last entry in FILETABS list.
     Subfiles are added to the end of the list so they accumulate in order,
     with the main source subfile living at the front.
     The main reason is so that the main source file symtab is at the head
     of the list, and the rest appear in order for debugging convenience.  */
  symtab *m_last_filetab;

  /* Non-NULL string that identifies the format of the debugging information,
     such as "stabs", "dwarf 1", "dwarf 2", "coff", etc.  This is mostly useful
     for automated testing of gdb but may also be information that is
     useful to the user.  */
  const char *m_debugformat;

  /* String of producer version information, or NULL if we don't know.  */
  const char *m_producer;

  /* Directory in which it was compiled, or NULL if we don't know.  */
  const char *m_dirname;

  /* List of all symbol scope blocks for this symtab.  It is shared among
     all symtabs in a given compilation unit.  */
  struct blockvector *m_blockvector;

  /* Section in objfile->section_offsets for the blockvector and
     the linetable.  Probably always SECT_OFF_TEXT.  */
  int m_block_line_section;

  /* Symtab has been compiled with both optimizations and debug info so that
     GDB may stop skipping prologues as variables locations are valid already
     at function entry points.  */
  unsigned int m_locations_valid : 1;

  /* DWARF unwinder for this CU is valid even for epilogues (PC at the return
     instruction).  This is supported by GCC since 4.5.0.  */
  unsigned int m_epilogue_unwind_valid : 1;

  /* struct call_site entries for this compilation unit or NULL.  */
  htab_t m_call_site_htab;

  /* The macro table for this symtab.  Like the blockvector, this
     is shared between different symtabs in a given compilation unit.
     It's debatable whether it *should* be shared among all the symtabs in
     the given compilation unit, but it currently is.  */
  struct macro_table *m_macro_table;

  /* If non-NULL, then this points to a NULL-terminated vector of
     included compunits.  When searching the static or global
     block of this compunit, the corresponding block of all
     included compunits will also be searched.  Note that this
     list must be flattened -- the symbol reader is responsible for
     ensuring that this vector contains the transitive closure of all
     included compunits.  */
  struct compunit_symtab **includes;

  /* If this is an included compunit, this points to one includer
     of the table.  This user is considered the canonical compunit
     containing this one.  An included compunit may itself be
     included by another.  */
  struct compunit_symtab *user;
};

using compunit_symtab_range = next_range<compunit_symtab>;

/* Return true if this symtab is the "main" symtab of its compunit_symtab.  */

static inline bool
is_main_symtab_of_compunit_symtab (struct symtab *symtab)
{
  return symtab == symtab->compunit ()->primary_filetab ();
}


/* The virtual function table is now an array of structures which have the
   form { int16 offset, delta; void *pfn; }. 

   In normal virtual function tables, OFFSET is unused.
   DELTA is the amount which is added to the apparent object's base
   address in order to point to the actual object to which the
   virtual function should be applied.
   PFN is a pointer to the virtual function.

   Note that this macro is g++ specific (FIXME).  */

#define VTBL_FNADDR_OFFSET 2

/* External variables and functions for the objects described above.  */

/* True if we are nested inside psymtab_to_symtab.  */

extern int currently_reading_symtab;

/* symtab.c lookup functions */

extern const char multiple_symbols_ask[];
extern const char multiple_symbols_all[];
extern const char multiple_symbols_cancel[];

const char *multiple_symbols_select_mode (void);

bool symbol_matches_domain (enum language symbol_language,
			    domain_enum symbol_domain,
			    domain_enum domain);

/* lookup a symbol table by source file name.  */

extern struct symtab *lookup_symtab (const char *);

/* An object of this type is passed as the 'is_a_field_of_this'
   argument to lookup_symbol and lookup_symbol_in_language.  */

struct field_of_this_result
{
  /* The type in which the field was found.  If this is NULL then the
     symbol was not found in 'this'.  If non-NULL, then one of the
     other fields will be non-NULL as well.  */

  struct type *type;

  /* If the symbol was found as an ordinary field of 'this', then this
     is non-NULL and points to the particular field.  */

  struct field *field;

  /* If the symbol was found as a function field of 'this', then this
     is non-NULL and points to the particular field.  */

  struct fn_fieldlist *fn_field;
};

/* Find the definition for a specified symbol name NAME
   in domain DOMAIN in language LANGUAGE, visible from lexical block BLOCK
   if non-NULL or from global/static blocks if BLOCK is NULL.
   Returns the struct symbol pointer, or NULL if no symbol is found.
   C++: if IS_A_FIELD_OF_THIS is non-NULL on entry, check to see if
   NAME is a field of the current implied argument `this'.  If so fill in the
   fields of IS_A_FIELD_OF_THIS, otherwise the fields are set to NULL.
   The symbol's section is fixed up if necessary.  */

extern struct block_symbol
  lookup_symbol_in_language (const char *,
			     const struct block *,
			     const domain_enum,
			     enum language,
			     struct field_of_this_result *);

/* Same as lookup_symbol_in_language, but using the current language.  */

extern struct block_symbol lookup_symbol (const char *,
					  const struct block *,
					  const domain_enum,
					  struct field_of_this_result *);

/* Find the definition for a specified symbol search name in domain
   DOMAIN, visible from lexical block BLOCK if non-NULL or from
   global/static blocks if BLOCK is NULL.  The passed-in search name
   should not come from the user; instead it should already be a
   search name as retrieved from a search_name () call.  See definition of
   symbol_name_match_type::SEARCH_NAME.  Returns the struct symbol
   pointer, or NULL if no symbol is found.  The symbol's section is
   fixed up if necessary.  */

extern struct block_symbol lookup_symbol_search_name (const char *search_name,
						      const struct block *block,
						      domain_enum domain);

/* Some helper functions for languages that need to write their own
   lookup_symbol_nonlocal functions.  */

/* Lookup a symbol in the static block associated to BLOCK, if there
   is one; do nothing if BLOCK is NULL or a global block.
   Upon success fixes up the symbol's section if necessary.  */

extern struct block_symbol
  lookup_symbol_in_static_block (const char *name,
				 const struct block *block,
				 const domain_enum domain);

/* Search all static file-level symbols for NAME from DOMAIN.
   Upon success fixes up the symbol's section if necessary.  */

extern struct block_symbol lookup_static_symbol (const char *name,
						 const domain_enum domain);

/* Lookup a symbol in all files' global blocks.

   If BLOCK is non-NULL then it is used for two things:
   1) If a target-specific lookup routine for libraries exists, then use the
      routine for the objfile of BLOCK, and
   2) The objfile of BLOCK is used to assist in determining the search order
      if the target requires it.
      See gdbarch_iterate_over_objfiles_in_search_order.

   Upon success fixes up the symbol's section if necessary.  */

extern struct block_symbol
  lookup_global_symbol (const char *name,
			const struct block *block,
			const domain_enum domain);

/* Lookup a symbol in block BLOCK.
   Upon success fixes up the symbol's section if necessary.  */

extern struct symbol *
  lookup_symbol_in_block (const char *name,
			  symbol_name_match_type match_type,
			  const struct block *block,
			  const domain_enum domain);

/* Look up the `this' symbol for LANG in BLOCK.  Return the symbol if
   found, or NULL if not found.  */

extern struct block_symbol
  lookup_language_this (const struct language_defn *lang,
			const struct block *block);

/* Lookup a [struct, union, enum] by name, within a specified block.  */

extern struct type *lookup_struct (const char *, const struct block *);

extern struct type *lookup_union (const char *, const struct block *);

extern struct type *lookup_enum (const char *, const struct block *);

/* from blockframe.c: */

/* lookup the function symbol corresponding to the address.  The
   return value will not be an inlined function; the containing
   function will be returned instead.  */

extern struct symbol *find_pc_function (CORE_ADDR);

/* lookup the function corresponding to the address and section.  The
   return value will not be an inlined function; the containing
   function will be returned instead.  */

extern struct symbol *find_pc_sect_function (CORE_ADDR, struct obj_section *);

/* lookup the function symbol corresponding to the address and
   section.  The return value will be the closest enclosing function,
   which might be an inline function.  */

extern struct symbol *find_pc_sect_containing_function
  (CORE_ADDR pc, struct obj_section *section);

/* Find the symbol at the given address.  Returns NULL if no symbol
   found.  Only exact matches for ADDRESS are considered.  */

extern struct symbol *find_symbol_at_address (CORE_ADDR);

/* Finds the "function" (text symbol) that is smaller than PC but
   greatest of all of the potential text symbols in SECTION.  Sets
   *NAME and/or *ADDRESS conditionally if that pointer is non-null.
   If ENDADDR is non-null, then set *ENDADDR to be the end of the
   function (exclusive).  If the optional parameter BLOCK is non-null,
   then set *BLOCK to the address of the block corresponding to the
   function symbol, if such a symbol could be found during the lookup;
   nullptr is used as a return value for *BLOCK if no block is found. 
   This function either succeeds or fails (not halfway succeeds).  If
   it succeeds, it sets *NAME, *ADDRESS, and *ENDADDR to real
   information and returns true.  If it fails, it sets *NAME, *ADDRESS
   and *ENDADDR to zero and returns false.
   
   If the function in question occupies non-contiguous ranges,
   *ADDRESS and *ENDADDR are (subject to the conditions noted above) set
   to the start and end of the range in which PC is found.  Thus
   *ADDRESS <= PC < *ENDADDR with no intervening gaps (in which ranges
   from other functions might be found).
   
   This property allows find_pc_partial_function to be used (as it had
   been prior to the introduction of non-contiguous range support) by
   various tdep files for finding a start address and limit address
   for prologue analysis.  This still isn't ideal, however, because we
   probably shouldn't be doing prologue analysis (in which
   instructions are scanned to determine frame size and stack layout)
   for any range that doesn't contain the entry pc.  Moreover, a good
   argument can be made that prologue analysis ought to be performed
   starting from the entry pc even when PC is within some other range.
   This might suggest that *ADDRESS and *ENDADDR ought to be set to the
   limits of the entry pc range, but that will cause the 
   *ADDRESS <= PC < *ENDADDR condition to be violated; many of the
   callers of find_pc_partial_function expect this condition to hold. 

   Callers which require the start and/or end addresses for the range
   containing the entry pc should instead call
   find_function_entry_range_from_pc.  */

extern bool find_pc_partial_function (CORE_ADDR pc, const char **name,
				      CORE_ADDR *address, CORE_ADDR *endaddr,
				      const struct block **block = nullptr);

/* Like find_pc_partial_function, above, but returns the underlying
   general_symbol_info (rather than the name) as an out parameter.  */

extern bool find_pc_partial_function_sym
  (CORE_ADDR pc, const general_symbol_info **sym,
   CORE_ADDR *address, CORE_ADDR *endaddr,
   const struct block **block = nullptr);

/* Like find_pc_partial_function, above, but *ADDRESS and *ENDADDR are
   set to start and end addresses of the range containing the entry pc.

   Note that it is not necessarily the case that (for non-NULL ADDRESS
   and ENDADDR arguments) the *ADDRESS <= PC < *ENDADDR condition will
   hold.

   See comment for find_pc_partial_function, above, for further
   explanation.  */

extern bool find_function_entry_range_from_pc (CORE_ADDR pc,
					       const char **name,
					       CORE_ADDR *address,
					       CORE_ADDR *endaddr);

/* Return the type of a function with its first instruction exactly at
   the PC address.  Return NULL otherwise.  */

extern struct type *find_function_type (CORE_ADDR pc);

/* See if we can figure out the function's actual type from the type
   that the resolver returns.  RESOLVER_FUNADDR is the address of the
   ifunc resolver.  */

extern struct type *find_gnu_ifunc_target_type (CORE_ADDR resolver_funaddr);

/* Find the GNU ifunc minimal symbol that matches SYM.  */
extern bound_minimal_symbol find_gnu_ifunc (const symbol *sym);

extern void clear_pc_function_cache (void);

/* Expand symtab containing PC, SECTION if not already expanded.  */

extern void expand_symtab_containing_pc (CORE_ADDR, struct obj_section *);

/* lookup full symbol table by address.  */

extern struct compunit_symtab *find_pc_compunit_symtab (CORE_ADDR);

/* lookup full symbol table by address and section.  */

extern struct compunit_symtab *
  find_pc_sect_compunit_symtab (CORE_ADDR, struct obj_section *);

extern bool find_pc_line_pc_range (CORE_ADDR, CORE_ADDR *, CORE_ADDR *);

extern void reread_symbols (int from_tty);

/* Look up a type named NAME in STRUCT_DOMAIN in the current language.
   The type returned must not be opaque -- i.e., must have at least one field
   defined.  */

extern struct type *lookup_transparent_type (const char *);

extern struct type *basic_lookup_transparent_type (const char *);

/* Macro for name of symbol to indicate a file compiled with gcc.  */
#ifndef GCC_COMPILED_FLAG_SYMBOL
#define GCC_COMPILED_FLAG_SYMBOL "gcc_compiled."
#endif

/* Macro for name of symbol to indicate a file compiled with gcc2.  */
#ifndef GCC2_COMPILED_FLAG_SYMBOL
#define GCC2_COMPILED_FLAG_SYMBOL "gcc2_compiled."
#endif

extern bool in_gnu_ifunc_stub (CORE_ADDR pc);

/* Functions for resolving STT_GNU_IFUNC symbols which are implemented only
   for ELF symbol files.  */

struct gnu_ifunc_fns
{
  /* See elf_gnu_ifunc_resolve_addr for its real implementation.  */
  CORE_ADDR (*gnu_ifunc_resolve_addr) (struct gdbarch *gdbarch, CORE_ADDR pc);

  /* See elf_gnu_ifunc_resolve_name for its real implementation.  */
  bool (*gnu_ifunc_resolve_name) (const char *function_name,
				 CORE_ADDR *function_address_p);

  /* See elf_gnu_ifunc_resolver_stop for its real implementation.  */
  void (*gnu_ifunc_resolver_stop) (code_breakpoint *b);

  /* See elf_gnu_ifunc_resolver_return_stop for its real implementation.  */
  void (*gnu_ifunc_resolver_return_stop) (code_breakpoint *b);
};

#define gnu_ifunc_resolve_addr gnu_ifunc_fns_p->gnu_ifunc_resolve_addr
#define gnu_ifunc_resolve_name gnu_ifunc_fns_p->gnu_ifunc_resolve_name
#define gnu_ifunc_resolver_stop gnu_ifunc_fns_p->gnu_ifunc_resolver_stop
#define gnu_ifunc_resolver_return_stop \
  gnu_ifunc_fns_p->gnu_ifunc_resolver_return_stop

extern const struct gnu_ifunc_fns *gnu_ifunc_fns_p;

extern CORE_ADDR find_solib_trampoline_target (frame_info_ptr, CORE_ADDR);

struct symtab_and_line
{
  /* The program space of this sal.  */
  struct program_space *pspace = NULL;

  struct symtab *symtab = NULL;
  struct symbol *symbol = NULL;
  struct obj_section *section = NULL;
  struct minimal_symbol *msymbol = NULL;
  /* Line number.  Line numbers start at 1 and proceed through symtab->nlines.
     0 is never a valid line number; it is used to indicate that line number
     information is not available.  */
  int line = 0;

  CORE_ADDR pc = 0;
  CORE_ADDR end = 0;
  bool explicit_pc = false;
  bool explicit_line = false;

  /* If the line number information is valid, then this indicates if this
     line table entry had the is-stmt flag set or not.  */
  bool is_stmt = false;

  /* The probe associated with this symtab_and_line.  */
  probe *prob = NULL;
  /* If PROBE is not NULL, then this is the objfile in which the probe
     originated.  */
  struct objfile *objfile = NULL;
};



/* Given a pc value, return line number it is in.  Second arg nonzero means
   if pc is on the boundary use the previous statement's line number.  */

extern struct symtab_and_line find_pc_line (CORE_ADDR, int);

/* Same function, but specify a section as well as an address.  */

extern struct symtab_and_line find_pc_sect_line (CORE_ADDR,
						 struct obj_section *, int);

/* Wrapper around find_pc_line to just return the symtab.  */

extern struct symtab *find_pc_line_symtab (CORE_ADDR);

/* Given a symtab and line number, return the pc there.  */

extern bool find_line_pc (struct symtab *, int, CORE_ADDR *);

extern bool find_line_pc_range (struct symtab_and_line, CORE_ADDR *,
				CORE_ADDR *);

extern void resolve_sal_pc (struct symtab_and_line *);

/* solib.c */

extern void clear_solib (void);

/* The reason we're calling into a completion match list collector
   function.  */
enum class complete_symbol_mode
  {
    /* Completing an expression.  */
    EXPRESSION,

    /* Completing a linespec.  */
    LINESPEC,
  };

extern void default_collect_symbol_completion_matches_break_on
  (completion_tracker &tracker,
   complete_symbol_mode mode,
   symbol_name_match_type name_match_type,
   const char *text, const char *word, const char *break_on,
   enum type_code code);
extern void collect_symbol_completion_matches
  (completion_tracker &tracker,
   complete_symbol_mode mode,
   symbol_name_match_type name_match_type,
   const char *, const char *);
extern void collect_symbol_completion_matches_type (completion_tracker &tracker,
						    const char *, const char *,
						    enum type_code);

extern void collect_file_symbol_completion_matches
  (completion_tracker &tracker,
   complete_symbol_mode,
   symbol_name_match_type name_match_type,
   const char *, const char *, const char *);

extern completion_list
  make_source_files_completion_list (const char *, const char *);

/* Return whether SYM is a function/method, as opposed to a data symbol.  */

extern bool symbol_is_function_or_method (symbol *sym);

/* Return whether MSYMBOL is a function/method, as opposed to a data
   symbol */

extern bool symbol_is_function_or_method (minimal_symbol *msymbol);

/* Return whether SYM should be skipped in completion mode MODE.  In
   linespec mode, we're only interested in functions/methods.  */

template<typename Symbol>
static bool
completion_skip_symbol (complete_symbol_mode mode, Symbol *sym)
{
  return (mode == complete_symbol_mode::LINESPEC
	  && !symbol_is_function_or_method (sym));
}

/* symtab.c */

bool matching_obj_sections (struct obj_section *, struct obj_section *);

extern struct symtab *find_line_symtab (struct symtab *, int, int *, bool *);

/* Given a function symbol SYM, find the symtab and line for the start
   of the function.  If FUNFIRSTLINE is true, we want the first line
   of real code inside the function.  */
extern symtab_and_line find_function_start_sal (symbol *sym, bool
						funfirstline);

/* Same, but start with a function address/section instead of a
   symbol.  */
extern symtab_and_line find_function_start_sal (CORE_ADDR func_addr,
						obj_section *section,
						bool funfirstline);

extern void skip_prologue_sal (struct symtab_and_line *);

/* symtab.c */

extern CORE_ADDR skip_prologue_using_sal (struct gdbarch *gdbarch,
					  CORE_ADDR func_addr);

extern struct symbol *fixup_symbol_section (struct symbol *,
					    struct objfile *);

/* If MSYMBOL is an text symbol, look for a function debug symbol with
   the same address.  Returns NULL if not found.  This is necessary in
   case a function is an alias to some other function, because debug
   information is only emitted for the alias target function's
   definition, not for the alias.  */
extern symbol *find_function_alias_target (bound_minimal_symbol msymbol);

/* Symbol searching */

/* When using the symbol_searcher struct to search for symbols, a vector of
   the following structs is returned.  */
struct symbol_search
{
  symbol_search (int block_, struct symbol *symbol_)
    : block (block_),
      symbol (symbol_)
  {
    msymbol.minsym = nullptr;
    msymbol.objfile = nullptr;
  }

  symbol_search (int block_, struct minimal_symbol *minsym,
		 struct objfile *objfile)
    : block (block_),
      symbol (nullptr)
  {
    msymbol.minsym = minsym;
    msymbol.objfile = objfile;
  }

  bool operator< (const symbol_search &other) const
  {
    return compare_search_syms (*this, other) < 0;
  }

  bool operator== (const symbol_search &other) const
  {
    return compare_search_syms (*this, other) == 0;
  }

  /* The block in which the match was found.  Could be, for example,
     STATIC_BLOCK or GLOBAL_BLOCK.  */
  int block;

  /* Information describing what was found.

     If symbol is NOT NULL, then information was found for this match.  */
  struct symbol *symbol;

  /* If msymbol is non-null, then a match was made on something for
     which only minimal_symbols exist.  */
  struct bound_minimal_symbol msymbol;

private:

  static int compare_search_syms (const symbol_search &sym_a,
				  const symbol_search &sym_b);
};

/* In order to search for global symbols of a particular kind matching
   particular regular expressions, create an instance of this structure and
   call the SEARCH member function.  */
class global_symbol_searcher
{
public:

  /* Constructor.  */
  global_symbol_searcher (enum search_domain kind,
			  const char *symbol_name_regexp)
    : m_kind (kind),
      m_symbol_name_regexp (symbol_name_regexp)
  {
    /* The symbol searching is designed to only find one kind of thing.  */
    gdb_assert (m_kind != ALL_DOMAIN);
  }

  /* Set the optional regexp that matches against the symbol type.  */
  void set_symbol_type_regexp (const char *regexp)
  {
    m_symbol_type_regexp = regexp;
  }

  /* Set the flag to exclude minsyms from the search results.  */
  void set_exclude_minsyms (bool exclude_minsyms)
  {
    m_exclude_minsyms = exclude_minsyms;
  }

  /* Set the maximum number of search results to be returned.  */
  void set_max_search_results (size_t max_search_results)
  {
    m_max_search_results = max_search_results;
  }

  /* Search the symbols from all objfiles in the current program space
     looking for matches as defined by the current state of this object.

     Within each file the results are sorted locally; each symtab's global
     and static blocks are separately alphabetized.  Duplicate entries are
     removed.  */
  std::vector<symbol_search> search () const;

  /* The set of source files to search in for matching symbols.  This is
     currently public so that it can be populated after this object has
     been constructed.  */
  std::vector<const char *> filenames;

private:
  /* The kind of symbols are we searching for.
     VARIABLES_DOMAIN - Search all symbols, excluding functions, type
			names, and constants (enums).
     FUNCTIONS_DOMAIN - Search all functions..
     TYPES_DOMAIN     - Search all type names.
     MODULES_DOMAIN   - Search all Fortran modules.
     ALL_DOMAIN       - Not valid for this function.  */
  enum search_domain m_kind;

  /* Regular expression to match against the symbol name.  */
  const char *m_symbol_name_regexp = nullptr;

  /* Regular expression to match against the symbol type.  */
  const char *m_symbol_type_regexp = nullptr;

  /* When this flag is false then minsyms that match M_SYMBOL_REGEXP will
     be included in the results, otherwise they are excluded.  */
  bool m_exclude_minsyms = false;

  /* Maximum number of search results.  We currently impose a hard limit
     of SIZE_MAX, there is no "unlimited".  */
  size_t m_max_search_results = SIZE_MAX;

  /* Expand symtabs in OBJFILE that match PREG, are of type M_KIND.  Return
     true if any msymbols were seen that we should later consider adding to
     the results list.  */
  bool expand_symtabs (objfile *objfile,
		       const gdb::optional<compiled_regex> &preg) const;

  /* Add symbols from symtabs in OBJFILE that match PREG, and TREG, and are
     of type M_KIND, to the results set RESULTS_SET.  Return false if we
     stop adding results early due to having already found too many results
     (based on M_MAX_SEARCH_RESULTS limit), otherwise return true.
     Returning true does not indicate that any results were added, just
     that we didn't _not_ add a result due to reaching MAX_SEARCH_RESULTS.  */
  bool add_matching_symbols (objfile *objfile,
			     const gdb::optional<compiled_regex> &preg,
			     const gdb::optional<compiled_regex> &treg,
			     std::set<symbol_search> *result_set) const;

  /* Add msymbols from OBJFILE that match PREG and M_KIND, to the results
     vector RESULTS.  Return false if we stop adding results early due to
     having already found too many results (based on max search results
     limit M_MAX_SEARCH_RESULTS), otherwise return true.  Returning true
     does not indicate that any results were added, just that we didn't
     _not_ add a result due to reaching MAX_SEARCH_RESULTS.  */
  bool add_matching_msymbols (objfile *objfile,
			      const gdb::optional<compiled_regex> &preg,
			      std::vector<symbol_search> *results) const;

  /* Return true if MSYMBOL is of type KIND.  */
  static bool is_suitable_msymbol (const enum search_domain kind,
				   const minimal_symbol *msymbol);
};

/* When searching for Fortran symbols within modules (functions/variables)
   we return a vector of this type.  The first item in the pair is the
   module symbol, and the second item is the symbol for the function or
   variable we found.  */
typedef std::pair<symbol_search, symbol_search> module_symbol_search;

/* Searches the symbols to find function and variables symbols (depending
   on KIND) within Fortran modules.  The MODULE_REGEXP matches against the
   name of the module, REGEXP matches against the name of the symbol within
   the module, and TYPE_REGEXP matches against the type of the symbol
   within the module.  */
extern std::vector<module_symbol_search> search_module_symbols
	(const char *module_regexp, const char *regexp,
	 const char *type_regexp, search_domain kind);

/* Convert a global or static symbol SYM (based on BLOCK, which should be
   either GLOBAL_BLOCK or STATIC_BLOCK) into a string for use in 'info'
   type commands (e.g. 'info variables', 'info functions', etc).  KIND is
   the type of symbol that was searched for which gave us SYM.  */

extern std::string symbol_to_info_string (struct symbol *sym, int block,
					  enum search_domain kind);

extern bool treg_matches_sym_type_name (const compiled_regex &treg,
					const struct symbol *sym);

/* The name of the ``main'' function.  */
extern const char *main_name ();
extern enum language main_language (void);

/* Lookup symbol NAME from DOMAIN in MAIN_OBJFILE's global or static blocks,
   as specified by BLOCK_INDEX.
   This searches MAIN_OBJFILE as well as any associated separate debug info
   objfiles of MAIN_OBJFILE.
   BLOCK_INDEX can be GLOBAL_BLOCK or STATIC_BLOCK.
   Upon success fixes up the symbol's section if necessary.  */

extern struct block_symbol
  lookup_global_symbol_from_objfile (struct objfile *main_objfile,
				     enum block_enum block_index,
				     const char *name,
				     const domain_enum domain);

/* Return 1 if the supplied producer string matches the ARM RealView
   compiler (armcc).  */
bool producer_is_realview (const char *producer);

void fixup_section (struct general_symbol_info *ginfo,
		    CORE_ADDR addr, struct objfile *objfile);

extern unsigned int symtab_create_debug;

/* Print a "symtab-create" debug statement.  */

#define symtab_create_debug_printf(fmt, ...) \
  debug_prefixed_printf_cond (symtab_create_debug >= 1, "symtab-create", fmt, ##__VA_ARGS__)

/* Print a verbose "symtab-create" debug statement, only if
   "set debug symtab-create" is set to 2 or higher.  */

#define symtab_create_debug_printf_v(fmt, ...) \
  debug_prefixed_printf_cond (symtab_create_debug >= 2, "symtab-create", fmt, ##__VA_ARGS__)

extern unsigned int symbol_lookup_debug;

/* Return true if symbol-lookup debug is turned on at all.  */

static inline bool
symbol_lookup_debug_enabled ()
{
  return symbol_lookup_debug > 0;
}

/* Return true if symbol-lookup debug is turned to verbose mode.  */

static inline bool
symbol_lookup_debug_enabled_v ()
{
  return symbol_lookup_debug > 1;
}

/* Print a "symbol-lookup" debug statement if symbol_lookup_debug is >= 1.  */

#define symbol_lookup_debug_printf(fmt, ...) \
  debug_prefixed_printf_cond (symbol_lookup_debug_enabled (),	\
			      "symbol-lookup", fmt, ##__VA_ARGS__)

/* Print a "symbol-lookup" debug statement if symbol_lookup_debug is >= 2.  */

#define symbol_lookup_debug_printf_v(fmt, ...) \
  debug_prefixed_printf_cond (symbol_lookup_debug_enabled_v (), \
			      "symbol-lookup", fmt, ##__VA_ARGS__)

/* Print "symbol-lookup" enter/exit debug statements.  */

#define SYMBOL_LOOKUP_SCOPED_DEBUG_ENTER_EXIT \
  scoped_debug_enter_exit (symbol_lookup_debug_enabled, "symbol-lookup")

extern bool basenames_may_differ;

bool compare_filenames_for_search (const char *filename,
				   const char *search_name);

bool compare_glob_filenames_for_search (const char *filename,
					const char *search_name);

bool iterate_over_some_symtabs (const char *name,
				const char *real_path,
				struct compunit_symtab *first,
				struct compunit_symtab *after_last,
				gdb::function_view<bool (symtab *)> callback);

void iterate_over_symtabs (const char *name,
			   gdb::function_view<bool (symtab *)> callback);


std::vector<CORE_ADDR> find_pcs_for_symtab_line
    (struct symtab *symtab, int line, struct linetable_entry **best_entry);

/* Prototype for callbacks for LA_ITERATE_OVER_SYMBOLS.  The callback
   is called once per matching symbol SYM.  The callback should return
   true to indicate that LA_ITERATE_OVER_SYMBOLS should continue
   iterating, or false to indicate that the iteration should end.  */

typedef bool (symbol_found_callback_ftype) (struct block_symbol *bsym);

/* Iterate over the symbols named NAME, matching DOMAIN, in BLOCK.

   For each symbol that matches, CALLBACK is called.  The symbol is
   passed to the callback.

   If CALLBACK returns false, the iteration ends and this function
   returns false.  Otherwise, the search continues, and the function
   eventually returns true.  */

bool iterate_over_symbols (const struct block *block,
			   const lookup_name_info &name,
			   const domain_enum domain,
			   gdb::function_view<symbol_found_callback_ftype> callback);

/* Like iterate_over_symbols, but if all calls to CALLBACK return
   true, then calls CALLBACK one additional time with a block_symbol
   that has a valid block but a NULL symbol.  */

bool iterate_over_symbols_terminated
  (const struct block *block,
   const lookup_name_info &name,
   const domain_enum domain,
   gdb::function_view<symbol_found_callback_ftype> callback);

/* Storage type used by demangle_for_lookup.  demangle_for_lookup
   either returns a const char * pointer that points to either of the
   fields of this type, or a pointer to the input NAME.  This is done
   this way to avoid depending on the precise details of the storage
   for the string.  */
class demangle_result_storage
{
public:

  /* Swap the malloc storage to STR, and return a pointer to the
     beginning of the new string.  */
  const char *set_malloc_ptr (gdb::unique_xmalloc_ptr<char> &&str)
  {
    m_malloc = std::move (str);
    return m_malloc.get ();
  }

  /* Set the malloc storage to now point at PTR.  Any previous malloc
     storage is released.  */
  const char *set_malloc_ptr (char *ptr)
  {
    m_malloc.reset (ptr);
    return ptr;
  }

private:

  /* The storage.  */
  gdb::unique_xmalloc_ptr<char> m_malloc;
};

const char *
  demangle_for_lookup (const char *name, enum language lang,
		       demangle_result_storage &storage);

/* Test to see if the symbol of language SYMBOL_LANGUAGE specified by
   SYMNAME (which is already demangled for C++ symbols) matches
   SYM_TEXT in the first SYM_TEXT_LEN characters.  If so, add it to
   the current completion list and return true.  Otherwise, return
   false.  */
bool completion_list_add_name (completion_tracker &tracker,
			       language symbol_language,
			       const char *symname,
			       const lookup_name_info &lookup_name,
			       const char *text, const char *word);

/* A simple symbol searching class.  */

class symbol_searcher
{
public:
  /* Returns the symbols found for the search.  */
  const std::vector<block_symbol> &
  matching_symbols () const
  {
    return m_symbols;
  }

  /* Returns the minimal symbols found for the search.  */
  const std::vector<bound_minimal_symbol> &
  matching_msymbols () const
  {
    return m_minimal_symbols;
  }

  /* Search for all symbols named NAME in LANGUAGE with DOMAIN, restricting
     search to FILE_SYMTABS and SEARCH_PSPACE, both of which may be NULL
     to search all symtabs and program spaces.  */
  void find_all_symbols (const std::string &name,
			 const struct language_defn *language,
			 enum search_domain search_domain,
			 std::vector<symtab *> *search_symtabs,
			 struct program_space *search_pspace);

  /* Reset this object to perform another search.  */
  void reset ()
  {
    m_symbols.clear ();
    m_minimal_symbols.clear ();
  }

private:
  /* Matching debug symbols.  */
  std::vector<block_symbol>  m_symbols;

  /* Matching non-debug symbols.  */
  std::vector<bound_minimal_symbol> m_minimal_symbols;
};

/* Class used to encapsulate the filename filtering for the "info sources"
   command.  */

struct info_sources_filter
{
  /* If filename filtering is being used (see M_C_REGEXP) then which part
     of the filename is being filtered against?  */
  enum class match_on
  {
    /* Match against the full filename.  */
    FULLNAME,

    /* Match only against the directory part of the full filename.  */
    DIRNAME,

    /* Match only against the basename part of the full filename.  */
    BASENAME
  };

  /* Create a filter of MATCH_TYPE using regular expression REGEXP.  If
     REGEXP is nullptr then all files will match the filter and MATCH_TYPE
     is ignored.

     The string pointed too by REGEXP must remain live and unchanged for
     this lifetime of this object as the object only retains a copy of the
     pointer.  */
  info_sources_filter (match_on match_type, const char *regexp);

  DISABLE_COPY_AND_ASSIGN (info_sources_filter);

  /* Does FULLNAME match the filter defined by this object, return true if
     it does, otherwise, return false.  If there is no filtering defined
     then this function will always return true.  */
  bool matches (const char *fullname) const;

private:

  /* The type of filtering in place.  */
  match_on m_match_type;

  /* Points to the original regexp used to create this filter.  */
  const char *m_regexp;

  /* A compiled version of M_REGEXP.  This object is only given a value if
     M_REGEXP is not nullptr and is not the empty string.  */
  gdb::optional<compiled_regex> m_c_regexp;
};

/* Perform the core of the 'info sources' command.

   FILTER is used to perform regular expression based filtering on the
   source files that will be displayed.

   Output is written to UIOUT in CLI or MI style as appropriate.  */

extern void info_sources_worker (struct ui_out *uiout,
				 bool group_by_objfile,
				 const info_sources_filter &filter);

#endif /* !defined(SYMTAB_H) */
