/* Basic C++ demangling support for GDB.

   Copyright (C) 1991-2022 Free Software Foundation, Inc.

   Written by Fred Fish at Cygnus Support.

   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/>.  */


/*  This file contains support code for C++ demangling that is common
   to a styles of demangling, and GDB specific.  */

#include "defs.h"
#include "cli/cli-utils.h" /* for skip_to_space */
#include "command.h"
#include "gdbcmd.h"
#include "demangle.h"
#include "gdb-demangle.h"
#include "language.h"

/* Select the default C++ demangling style to use.  The default is "auto",
   which allows gdb to attempt to pick an appropriate demangling style for
   the executable it has loaded.  It can be set to a specific style ("gnu",
   "lucid", "arm", "hp", etc.) in which case gdb will never attempt to do auto
   selection of the style unless you do an explicit "set demangle auto".
   To select one of these as the default, set DEFAULT_DEMANGLING_STYLE in
   the appropriate target configuration file.  */

#ifndef DEFAULT_DEMANGLING_STYLE
#define DEFAULT_DEMANGLING_STYLE AUTO_DEMANGLING_STYLE_STRING
#endif

/* See documentation in gdb-demangle.h.  */
bool demangle = true;

static void
show_demangle (struct ui_file *file, int from_tty,
	       struct cmd_list_element *c, const char *value)
{
  gdb_printf (file,
	      _("Demangling of encoded C++/ObjC names "
		"when displaying symbols is %s.\n"),
	      value);
}

/* See documentation in gdb-demangle.h.  */
bool asm_demangle = false;

static void
show_asm_demangle (struct ui_file *file, int from_tty,
		   struct cmd_list_element *c, const char *value)
{
  gdb_printf (file,
	      _("Demangling of C++/ObjC names in "
		"disassembly listings is %s.\n"),
	      value);
}

/* String name for the current demangling style.  Set by the
   "set demangle-style" command, printed as part of the output by the
   "show demangle-style" command.  */

static const char *current_demangling_style_string;

/* The array of names of the known demangling styles.  Generated by
   _initialize_demangler from libiberty_demanglers[] array.  */

static const char **demangling_style_names;
static void
show_demangling_style_names(struct ui_file *file, int from_tty,
			    struct cmd_list_element *c, const char *value)
{
  gdb_printf (file, _("The current C++ demangling style is \"%s\".\n"),
	      value);
}

/* Set current demangling style.  Called by the "set demangle-style"
   command after it has updated the current_demangling_style_string to
   match what the user has entered.

   If the user has entered a string that matches a known demangling style
   name in the demanglers[] array then just leave the string alone and update
   the current_demangling_style enum value to match.

   If the user has entered a string that doesn't match, including an empty
   string, then print a list of the currently known styles and restore
   the current_demangling_style_string to match the current_demangling_style
   enum value.

   Note:  Assumes that current_demangling_style_string always points to
   a malloc'd string, even if it is a null-string.  */

static void
set_demangling_command (const char *ignore,
			int from_tty, struct cmd_list_element *c)
{
  const struct demangler_engine *dem;
  int i;

  /*  First just try to match whatever style name the user supplied with
     one of the known ones.  Don't bother special casing for an empty
     name, we just treat it as any other style name that doesn't match.
     If we match, update the current demangling style enum.  */

  for (dem = libiberty_demanglers, i = 0;
       dem->demangling_style != unknown_demangling; 
       dem++)
    {
      if (strcmp (current_demangling_style_string,
		  dem->demangling_style_name) == 0)
	{
	  current_demangling_style = dem->demangling_style;
	  current_demangling_style_string = demangling_style_names[i];
	  break;
	}
      i++;
    }

  /* We should have found a match, given we only add known styles to
     the enumeration list.  */
  gdb_assert (dem->demangling_style != unknown_demangling);
}

/* G++ uses a special character to indicate certain internal names.  Which
   character it is depends on the platform:
   - Usually '$' on systems where the assembler will accept that
   - Usually '.' otherwise (this includes most sysv4-like systems and most
     ELF targets)
   - Occasionally '_' if neither of the above is usable

   We check '$' first because it is the safest, and '.' often has another
   meaning.  We don't currently try to handle '_' because the precise forms
   of the names are different on those targets.  */

static char cplus_markers[] = {'$', '.', '\0'};

/* See documentation in gdb-demangle.h.  */

bool
is_cplus_marker (int c)
{
  return c && strchr (cplus_markers, c) != NULL;
}

/* Demangle the given string in the current language.  */

static void
demangle_command (const char *args, int from_tty)
{
  const char *name;
  const char *arg_start;
  int processing_args = 1;
  const struct language_defn *lang;

  std::string arg_buf = args != NULL ? args : "";
  arg_start = arg_buf.c_str ();

  std::string lang_name;
  while (processing_args
	 && *arg_start == '-')
    {
      const char *p = skip_to_space (arg_start);

      if (strncmp (arg_start, "-l", p - arg_start) == 0)
	lang_name = extract_arg (&p);
      else if (strncmp (arg_start, "--", p - arg_start) == 0)
	processing_args = 0;
      else
	report_unrecognized_option_error ("demangle", arg_start);

      arg_start = skip_spaces (p);
    }

  name = arg_start;

  if (*name == '\0')
    error (_("Usage: demangle [-l LANGUAGE] [--] NAME"));

  if (!lang_name.empty ())
    {
      enum language lang_enum;

      lang_enum = language_enum (lang_name.c_str ());
      if (lang_enum == language_unknown)
	error (_("Unknown language \"%s\""), lang_name.c_str ());
      lang = language_def (lang_enum);
    }
  else
    lang = current_language;

  gdb::unique_xmalloc_ptr<char> demangled
    = language_demangle (lang, name, DMGL_ANSI | DMGL_PARAMS);
  if (demangled != NULL)
    gdb_printf ("%s\n", demangled.get ());
  else
    error (_("Can't demangle \"%s\""), name);
}

void _initialize_gdb_demangle ();
void
_initialize_gdb_demangle ()
{
  int i, ndems;

  /* Fill the demangling_style_names[] array, and set the default
     demangling style chosen at compilation time.  */
  for (ndems = 0;
       libiberty_demanglers[ndems].demangling_style != unknown_demangling; 
       ndems++)
    ;
  demangling_style_names = XCNEWVEC (const char *, ndems + 1);
  for (i = 0;
       libiberty_demanglers[i].demangling_style != unknown_demangling; 
       i++)
    {
      demangling_style_names[i]
	= xstrdup (libiberty_demanglers[i].demangling_style_name);

      if (current_demangling_style_string == NULL
	  && strcmp (DEFAULT_DEMANGLING_STYLE, demangling_style_names[i]) == 0)
	current_demangling_style_string = demangling_style_names[i];
    }

  add_setshow_boolean_cmd ("demangle", class_support, &demangle, _("\
Set demangling of encoded C++/ObjC names when displaying symbols."), _("\
Show demangling of encoded C++/ObjC names when displaying symbols."), NULL,
			   NULL,
			   show_demangle,
			   &setprintlist, &showprintlist);

  add_setshow_boolean_cmd ("asm-demangle", class_support, &asm_demangle, _("\
Set demangling of C++/ObjC names in disassembly listings."), _("\
Show demangling of C++/ObjC names in disassembly listings."), NULL,
			   NULL,
			   show_asm_demangle,
			   &setprintlist, &showprintlist);

  add_setshow_enum_cmd ("demangle-style", class_support,
			demangling_style_names,
			&current_demangling_style_string, _("\
Set the current C++ demangling style."), _("\
Show the current C++ demangling style."), _("\
Use `set demangle-style' without arguments for a list of demangling styles."),
			set_demangling_command,
			show_demangling_style_names,
			&setlist, &showlist);

  add_cmd ("demangle", class_support, demangle_command, _("\
Demangle a mangled name.\n\
Usage: demangle [-l LANGUAGE] [--] NAME\n\
If LANGUAGE is not specified, NAME is demangled in the current language."),
	   &cmdlist);
}
