/* Declarations for debug printing functions.

   Copyright (C) 2014-2025 Free Software Foundation, Inc.

   This file is part of GDB.

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

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

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

#ifndef GDBSUPPORT_COMMON_DEBUG_H
#define GDBSUPPORT_COMMON_DEBUG_H

#include <optional>
#include "gdbsupport/preprocessor.h"

#include <stdarg.h>

/* Set to true to enable debugging of hardware breakpoint/
   watchpoint support code.  */

extern bool show_debug_regs;

/* Print a formatted message to the appropriate channel for
   debugging output for the client.  */

extern void debug_printf (const char *format, ...)
     ATTRIBUTE_PRINTF (1, 2);

/* Print a formatted message to the appropriate channel for
   debugging output for the client.  This function must be
   provided by the client.  */

extern void debug_vprintf (const char *format, va_list ap)
     ATTRIBUTE_PRINTF (1, 0);

/* Print a debug statement prefixed with the module and function name, and
   with a newline at the end.  */

extern void ATTRIBUTE_PRINTF (3, 4) debug_prefixed_printf
  (const char *module, const char *func, const char *format, ...);

/* Print a debug statement prefixed with the module and function name, and
   with a newline at the end.  */

extern void ATTRIBUTE_PRINTF (3, 0) debug_prefixed_vprintf
  (const char *module, const char *func, const char *format, va_list args);

/* Helper to define "_debug_print" macros.

   DEBUG_ENABLED_COND is an expression that evaluates to true if the debugging
   statement is enabled and should be printed.

   The other arguments, as well as the name of the current function, are
   forwarded to debug_prefixed_printf.  */

#define debug_prefixed_printf_cond(debug_enabled_cond, module, fmt, ...) \
  do \
    { \
      if (debug_enabled_cond) \
	debug_prefixed_printf (module, __func__, fmt, ##__VA_ARGS__); \
    } \
  while (0)

#define debug_prefixed_printf_cond_nofunc(debug_enabled_cond, module, fmt, ...) \
  do \
    { \
      if (debug_enabled_cond) \
	debug_prefixed_printf (module, nullptr, fmt, ##__VA_ARGS__); \
    } \
  while (0)

/* Nesting depth of scoped_debug_start_end objects.  */

extern int debug_print_depth;

/* Print a message on construction and destruction, to denote the start and end
   of an operation.  Increment DEBUG_PRINT_DEPTH on construction and decrement
   it on destruction, such that nested debug statements will be printed with
   an indent and appear "inside" this one.  */

template<typename PT>
struct scoped_debug_start_end
{
  /* DEBUG_ENABLED is a reference to a variable that indicates whether debugging
     is enabled, so if the debug statements should be printed.  Is is read
     separately at construction and destruction, such that the start statement
     could be printed but not the end statement, or vice-versa.

     DEBUG_ENABLED should either be of type 'bool &' or should be a type
     that can be invoked.

     MODULE and FUNC are forwarded to debug_prefixed_printf.

     START_PREFIX and END_PREFIX are the statements to print on construction and
     destruction, respectively.

     If the FMT format string is non-nullptr, then a `: ` is appended to the
     messages, followed by the rendering of that format string with ARGS.
     The format string is rendered during construction and is reused as is
     for the message on exit.  */

  scoped_debug_start_end (PT &debug_enabled, const char *module,
			  const char *func, const char *start_prefix,
			  const char *end_prefix, const char *fmt,
			  va_list args)
    ATTRIBUTE_NULL_PRINTF (7, 0)
    : m_debug_enabled (debug_enabled),
      m_module (module),
      m_func (func),
      m_end_prefix (end_prefix),
      m_with_format (fmt != nullptr)
  {
    if (is_debug_enabled ())
      {
	if (fmt != nullptr)
	  {
	    m_msg = string_vprintf (fmt, args);
	    debug_prefixed_printf (m_module, m_func, "%s: %s",
				   start_prefix, m_msg->c_str ());
	  }
	else
	  debug_prefixed_printf (m_module, m_func, "%s", start_prefix);

	++debug_print_depth;
	m_must_decrement_print_depth = true;
      }
  }

  DISABLE_COPY_AND_ASSIGN (scoped_debug_start_end);

  scoped_debug_start_end (scoped_debug_start_end &&other)
    : m_debug_enabled (other.m_debug_enabled),
      m_module (other.m_module),
      m_func (other.m_func),
      m_end_prefix (other.m_end_prefix),
      m_msg (other.m_msg),
      m_with_format (other.m_with_format),
      m_must_decrement_print_depth (other.m_must_decrement_print_depth),
      m_disabled (other.m_disabled)
  {
    /* Avoid the moved-from object doing the side-effects in its destructor.  */
    other.m_disabled = true;
  }

  ~scoped_debug_start_end ()
  {
    if (m_disabled)
      return;

    if (m_must_decrement_print_depth)
      {
	gdb_assert (debug_print_depth > 0);
	--debug_print_depth;
      }

    if (is_debug_enabled ())
      {
	if (m_with_format)
	  {
	    if (m_msg.has_value ())
	      debug_prefixed_printf (m_module, m_func, "%s: %s",
				     m_end_prefix, m_msg->c_str ());
	    else
	      {
		/* A format string was passed to the constructor, but debug
		   control variable wasn't set at the time, so we don't have the
		   rendering of the format string.  */
		debug_prefixed_printf (m_module, m_func, "%s: <%s debugging was not enabled on entry>",
				       m_end_prefix, m_module);
	      }
	  }
	else
	  debug_prefixed_printf (m_module, m_func, "%s", m_end_prefix);
      }
  }

private:

  /* This function is specialized based on the type PT.  Returns true if
     M_DEBUG_ENABLED indicates this debug setting is enabled, otherwise,
     return false.  */
  bool is_debug_enabled () const;

  /* Reference to the debug setting, or a callback that can read the debug
     setting.  Access the value of this by calling IS_DEBUG_ENABLED.  */
  PT &m_debug_enabled;

  const char *m_module;
  const char *m_func;
  const char *m_end_prefix;

  /* The result of formatting the format string in the constructor.  */
  std::optional<std::string> m_msg;

  /* True is a non-nullptr format was passed to the constructor.  */
  bool m_with_format;

  /* This is used to handle the case where debugging is enabled during
     construction but not during destruction, or vice-versa.  We want to make
     sure there are as many increments are there are decrements.  */
  bool m_must_decrement_print_depth = false;

  /* True if this object was moved from, and the destructor behavior must be
     inhibited.  */
  bool m_disabled = false;
};

/* Implementation of is_debug_enabled when PT is an invocable type.  */

template<typename PT>
inline bool
scoped_debug_start_end<PT>::is_debug_enabled () const
{
  return m_debug_enabled ();
}

/* Implementation of is_debug_enabled when PT is 'bool &'.  */

template<>
inline bool
scoped_debug_start_end<bool &>::is_debug_enabled () const
{
  return m_debug_enabled;
}

/* Wrapper around the scoped_debug_start_end constructor to allow the
   caller to create an object using 'auto' type, the actual type will be
   based on the type of the PRED argument.  All arguments are forwarded to
   the scoped_debug_start_end constructor.  */

template<typename PT>
static inline scoped_debug_start_end<PT &> ATTRIBUTE_NULL_PRINTF (6, 7)
make_scoped_debug_start_end (PT &&pred, const char *module, const char *func,
			     const char *start_prefix,
			     const char *end_prefix, const char *fmt, ...)
{
  va_list args;
  va_start (args, fmt);
  auto res = scoped_debug_start_end<PT &> (pred, module, func, start_prefix,
					   end_prefix, fmt, args);
  va_end (args);

  return res;
}

/* Helper to define a module-specific start/end debug macro.  */

#define scoped_debug_start_end(debug_enabled, module, fmt, ...)		\
  auto CONCAT(scoped_debug_start_end, __LINE__)				\
    = make_scoped_debug_start_end (debug_enabled, module, 	\
				   __func__, "start", "end",	\
				   fmt, ##__VA_ARGS__)

/* Helper to define a module-specific enter/exit debug macro.  This is a special
   case of `scoped_debug_start_end` where the start and end messages are "enter"
   and "exit", to denote entry and exit of a function.  */

#define scoped_debug_enter_exit(debug_enabled, module)	\
  auto CONCAT(scoped_debug_start_end, __LINE__)				\
    = make_scoped_debug_start_end (debug_enabled, module, 	\
				   __func__, "enter", "exit",	\
				   nullptr)

#endif /* GDBSUPPORT_COMMON_DEBUG_H */
