aboutsummaryrefslogtreecommitdiff
path: root/sim/common
diff options
context:
space:
mode:
authorMichael Meissner <gnu@the-meissners.org>1997-05-06 19:27:57 +0000
committerMichael Meissner <gnu@the-meissners.org>1997-05-06 19:27:57 +0000
commit7b167b09004bb574619edad0deca66313954687f (patch)
tree7846d687ccf14e083520195731a3446dc4f388f7 /sim/common
parentbaa83bcc809c6cca57711033ffc3d169aded294a (diff)
downloadbinutils-7b167b09004bb574619edad0deca66313954687f.zip
binutils-7b167b09004bb574619edad0deca66313954687f.tar.gz
binutils-7b167b09004bb574619edad0deca66313954687f.tar.bz2
Add semantic tracing to the tic80
Diffstat (limited to 'sim/common')
-rw-r--r--sim/common/ChangeLog11
-rw-r--r--sim/common/sim-trace.c83
-rw-r--r--sim/common/sim-trace.h66
3 files changed, 102 insertions, 58 deletions
diff --git a/sim/common/ChangeLog b/sim/common/ChangeLog
index f83108a..76dfbb4 100644
--- a/sim/common/ChangeLog
+++ b/sim/common/ChangeLog
@@ -2,13 +2,18 @@ Tue May 6 06:14:01 1997 Mike Meissner <meissner@cygnus.com>
* sim-trace.c (toplevel): Include bfd.h.
(trace_options): Note that --trace-linenum also turns on
- --trace-insn.
+ --trace-insn. Add --trace-{branch,semantics}.
(trace_option_handler): If --trace-linenum, also turn on
- --trace-insn.
+ --trace-insn. Add --trace-branch support. If --trace-semantics,
+ turn on ALU, FPU, branch, and memory tracing.
(trace_one_insn): New function to trace an instruction. Support
--trace-linenum.
+ (OPTION_TRACE_*): Use an enum, rather than lots of defines.
- * sim-trace.h (TRACE_LINENUM_P): Define macro.
+ * sim-trace.h (TRACE_{SEMANTICS,BRANCH}_IDX): Add new macros.
+ (MAX_TRACE_VALUES): Use 32, not 12 by default.
+ (TRACE_branch): Add new mask.
+ (TRACE_*_P): Define all possible trace_p macros.
(trace_one_insn): Declare function.
Mon May 5 14:08:34 1997 Mike Meissner <meissner@cygnus.com>
diff --git a/sim/common/sim-trace.c b/sim/common/sim-trace.c
index 0371b44..a10be4a 100644
--- a/sim/common/sim-trace.c
+++ b/sim/common/sim-trace.c
@@ -31,6 +31,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#endif
#endif
+#ifndef SIZE_PHASE
+#define SIZE_PHASE 8
+#endif
+
#ifndef SIZE_LOCATION
#define SIZE_LOCATION 20
#endif
@@ -47,17 +51,21 @@ static MODULE_UNINSTALL_FN trace_uninstall;
static DECLARE_OPTION_HANDLER (trace_option_handler);
-#define OPTION_TRACE_INSN (OPTION_START + 0)
-#define OPTION_TRACE_DECODE (OPTION_START + 1)
-#define OPTION_TRACE_EXTRACT (OPTION_START + 2)
-#define OPTION_TRACE_LINENUM (OPTION_START + 3)
-#define OPTION_TRACE_MEMORY (OPTION_START + 4)
-#define OPTION_TRACE_MODEL (OPTION_START + 5)
-#define OPTION_TRACE_ALU (OPTION_START + 6)
-#define OPTION_TRACE_CORE (OPTION_START + 7)
-#define OPTION_TRACE_EVENTS (OPTION_START + 8)
-#define OPTION_TRACE_FPU (OPTION_START + 9)
-#define OPTION_TRACE_FILE (OPTION_START + 10)
+enum {
+ OPTION_TRACE_INSN = OPTION_START,
+ OPTION_TRACE_DECODE,
+ OPTION_TRACE_EXTRACT,
+ OPTION_TRACE_LINENUM,
+ OPTION_TRACE_MEMORY,
+ OPTION_TRACE_MODEL,
+ OPTION_TRACE_ALU,
+ OPTION_TRACE_CORE,
+ OPTION_TRACE_EVENTS,
+ OPTION_TRACE_FPU,
+ OPTION_TRACE_BRANCH,
+ OPTION_TRACE_SEMANTICS,
+ OPTION_TRACE_FILE
+};
static const OPTION trace_options[] =
{
@@ -94,6 +102,12 @@ static const OPTION trace_options[] =
{ {"trace-fpu", no_argument, NULL, OPTION_TRACE_FPU},
'\0', NULL, "Perform FPU tracing",
trace_option_handler },
+ { {"trace-branch", no_argument, NULL, OPTION_TRACE_BRANCH},
+ '\0', NULL, "Perform branch tracing",
+ trace_option_handler },
+ { {"trace-semantics", no_argument, NULL, OPTION_TRACE_SEMANTICS},
+ '\0', NULL, "Perform ALU, FPU, and MEMORY tracing",
+ trace_option_handler },
{ {"trace-file", required_argument, NULL, OPTION_TRACE_FILE},
'\0', "FILE NAME", "Specify tracing output file",
trace_option_handler },
@@ -212,6 +226,27 @@ trace_option_handler (sd, opt, arg)
sim_io_eprintf (sd, "FPU tracing not compiled in, `--trace-fpu' ignored\n");
break;
+ case OPTION_TRACE_BRANCH :
+ if (WITH_TRACE_BRANCH_P)
+ for (n = 0; n < MAX_NR_PROCESSORS; ++n)
+ CPU_TRACE_FLAGS (STATE_CPU (sd, n))[TRACE_FPU_IDX] = 1;
+ else
+ sim_io_eprintf (sd, "Branch tracing not compiled in, `--trace-branch' ignored\n");
+ break;
+
+ case OPTION_TRACE_SEMANTICS :
+ if (WITH_TRACE_ALU_P && WITH_TRACE_FPU_P && WITH_TRACE_MEMORY_P)
+ for (n = 0; n < MAX_NR_PROCESSORS; ++n)
+ {
+ CPU_TRACE_FLAGS (STATE_CPU (sd, n))[TRACE_ALU_IDX] = 1;
+ CPU_TRACE_FLAGS (STATE_CPU (sd, n))[TRACE_FPU_IDX] = 1;
+ CPU_TRACE_FLAGS (STATE_CPU (sd, n))[TRACE_MEMORY_IDX] = 1;
+ CPU_TRACE_FLAGS (STATE_CPU (sd, n))[TRACE_BRANCH_IDX] = 1;
+ }
+ else
+ sim_io_eprintf (sd, "Alu, fpu, and/or memory tracing not compiled in, `--trace-semantics' ignored\n");
+ break;
+
case OPTION_TRACE_FILE :
if (! WITH_TRACE)
sim_io_eprintf (sd, "Tracing not compiled in, `--trace-file' ignored\n");
@@ -263,15 +298,21 @@ trace_uninstall (SIM_DESC sd)
void
trace_one_insn (SIM_DESC sd, sim_cpu *cpu, address_word pc,
- int line_p, const TRACE_INSN_DATA *insn_data)
+ int line_p, const char *filename, int linenum,
+ const char *phase_wo_colon, const char *name)
{
+ char phase[SIZE_PHASE+2];
+
+ strncpy (phase, phase_wo_colon, SIZE_PHASE);
+ strcat (phase, ":");
+
if (!line_p)
- trace_printf(sd, cpu, "trace-%s: %s:%-*d 0x%.*lx %s\n",
- insn_data->phase,
- *(insn_data->p_filename),
- SIZE_LINE_NUMBER, insn_data->linenum,
+ trace_printf(sd, cpu, "%-*s %s:%-*d 0x%.*lx %s\n",
+ SIZE_PHASE+1, phase,
+ filename,
+ SIZE_LINE_NUMBER, linenum,
SIZE_PC, (long)pc,
- *(insn_data->p_name));
+ name);
else
{
@@ -321,13 +362,11 @@ trace_one_insn (SIM_DESC sd, sim_cpu *cpu, address_word pc,
}
}
- trace_printf (sd, cpu, "trace-%s: %s:%-*d 0x%.*x %-*.*s %s\n",
- insn_data->phase,
- *(insn_data->p_filename),
- SIZE_LINE_NUMBER, insn_data->linenum,
+ trace_printf (sd, cpu, "%-*s 0x%.*x %-*.*s %s\n",
+ SIZE_PHASE+1, phase,
SIZE_PC, (unsigned) pc,
SIZE_LOCATION, SIZE_LOCATION, buf,
- *(insn_data->p_name));
+ name);
}
}
diff --git a/sim/common/sim-trace.h b/sim/common/sim-trace.h
index 8e1eebc..e1cb786 100644
--- a/sim/common/sim-trace.h
+++ b/sim/common/sim-trace.h
@@ -29,12 +29,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#endif
#endif
-/* Maximum number of traceable entities. */
-#ifndef MAX_TRACE_VALUES
-#define MAX_TRACE_VALUES 12
-#endif
-
/* Standard traceable entities. */
+#define TRACE_SEMANTICS_IDX -1 /* set ALU, FPU, MEMORY tracing */
#define TRACE_INSN_IDX 0
#define TRACE_DECODE_IDX 1
#define TRACE_EXTRACT_IDX 2
@@ -45,8 +41,14 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#define TRACE_CORE_IDX 7
#define TRACE_EVENTS_IDX 8
#define TRACE_FPU_IDX 9
+#define TRACE_BRANCH_IDX 10
#define TRACE_NEXT_IDX 16 /* simulator specific trace bits begin here */
+/* Maximum number of traceable entities. */
+#ifndef MAX_TRACE_VALUES
+#define MAX_TRACE_VALUES 32
+#endif
+
/* Masks so WITH_TRACE can have symbolic values. */
#define TRACE_insn 1
#define TRACE_decode 2
@@ -58,18 +60,20 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#define TRACE_core 128
#define TRACE_events 256
#define TRACE_fpu 512
+#define TRACE_branch 1024
/* Preprocessor macros to simplify tests of WITH_TRACE. */
-#define WITH_TRACE_INSN_P (WITH_TRACE & TRACE_insn)
-#define WITH_TRACE_DECODE_P (WITH_TRACE & TRACE_decode)
-#define WITH_TRACE_EXTRACT_P (WITH_TRACE & TRACE_extract)
-#define WITH_TRACE_LINENUM_P (WITH_TRACE & TRACE_linenum)
-#define WITH_TRACE_MEMORY_P (WITH_TRACE & TRACE_memory)
-#define WITH_TRACE_MODEL_P (WITH_TRACE & TRACE_model)
-#define WITH_TRACE_ALU_P (WITH_TRACE & TRACE_alu)
-#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_INSN_P (WITH_TRACE & TRACE_insn)
+#define WITH_TRACE_DECODE_P (WITH_TRACE & TRACE_decode)
+#define WITH_TRACE_EXTRACT_P (WITH_TRACE & TRACE_extract)
+#define WITH_TRACE_LINENUM_P (WITH_TRACE & TRACE_linenum)
+#define WITH_TRACE_MEMORY_P (WITH_TRACE & TRACE_memory)
+#define WITH_TRACE_MODEL_P (WITH_TRACE & TRACE_model)
+#define WITH_TRACE_ALU_P (WITH_TRACE & TRACE_alu)
+#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_BRANCH_P (WITH_TRACE & TRACE_branch)
/* Tracing install handler. */
MODULE_INSTALL_FN trace_install;
@@ -89,15 +93,6 @@ typedef struct {
FILE *trace_file;
#define TRACE_FILE(t) ((t)->trace_file)
} TRACE_DATA;
-
-/* Structure containing constant stuff to pass to trace_one_insn */
-
-typedef struct {
- const char *phase; /* which phase this in (decode,insn) */
- char **p_filename; /* ptr to filename insns where defined in */
- char **p_name; /* ptr to instruction name */
- int linenum; /* line number of line where insn is defined */
-} TRACE_INSN_DATA;
/* Usage macros. */
@@ -113,18 +108,23 @@ struct _sim_cpu;
((WITH_TRACE & (1 << (idx))) != 0 \
&& CPU_TRACE_FLAGS (cpu)[idx] != 0)
-/* Non-zero if "--trace-insn" specified for CPU. */
-#define TRACE_INSN_P(cpu) TRACE_P (cpu, TRACE_INSN_IDX)
-/* Non-zero if "--trace-linenum" specified for CPU. */
-#define TRACE_LINENUM_P(cpu) TRACE_P (cpu, TRACE_LINENUM_IDX)
-/* Non-zero if "--trace-decode" specified for CPU. */
-#define TRACE_DECODE_P(cpu) TRACE_P (cpu, TRACE_DECODE_IDX)
-/* Non-zero if "--trace-fpu" specified for CPU. */
-#define TRACE_FPU_P(cpu) TRACE_P (cpu, TRACE_FPU_IDX)
+/* Non-zero if a certain --trace-<xxxx> was specified for CPU. */
+#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_LINENUM_P(cpu) TRACE_P (cpu, TRACE_LINENUM_IDX)
+#define TRACE_MEMORY_P(cpu) TRACE_P (cpu, TRACE_MEMORY_IDX)
+#define TRACE_MODEL_P(cpu) TRACE_P (cpu, TRACE_MODEL_IDX)
+#define TRACE_ALU_P(cpu) TRACE_P (cpu, TRACE_ALU_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_BRANCH_P(cpu) TRACE_P (cpu, TRACE_BRANCH_IDX)
extern void trace_one_insn PARAMS ((SIM_DESC, sim_cpu *,
address_word, int,
- const TRACE_INSN_DATA *));
+ const char *, int,
+ const char *, const char *));
extern void trace_printf PARAMS ((SIM_DESC, sim_cpu *, const char *, ...))
__attribute__((format (printf, 3, 4)));