1/* GDB target debugging macros
2
3   Copyright (C) 2014-2020 Free Software Foundation, Inc.
4
5   This file is part of GDB.
6
7   This program is free software; you can redistribute it and/or modify
8   it under the terms of the GNU General Public License as published by
9   the Free Software Foundation; either version 3 of the License, or
10   (at your option) any later version.
11
12   This program is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   GNU General Public License for more details.
16
17   You should have received a copy of the GNU General Public License
18   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19
20#ifndef TARGET_DEBUG_H
21#define TARGET_DEBUG_H
22
23/* Printers for the debug target.  Each prints an object of a given
24   type to a string that needn't be freed.  Most printers are macros,
25   for brevity, but a few are static functions where more complicated
26   behavior is needed.
27
28   References to these printers are automatically generated by
29   make-target-delegates.  See the generated file target-delegates.c.
30
31   In a couple cases, a special printing function is defined and then
32   used via the TARGET_DEBUG_PRINTER macro.  See target.h.
33
34   A few methods still have some explicit targetdebug code in
35   target.c.  In most cases this is because target delegation hasn't
36   been done for the method; but individual cases vary.  For instance,
37   target_store_registers does some special register printing that is
38   more simply done there, and target_xfer_partial additionally
39   bypasses the debug target.  */
40
41
42/* Helper macro.  */
43
44#define target_debug_do_print(E)			\
45  fputs_unfiltered ((E), gdb_stdlog);
46
47#define target_debug_print_struct_target_ops_p(X)	\
48  target_debug_do_print (host_address_to_string (X))
49#define target_debug_print_enum_target_object(X)	\
50  target_debug_do_print (plongest (X))
51#define target_debug_print_CORE_ADDR(X)		\
52  target_debug_do_print (core_addr_to_string (X))
53#define target_debug_print_const_char_p(X)	\
54  target_debug_do_print (((X) ? (X) : "(null)"))
55#define target_debug_print_char_p(X)		\
56  target_debug_do_print (((X) ? (X) : "(null)"))
57#define target_debug_print_int(X)		\
58  target_debug_do_print (plongest (X))
59#define target_debug_print_bool(X)		\
60  target_debug_do_print ((X) ? "true" : "false")
61#define target_debug_print_long(X)		\
62  target_debug_do_print (plongest (X))
63#define target_debug_print_enum_target_xfer_status(X)	\
64  target_debug_do_print (plongest (X))
65#define target_debug_print_enum_exec_direction_kind(X)	\
66  target_debug_do_print (plongest (X))
67#define target_debug_print_enum_trace_find_type(X)	\
68  target_debug_do_print (plongest (X))
69#define target_debug_print_enum_btrace_read_type(X)	\
70  target_debug_do_print (plongest (X))
71#define target_debug_print_enum_btrace_error(X) \
72  target_debug_do_print (plongest (X))
73#define target_debug_print_ptid_t(X)		\
74  target_debug_do_print (plongest (X.pid ()))
75#define target_debug_print_struct_gdbarch_p(X)	\
76  target_debug_do_print (gdbarch_bfd_arch_info (X)->printable_name)
77#define target_debug_print_const_gdb_byte_p(X)	\
78  target_debug_do_print (host_address_to_string (X))
79#define target_debug_print_gdb_byte_p(X)	\
80  target_debug_do_print (host_address_to_string (X))
81#define target_debug_print_gdb_byte_pp(X)	\
82  target_debug_do_print (host_address_to_string (*(X)))
83#define target_debug_print_enum_gdb_signal(X)	\
84  target_debug_do_print (gdb_signal_to_name (X))
85#define target_debug_print_ULONGEST(X)		\
86  target_debug_do_print (hex_string (X))
87#define target_debug_print_ULONGEST_p(X)	\
88  target_debug_do_print (hex_string (*(X)))
89#define target_debug_print_LONGEST(X)		\
90  target_debug_do_print (phex (X, 0))
91#define target_debug_print_LONGEST_p(X)		\
92  target_debug_do_print (phex (*(X), 0))
93#define target_debug_print_struct_address_space_p(X)	\
94  target_debug_do_print (plongest (address_space_num (X)))
95#define target_debug_print_struct_bp_target_info_p(X)	\
96  target_debug_do_print (core_addr_to_string ((X)->placed_address))
97#define target_debug_print_struct_expression_p(X)	\
98  target_debug_do_print (host_address_to_string (X))
99#define target_debug_print_CORE_ADDR_p(X)	\
100  target_debug_do_print (core_addr_to_string (*(X)))
101#define target_debug_print_int_p(X)		\
102  target_debug_do_print (plongest (*(X)))
103#define target_debug_print_struct_regcache_p(X) \
104  target_debug_do_print (host_address_to_string (X))
105#define target_debug_print_struct_thread_info_p(X)	\
106  target_debug_do_print (host_address_to_string (X))
107#define target_debug_print_struct_ui_file_p(X)	\
108  target_debug_do_print (host_address_to_string (X))
109#define target_debug_print_struct_target_section_table_p(X)	\
110  target_debug_do_print (host_address_to_string (X))
111#define target_debug_print_async_callback_ftype_p(X) \
112  target_debug_do_print (host_address_to_string (X))
113#define target_debug_print_void_p(X) \
114  target_debug_do_print (host_address_to_string (X))
115#define target_debug_print_find_memory_region_ftype(X) \
116  target_debug_do_print (host_address_to_string (X))
117#define target_debug_print_bfd_p(X) \
118  target_debug_do_print (host_address_to_string (X))
119#define target_debug_print_std_vector_mem_region(X) \
120  target_debug_do_print (host_address_to_string (X.data ()))
121#define target_debug_print_std_vector_static_tracepoint_marker(X)	\
122  target_debug_do_print (host_address_to_string (X.data ()))
123#define target_debug_print_const_struct_target_desc_p(X)	\
124  target_debug_do_print (host_address_to_string (X))
125#define target_debug_print_struct_bp_location_p(X)	\
126  target_debug_do_print (host_address_to_string (X))
127#define target_debug_print_struct_trace_state_variable_p(X)	\
128  target_debug_do_print (host_address_to_string (X))
129#define target_debug_print_const_trace_state_variable_r(X)	\
130  target_debug_do_print (host_address_to_string (&X))
131#define target_debug_print_struct_trace_status_p(X)	\
132  target_debug_do_print (host_address_to_string (X))
133#define target_debug_print_struct_breakpoint_p(X)	\
134  target_debug_do_print (host_address_to_string (X))
135#define target_debug_print_struct_uploaded_tp_p(X)	\
136  target_debug_do_print (host_address_to_string (X))
137#define target_debug_print_struct_uploaded_tp_pp(X)	\
138  target_debug_do_print (host_address_to_string (X))
139#define target_debug_print_struct_uploaded_tsv_pp(X)	\
140  target_debug_do_print (host_address_to_string (X))
141#define target_debug_print_static_tracepoint_marker_p(X)	\
142  target_debug_do_print (host_address_to_string (X))
143#define target_debug_print_struct_traceframe_info_p(X)	\
144  target_debug_do_print (host_address_to_string (X))
145#define target_debug_print_struct_btrace_target_info_p(X)	\
146  target_debug_do_print (host_address_to_string (X))
147#define target_debug_print_VEC__btrace_block_s__pp(X)	\
148  target_debug_do_print (host_address_to_string (X))
149#define target_debug_print_const_struct_frame_unwind_p(X)	\
150  target_debug_do_print (host_address_to_string (X))
151#define target_debug_print_struct_btrace_data_p(X)	\
152  target_debug_do_print (host_address_to_string (X))
153#define target_debug_print_enum_btrace_format(X)	\
154  target_debug_do_print (plongest (X))
155#define target_debug_print_enum_record_method(X)	\
156  target_debug_do_print (plongest (X))
157#define target_debug_print_const_struct_btrace_config_p(X)	\
158  target_debug_do_print (host_address_to_string (X))
159#define target_debug_print_const_struct_btrace_target_info_p(X)	\
160  target_debug_do_print (host_address_to_string (X))
161#define target_debug_print_enum_target_hw_bp_type(X) \
162  target_debug_do_print (plongest (X))
163#define target_debug_print_enum_bptype(X) \
164  target_debug_do_print (plongest (X))
165#define target_debug_print_struct_inferior_p(X)	\
166  target_debug_do_print (host_address_to_string (X))
167#define target_debug_print_enum_remove_bp_reason(X) \
168  target_debug_do_print (plongest (X))
169#define target_debug_print_gdb_disassembly_flags(X) \
170  target_debug_do_print (plongest (X))
171#define target_debug_print_traceframe_info_up(X) \
172  target_debug_do_print (host_address_to_string (X.get ()))
173#define target_debug_print_gdb_array_view_const_int(X)	\
174  target_debug_do_print (host_address_to_string (X.data ()))
175#define target_debug_print_inferior_p(inf) \
176  target_debug_do_print (host_address_to_string (inf))
177#define target_debug_print_record_print_flags(X) \
178  target_debug_do_print (plongest (X))
179#define target_debug_print_enum_info_proc_what(X) \
180  target_debug_do_print (plongest (X))
181#define target_debug_print_thread_control_capabilities(X) \
182  target_debug_do_print (plongest (X))
183#define target_debug_print_thread_info_p(X)	\
184  target_debug_do_print (host_address_to_string (X))
185#define target_debug_print_thread_info_pp(X)		\
186  target_debug_do_print (host_address_to_string (X))
187#define target_debug_print_std_string(X) \
188  target_debug_do_print ((X).c_str ())
189#define target_debug_print_gdb_byte_vector(X)	\
190  target_debug_do_print (host_address_to_string (X.data ()))
191
192static void
193target_debug_print_struct_target_waitstatus_p (struct target_waitstatus *status)
194{
195  std::string str = target_waitstatus_to_string (status);
196
197  fputs_unfiltered (str.c_str (), gdb_stdlog);
198}
199
200
201
202/* Macros or functions that are used via TARGET_DEBUG_PRINTER.  */
203
204#define target_debug_print_step(X) \
205  target_debug_do_print ((X) ? "step" : "continue")
206
207static void
208target_debug_print_options (int options)
209{
210  std::string str = target_options_to_string (options);
211
212  fputs_unfiltered (str.c_str (), gdb_stdlog);
213}
214
215static void
216target_debug_print_signals (gdb::array_view<const unsigned char> sigs)
217{
218  fputs_unfiltered ("{", gdb_stdlog);
219
220  for (size_t i = 0; i < sigs.size (); i++)
221    if (sigs[i] != 0)
222      {
223	fprintf_unfiltered (gdb_stdlog, " %s",
224			    gdb_signal_to_name ((enum gdb_signal) i));
225      }
226  fputs_unfiltered (" }", gdb_stdlog);
227}
228
229#endif /* TARGET_DEBUG_H */
230