/* Helper routines for C++ support in GDB.
   Copyright (C) 2002-2021 Free Software Foundation, Inc.

   Contributed by MontaVista Software.
   Namespace support contributed by David Carlton.

   This file is part of GDB.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#ifndef CP_SUPPORT_H
#define CP_SUPPORT_H

/* We need this for 'domain_enum', alas...  */

#include "symtab.h"
#include "gdbsupport/gdb_vecs.h"
#include "gdb_obstack.h"
#include "gdbsupport/array-view.h"
#include <vector>

/* Opaque declarations.  */

struct symbol;
struct block;
struct buildsym_compunit;
struct objfile;
struct type;
struct demangle_component;
struct using_direct;

/* A string representing the name of the anonymous namespace used in GDB.  */

#define CP_ANONYMOUS_NAMESPACE_STR "(anonymous namespace)"

/* The length of the string representing the anonymous namespace.  */

#define CP_ANONYMOUS_NAMESPACE_LEN 21

/* A string representing the start of an operator name.  */

#define CP_OPERATOR_STR "operator"

/* The length of CP_OPERATOR_STR.  */

#define CP_OPERATOR_LEN 8

/* The result of parsing a name.  */

struct demangle_parse_info
{
  demangle_parse_info ();

  ~demangle_parse_info ();

  /* The memory used during the parse.  */
  struct demangle_info *info;

  /* The result of the parse.  */
  struct demangle_component *tree;

  /* Any temporary memory used during typedef replacement.  */
  struct obstack obstack;
};


/* Functions from cp-support.c.  */

extern gdb::unique_xmalloc_ptr<char> cp_canonicalize_string
  (const char *string);

extern gdb::unique_xmalloc_ptr<char> cp_canonicalize_string_no_typedefs
  (const char *string);

typedef const char *(canonicalization_ftype) (struct type *, void *);

extern gdb::unique_xmalloc_ptr<char> cp_canonicalize_string_full
  (const char *string, canonicalization_ftype *finder, void *data);

extern char *cp_class_name_from_physname (const char *physname);

extern char *method_name_from_physname (const char *physname);

extern unsigned int cp_find_first_component (const char *name);

extern unsigned int cp_entire_prefix_len (const char *name);

extern gdb::unique_xmalloc_ptr<char> cp_func_name (const char *full_name);

extern gdb::unique_xmalloc_ptr<char> cp_remove_params
  (const char *demanged_name);

/* DEMANGLED_NAME is the name of a function, (optionally) including
   parameters and (optionally) a return type.  Return the name of the
   function without parameters or return type, or NULL if we can not
   parse the name.  If COMPLETION_MODE is true, then tolerate a
   non-existing or unbalanced parameter list.  */
extern gdb::unique_xmalloc_ptr<char> cp_remove_params_if_any
  (const char *demangled_name, bool completion_mode);

extern std::vector<symbol *> make_symbol_overload_list (const char *,
							const char *);

extern void add_symbol_overload_list_adl
  (gdb::array_view<type *> arg_types,
   const char *func_name,
   std::vector<symbol *> *overload_list);

extern struct type *cp_lookup_rtti_type (const char *name,
					 const struct block *block);

/* Produce an unsigned hash value from SEARCH_NAME that is compatible
   with cp_symbol_name_matches.  Only the last component in
   "foo::bar::function()" is considered for hashing purposes (i.e.,
   the entire prefix is skipped), so that later on looking up for
   "function" or "bar::function" in all namespaces is possible.  */
extern unsigned int cp_search_name_hash (const char *search_name);

/* Implement the "get_symbol_name_matcher" language_defn method for C++.  */
extern symbol_name_matcher_ftype *cp_get_symbol_name_matcher
  (const lookup_name_info &lookup_name);

/* Functions/variables from cp-namespace.c.  */

extern int cp_is_in_anonymous (const char *symbol_name);

extern void cp_scan_for_anonymous_namespaces (struct buildsym_compunit *,
					      const struct symbol *symbol,
					      struct objfile *objfile);

extern struct block_symbol cp_lookup_symbol_nonlocal
     (const struct language_defn *langdef,
      const char *name,
      const struct block *block,
      const domain_enum domain);

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

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

extern struct block_symbol
  cp_lookup_nested_symbol (struct type *parent_type,
			   const char *nested_name,
			   const struct block *block,
			   const domain_enum domain);

struct type *cp_lookup_transparent_type (const char *name);

/* See description in cp-namespace.c.  */

struct type *cp_find_type_baseclass_by_name (struct type *parent_type,
					     const char *name);

/* Functions from cp-name-parser.y.  */

extern std::unique_ptr<demangle_parse_info> cp_demangled_name_to_comp
     (const char *demangled_name, std::string *errmsg);

extern gdb::unique_xmalloc_ptr<char> cp_comp_to_string
  (struct demangle_component *result, int estimated_len);

extern void cp_merge_demangle_parse_infos (struct demangle_parse_info *,
					   struct demangle_component *,
					   struct demangle_parse_info *);

/* The list of "maint cplus" commands.  */

extern struct cmd_list_element *maint_cplus_cmd_list;

/* A wrapper for bfd_demangle.  */

char *gdb_demangle (const char *name, int options);

#endif /* CP_SUPPORT_H */
