/* Simulator tracing/debugging support.
- Copyright (C) 1997, 1998 Free Software Foundation, Inc.
+ Copyright (C) 1997-1998, 2001, 2007-2012 Free Software Foundation,
+ Inc.
Contributed by Cygnus Support.
This file is part of GDB, the GNU debugger.
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 2, or (at your option)
-any later version.
+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, write to the Free Software Foundation, Inc.,
-59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+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 is meant to be included by sim-basics.h. */
/* Trace fpu operations. */
TRACE_FPU_IDX,
+ /* Trace vpu operations. */
+ TRACE_VPU_IDX,
+
/* Trace branching. */
TRACE_BRANCH_IDX,
+ /* Trace syscalls. */
+ TRACE_SYSCALL_IDX,
+
/* Add information useful for debugging the simulator to trace output. */
TRACE_DEBUG_IDX,
((1 << TRACE_INSN_IDX) \
| (1 << TRACE_LINENUM_IDX) \
| (1 << TRACE_MEMORY_IDX) \
- | (1 << TRACE_MODEL_IDX) \
- | (1 << TRACE_EVENTS_IDX))
+ | (1 << TRACE_MODEL_IDX))
\f
/* Masks so WITH_TRACE can have symbolic values.
The case choice here is on purpose. The lowercase parts are args to
#define TRACE_core (1 << TRACE_CORE_IDX)
#define TRACE_events (1 << TRACE_EVENTS_IDX)
#define TRACE_fpu (1 << TRACE_FPU_IDX)
+#define TRACE_vpu (1 << TRACE_VPU_IDX)
#define TRACE_branch (1 << TRACE_BRANCH_IDX)
+#define TRACE_syscall (1 << TRACE_SYSCALL_IDX)
#define TRACE_debug (1 << TRACE_DEBUG_IDX)
/* Preprocessor macros to simplify tests of WITH_TRACE. */
#define WITH_TRACE_CORE_P (WITH_TRACE & TRACE_core)
#define WITH_TRACE_EVENTS_P (WITH_TRACE & TRACE_events)
#define WITH_TRACE_FPU_P (WITH_TRACE & TRACE_fpu)
+#define WITH_TRACE_VPU_P (WITH_TRACE & TRACE_vpu)
#define WITH_TRACE_BRANCH_P (WITH_TRACE & TRACE_branch)
+#define WITH_TRACE_SYSCALL_P (WITH_TRACE & TRACE_syscall)
#define WITH_TRACE_DEBUG_P (WITH_TRACE & TRACE_debug)
/* Tracing install handler. */
typedef struct _trace_data {
+ /* Global summary of all the current trace options */
+ char trace_any_p;
+
/* Boolean array of specified tracing flags. */
/* ??? It's not clear that using an array vs a bit mask is faster.
Consider the case where one wants to test whether any of several bits
FILE *trace_file;
#define TRACE_FILE(t) ((t)->trace_file)
- /* Buffer to store the prefix to be printed before any trace line */
+ /* Buffer to store the prefix to be printed before any trace line. */
char trace_prefix[256];
#define TRACE_PREFIX(t) ((t)->trace_prefix)
#define TRACE_INPUT_FMT(t) ((t)->trace_input_fmt)
#define TRACE_INPUT_SIZE(t) ((t)->trace_input_size)
#define TRACE_INPUT_IDX(t) ((t)->trace_input_idx)
-
+
/* Category of trace being performed */
int trace_idx;
#define TRACE_IDX(t) ((t)->trace_idx)
-
-} TRACE_DATA;
+ /* Trace range.
+ ??? Not all cpu's support this. */
+ ADDR_RANGE range;
+#define TRACE_RANGE(t) (& (t)->range)
+} TRACE_DATA;
\f
/* System tracing support. */
&& CPU_TRACE_FLAGS (cpu)[idx] != 0)
/* Non-zero if --trace-<xxxx> was specified for CPU. */
+#define TRACE_ANY_P(cpu) ((WITH_TRACE) && (CPU_TRACE_DATA (cpu)->trace_any_p))
#define TRACE_INSN_P(cpu) TRACE_P (cpu, TRACE_INSN_IDX)
#define TRACE_DECODE_P(cpu) TRACE_P (cpu, TRACE_DECODE_IDX)
#define TRACE_EXTRACT_P(cpu) TRACE_P (cpu, TRACE_EXTRACT_IDX)
#define TRACE_CORE_P(cpu) TRACE_P (cpu, TRACE_CORE_IDX)
#define TRACE_EVENTS_P(cpu) TRACE_P (cpu, TRACE_EVENTS_IDX)
#define TRACE_FPU_P(cpu) TRACE_P (cpu, TRACE_FPU_IDX)
+#define TRACE_VPU_P(cpu) TRACE_P (cpu, TRACE_VPU_IDX)
#define TRACE_BRANCH_P(cpu) TRACE_P (cpu, TRACE_BRANCH_IDX)
+#define TRACE_SYSCALL_P(cpu) TRACE_P (cpu, TRACE_SYSCALL_IDX)
#define TRACE_DEBUG_P(cpu) TRACE_P (cpu, TRACE_DEBUG_IDX)
\f
-/* Traceing functions.
-
- */
+/* Tracing functions. */
/* Prime the trace buffers ready for any trace output.
Must be called prior to any other trace operation */
extern void trace_prefix PARAMS ((SIM_DESC sd,
- sim_cpu * cpu,
- address_word cia,
+ sim_cpu *cpu,
+ sim_cia cia,
+ address_word pc,
int print_linenum_p,
const char *file_name,
int line_nr,
const char *fmt,
...))
- __attribute__((format (printf, 7, 8)));
+ __attribute__((format (printf, 8, 9)));
/* Generic trace print, assumes trace_prefix() has been called */
extern void trace_generic PARAMS ((SIM_DESC sd,
sim_cpu *cpu,
int trace_idx,
- char *fmt,
+ const char *fmt,
...))
__attribute__((format (printf, 4, 5)));
unsigned_word d1,
unsigned_word d2));
+extern void trace_input_word4 PARAMS ((SIM_DESC sd,
+ sim_cpu *cpu,
+ int trace_idx,
+ unsigned_word d0,
+ unsigned_word d1,
+ unsigned_word d2,
+ unsigned_word d3));
+
+extern void trace_input_addr1 PARAMS ((SIM_DESC sd,
+ sim_cpu *cpu,
+ int trace_idx,
+ address_word d0));
+
extern void trace_input_bool1 PARAMS ((SIM_DESC sd,
sim_cpu *cpu,
int trace_idx,
/* Other trace_input{_<fmt><nr-inputs>} functions can go here */
+extern void trace_result0 PARAMS ((SIM_DESC sd,
+ sim_cpu *cpu,
+ int trace_idx));
+
extern void trace_result_word1 PARAMS ((SIM_DESC sd,
sim_cpu *cpu,
int trace_idx,
unsigned_word r0));
+extern void trace_result_word2 PARAMS ((SIM_DESC sd,
+ sim_cpu *cpu,
+ int trace_idx,
+ unsigned_word r0,
+ unsigned_word r1));
+
+extern void trace_result_word4 PARAMS ((SIM_DESC sd,
+ sim_cpu *cpu,
+ int trace_idx,
+ unsigned_word r0,
+ unsigned_word r1,
+ unsigned_word r2,
+ unsigned_word r3));
+
extern void trace_result_bool1 PARAMS ((SIM_DESC sd,
sim_cpu *cpu,
int trace_idx,
int trace_idx,
fp_word f0));
+extern void trace_result_fp2 PARAMS ((SIM_DESC sd,
+ sim_cpu *cpu,
+ int trace_idx,
+ fp_word f0,
+ fp_word f1));
+
extern void trace_result_fpu1 PARAMS ((SIM_DESC sd,
sim_cpu *cpu,
int trace_idx,
/* Other trace_result{_<type><nr-results>} */
-/* Macro's for tracing ALU instructions */
+/* Macros for tracing ALU instructions */
#define TRACE_ALU_INPUT0() \
do { \
if (TRACE_ALU_P (CPU)) \
trace_input0 (SD, CPU, TRACE_ALU_IDX); \
} while (0)
-
+
#define TRACE_ALU_INPUT1(V0) \
do { \
if (TRACE_ALU_P (CPU)) \
trace_input_word3 (SD, CPU, TRACE_ALU_IDX, (V0), (V1), (V2)); \
} while (0)
-#define TRACE_ALU_RESULT(R0) \
+#define TRACE_ALU_INPUT4(V0,V1,V2,V3) \
+do { \
+ if (TRACE_ALU_P (CPU)) \
+ trace_input_word4 (SD, CPU, TRACE_ALU_IDX, (V0), (V1), (V2), (V3)); \
+} while (0)
+
+#define TRACE_ALU_RESULT(R0) TRACE_ALU_RESULT1(R0)
+
+#define TRACE_ALU_RESULT0() \
+do { \
+ if (TRACE_ALU_P (CPU)) \
+ trace_result0 (SD, CPU, TRACE_ALU_IDX); \
+} while (0)
+
+#define TRACE_ALU_RESULT1(R0) \
do { \
if (TRACE_ALU_P (CPU)) \
trace_result_word1 (SD, CPU, TRACE_ALU_IDX, (R0)); \
} while (0)
+#define TRACE_ALU_RESULT2(R0,R1) \
+do { \
+ if (TRACE_ALU_P (CPU)) \
+ trace_result_word2 (SD, CPU, TRACE_ALU_IDX, (R0), (R1)); \
+} while (0)
-/* Macro's for tracing FPU instructions */
+#define TRACE_ALU_RESULT4(R0,R1,R2,R3) \
+do { \
+ if (TRACE_ALU_P (CPU)) \
+ trace_result_word4 (SD, CPU, TRACE_ALU_IDX, (R0), (R1), (R2), (R3)); \
+} while (0)
+
+/* Macros for tracing inputs to comparative branch instructions. */
+
+#define TRACE_BRANCH_INPUT1(V0) \
+do { \
+ if (TRACE_BRANCH_P (CPU)) \
+ trace_input_word1 (SD, CPU, TRACE_BRANCH_IDX, (V0)); \
+} while (0)
-#define TRACE_FPU_INPUT0() \
+#define TRACE_BRANCH_INPUT2(V0,V1) \
+do { \
+ if (TRACE_BRANCH_P (CPU)) \
+ trace_input_word2 (SD, CPU, TRACE_BRANCH_IDX, (V0), (V1)); \
+} while (0)
+
+/* Macros for tracing FPU instructions */
+
+#define TRACE_FP_INPUT0() \
do { \
if (TRACE_FPU_P (CPU)) \
trace_input0 (SD, CPU, TRACE_FPU_IDX); \
} while (0)
-
-#define TRACE_FPU_INPUT1(V0) \
+
+#define TRACE_FP_INPUT1(V0) \
do { \
if (TRACE_FPU_P (CPU)) \
trace_input_fp1 (SD, CPU, TRACE_FPU_IDX, (V0)); \
} while (0)
-#define TRACE_FPU_INPUT2(V0,V1) \
+#define TRACE_FP_INPUT2(V0,V1) \
do { \
if (TRACE_FPU_P (CPU)) \
trace_input_fp2 (SD, CPU, TRACE_FPU_IDX, (V0), (V1)); \
} while (0)
-#define TRACE_FPU_INPUT3(V0,V1,V2) \
+#define TRACE_FP_INPUT3(V0,V1,V2) \
do { \
if (TRACE_FPU_P (CPU)) \
trace_input_fp3 (SD, CPU, TRACE_FPU_IDX, (V0), (V1), (V2)); \
} while (0)
-#define TRACE_FPU_RESULT(R0) \
+#define TRACE_FP_INPUT_WORD1(V0) \
+do { \
+ if (TRACE_FPU_P (CPU)) \
+ trace_input_word1 (SD, CPU, TRACE_FPU_IDX, (V0)); \
+} while (0)
+
+#define TRACE_FP_RESULT(R0) \
do { \
if (TRACE_FPU_P (CPU)) \
trace_result_fp1 (SD, CPU, TRACE_FPU_IDX, (R0)); \
} while (0)
-#define TRACE_FPU_RESULT_BOOL(R0) \
+#define TRACE_FP_RESULT2(R0,R1) \
+do { \
+ if (TRACE_FPU_P (CPU)) \
+ trace_result_fp2 (SD, CPU, TRACE_FPU_IDX, (R0), (R1)); \
+} while (0)
+
+#define TRACE_FP_RESULT_BOOL(R0) \
do { \
if (TRACE_FPU_P (CPU)) \
trace_result_bool1 (SD, CPU, TRACE_FPU_IDX, (R0)); \
} while (0)
+#define TRACE_FP_RESULT_WORD(R0) \
+do { \
+ if (TRACE_FPU_P (CPU)) \
+ trace_result_word1 (SD, CPU, TRACE_FPU_IDX, (R0)); \
+} while (0)
+
/* Macros for tracing branches */
} while (0)
\f
-/* The function trace_one_insn has been replaced by trace_generic */
+/* The function trace_one_insn has been replaced by the function pair
+ trace_prefix() + trace_generic() */
extern void trace_one_insn PARAMS ((SIM_DESC sd,
sim_cpu * cpu,
address_word cia,