diff options
author | Michael Meissner <gnu@the-meissners.org> | 1997-05-06 19:27:57 +0000 |
---|---|---|
committer | Michael Meissner <gnu@the-meissners.org> | 1997-05-06 19:27:57 +0000 |
commit | 7b167b09004bb574619edad0deca66313954687f (patch) | |
tree | 7846d687ccf14e083520195731a3446dc4f388f7 /sim/common | |
parent | baa83bcc809c6cca57711033ffc3d169aded294a (diff) | |
download | binutils-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/ChangeLog | 11 | ||||
-rw-r--r-- | sim/common/sim-trace.c | 83 | ||||
-rw-r--r-- | sim/common/sim-trace.h | 66 |
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))); |