/* GDB target debugging macros

   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 GDB_TARGET_DEBUG_H
#define GDB_TARGET_DEBUG_H

/* Printers for the debug target.  Each prints an object of a given
   type to a string that needn't be freed.  Most printers are macros,
   for brevity, but a few are static functions where more complicated
   behavior is needed.

   References to these printers are automatically generated by
   make-target-delegates.  See the generated file target-delegates-gen.c.

   In a couple cases, a special printing function is defined and then
   used via the TARGET_DEBUG_PRINTER macro.  See target.h.

   A few methods still have some explicit targetdebug code in
   target.c.  In most cases this is because target delegation hasn't
   been done for the method; but individual cases vary.  For instance,
   target_store_registers does some special register printing that is
   more simply done there, and target_xfer_partial additionally
   bypasses the debug target.  */

#include "gdbarch.h"
#include "gdbsupport/x86-xstate.h"
#include "progspace.h"
#include "target.h"
#include "target/wait.h"
#include "target/waitstatus.h"

/* The functions defined in this header file are not marked "inline", such
   that any function not used by target-delegates-gen.c (the only user of this
   file) will be flagged as unused.  */

static std::string
target_debug_print_target_object (target_object object)
{ return plongest (object); }

static std::string
target_debug_print_CORE_ADDR (CORE_ADDR addr)
{ return core_addr_to_string (addr); }

static std::string
target_debug_print_const_char_p (const char *s)
{ return s != nullptr ? s : "(null)"; }

static std::string
target_debug_print_int (int v)
{ return plongest (v); }

static std::string
target_debug_print_bool (bool v)
{ return v ? "true" : "false"; }

static std::string
target_debug_print_long (long v)
{ return plongest (v); }

static std::string
target_debug_print_target_xfer_status (target_xfer_status status)
{ return plongest (status); }

static std::string
target_debug_print_exec_direction_kind (exec_direction_kind kind)
{ return plongest (kind); }

static std::string
target_debug_print_trace_find_type (trace_find_type type)
{ return plongest (type); }

static std::string
target_debug_print_btrace_read_type (btrace_read_type type)
{ return plongest (type); }

static std::string
target_debug_print_btrace_error (btrace_error error)
{ return plongest (error); }

static std::string
target_debug_print_ptid_t (ptid_t ptid)
{ return plongest (ptid.pid ()); }

static std::string
target_debug_print_gdbarch_p (gdbarch *arch)
{ return gdbarch_bfd_arch_info (arch)->printable_name; }

static std::string
target_debug_print_const_gdb_byte_p (const gdb_byte *p)
{ return host_address_to_string (p); }

static std::string
target_debug_print_gdb_byte_p (gdb_byte *p)
{ return host_address_to_string (p); }

static std::string
target_debug_print_const_gdb_byte_pp (const gdb_byte **p)
{ return host_address_to_string (*p); }

static std::string
target_debug_print_gdb_signal (gdb_signal sig)
{ return gdb_signal_to_name (sig); }

static std::string
target_debug_print_ULONGEST (ULONGEST v)
{ return hex_string (v); }

static std::string
target_debug_print_ULONGEST_p (ULONGEST *p)
{ return hex_string (*p); }

static std::string
target_debug_print_LONGEST (LONGEST v)
{ return phex (v, 0); }

static std::string
target_debug_print_LONGEST_p (LONGEST *p)
{ return phex (*p, 0); }

static std::string
target_debug_print_bp_target_info_p (bp_target_info *bp)
{ return core_addr_to_string (bp->placed_address); }

static std::string
target_debug_print_expression_p (expression *exp)
{ return host_address_to_string (exp); }

static std::string
target_debug_print_CORE_ADDR_p (CORE_ADDR *p)
{ return core_addr_to_string (*p); }

static std::string
target_debug_print_CORE_ADDR_r (CORE_ADDR &p)
{ return core_addr_to_string (p); }

static std::string
target_debug_print_int_p (int *p)
{ return plongest (*p); }

static std::string
target_debug_print_regcache_p (regcache *regcache)
{ return host_address_to_string (regcache); }

static std::string
target_debug_print_thread_info_p (thread_info *thread)
{ return host_address_to_string (thread); }

static std::string
target_debug_print_ui_file_p (ui_file *file)
{ return host_address_to_string (file); }

static std::string
target_debug_print_const_std_vector_target_section_p
  (const std::vector<target_section> *vec)
{ return host_address_to_string (vec->data ()); }

static std::string
target_debug_print_void_p (void *p)
{ return host_address_to_string (p); }

static std::string
target_debug_print_find_memory_region_ftype (find_memory_region_ftype func)
{ return host_address_to_string (func); }

static std::string
target_debug_print_bfd_p (bfd *bfd)
{ return host_address_to_string (bfd); }

static std::string
target_debug_print_std_vector_mem_region (const std::vector<mem_region> &vec)
{ return host_address_to_string (vec.data ()); }

static std::string
target_debug_print_std_vector_static_tracepoint_marker
  (const std::vector<static_tracepoint_marker> &vec)
{ return host_address_to_string (vec.data ()); }

static std::string
target_debug_print_const_target_desc_p (const target_desc *tdesc)
{ return host_address_to_string (tdesc); }

static std::string
target_debug_print_bp_location_p (bp_location *loc)
{ return host_address_to_string (loc); }

static std::string
target_debug_print_const_trace_state_variable_r
  (const trace_state_variable &tsv)
{ return host_address_to_string (&tsv); }

static std::string
target_debug_print_trace_status_p (trace_status *status)
{ return host_address_to_string (status); }

static std::string
target_debug_print_tracepoint_p (tracepoint *tp)
{ return host_address_to_string (tp); }

static std::string
target_debug_print_uploaded_tp_p (uploaded_tp *tp)
{ return host_address_to_string (tp); }

static std::string
target_debug_print_uploaded_tp_pp (uploaded_tp **v)
{ return host_address_to_string (*v); }

static std::string
target_debug_print_uploaded_tsv_pp (uploaded_tsv **tsv)
{ return host_address_to_string (tsv); }

static std::string
target_debug_print_static_tracepoint_marker_p (static_tracepoint_marker *marker)
{ return host_address_to_string (marker); }

static std::string
target_debug_print_btrace_target_info_p (btrace_target_info *info)
{ return host_address_to_string (info); }

static std::string
target_debug_print_const_frame_unwind_p (const frame_unwind *fu)
{ return host_address_to_string (fu); }

static std::string
target_debug_print_btrace_data_p (btrace_data *data)
{ return host_address_to_string (data); }

static std::string
target_debug_print_record_method (record_method method)
{ return plongest (method); }

static std::string
target_debug_print_const_btrace_config_p (const btrace_config *config)
{ return host_address_to_string (config); }

static std::string
target_debug_print_const_btrace_target_info_p (const btrace_target_info *info)
{ return host_address_to_string (info); }

static std::string
target_debug_print_target_hw_bp_type (target_hw_bp_type type)
{ return plongest (type); }

static std::string
target_debug_print_bptype (bptype type)
{ return plongest (type); }

static std::string
target_debug_print_inferior_p (inferior *inf)
{ return host_address_to_string (inf); }

static std::string
target_debug_print_remove_bp_reason (remove_bp_reason reason)
{ return plongest (reason); }

static std::string
target_debug_print_gdb_disassembly_flags (gdb_disassembly_flags flags)
{ return plongest (flags); }

static std::string
target_debug_print_traceframe_info_up (std::unique_ptr<traceframe_info> &info)
{ return host_address_to_string (info.get ()); }

static std::string
target_debug_print_gdb_array_view_const_int
  (const gdb::array_view<const int> &view)
{ return host_address_to_string (view.data ()); }

static std::string
target_debug_print_record_print_flags (record_print_flags flags)
{ return plongest (flags); }

static std::string
target_debug_print_thread_control_capabilities (thread_control_capabilities cap)
{ return plongest (cap); }

static std::string
target_debug_print_std_string (const std::string &str)
{ return str.c_str (); }

static std::string
target_debug_print_gdb_unique_xmalloc_ptr_char
  (const gdb::unique_xmalloc_ptr<char> &p)
{ return p.get (); }

static std::string
target_debug_print_target_waitkind (target_waitkind kind)
{ return pulongest (kind); }

static std::string
target_debug_print_gdb_thread_options (gdb_thread_options options)
{ return to_string (options); }

static std::string
target_debug_print_target_waitstatus_p (struct target_waitstatus *status)
{ return status->to_string (); }

static std::string
target_debug_print_const_target_waitstatus_r (const target_waitstatus &status)
{ return status.to_string (); }

/* Functions that are used via TARGET_DEBUG_PRINTER.  */

static std::string
target_debug_print_step (int step)
{ return step ? "step" : "continue"; }

static std::string
target_debug_print_target_wait_flags (target_wait_flags options)
{ return target_options_to_string (options); }

static std::string
target_debug_print_signals (gdb::array_view<const unsigned char> sigs)
{
  std::string s = "{";

  for (size_t i = 0; i < sigs.size (); i++)
    if (sigs[i] != 0)
      string_appendf (s, " %s",
		      gdb_signal_to_name (static_cast<gdb_signal>(i)));

  s += " }";

  return s;
}

static std::string
target_debug_print_size_t (size_t size)
{
  return pulongest (size);
}

static std::string
target_debug_print_gdb_array_view_const_gdb_byte (gdb::array_view<const gdb_byte> vector)
{
  std::string s = "{";

  for (const auto b : vector)
    string_appendf (s, " %s", phex_nz (b, 1));

  s += " }";

  return s;
}

static std::string
target_debug_print_const_gdb_byte_vector_r (const gdb::byte_vector &vector)
{ return target_debug_print_gdb_array_view_const_gdb_byte (vector); }

static std::string
target_debug_print_gdb_byte_vector_r (gdb::byte_vector &vector)
{ return target_debug_print_const_gdb_byte_vector_r (vector); }

static std::string
target_debug_print_x86_xsave_layout (const x86_xsave_layout &layout)
{
  std::string s = string_printf ("{ sizeof_xsave=%d", layout.sizeof_xsave);

#define POFFS(region)						\
  if (layout.region##_offset != 0)				\
    string_appendf (s, ", " #region "_offset=%d", layout.region##_offset);

  POFFS(avx);
  POFFS(k);
  POFFS(zmm_h);
  POFFS(zmm);
  POFFS(pkru);

#undef POFFS

  s += " }";

  return s;
}

static std::string
target_debug_print_displaced_step_finish_status (displaced_step_finish_status s)
{ return displaced_step_finish_status_str (s); }

static std::string
target_debug_print_displaced_step_prepare_status
  (displaced_step_prepare_status s)
{ return displaced_step_prepare_status_str (s); }

#endif /* GDB_TARGET_DEBUG_H */
