1 /* Simulator tracing/debugging support.
2 Copyright (C) 1997, 1998 Free Software Foundation, Inc.
3 Contributed by Cygnus Support.
5 This file is part of GDB, the GNU debugger.
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 2, or (at your option)
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.
17 You should have received a copy of the GNU General Public License along
18 with this program; if not, write to the Free Software Foundation, Inc.,
19 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
23 #include "sim-options.h"
27 #include "sim-assert.h"
42 #define SIZE_LOCATION 20
49 #ifndef SIZE_LINE_NUMBER
50 #define SIZE_LINE_NUMBER 4
53 static MODULE_UNINSTALL_FN trace_uninstall
;
55 static DECLARE_OPTION_HANDLER (trace_option_handler
);
58 OPTION_TRACE_INSN
= OPTION_START
,
69 OPTION_TRACE_SEMANTICS
,
74 static const OPTION trace_options
[] =
76 /* This table is organized to group related instructions together. */
77 { {"trace", optional_argument
, NULL
, 't'},
78 't', "on|off", "Trace useful things",
79 trace_option_handler
},
80 { {"trace-insn", optional_argument
, NULL
, OPTION_TRACE_INSN
},
81 '\0', "on|off", "Perform instruction tracing",
82 trace_option_handler
},
83 { {"trace-decode", optional_argument
, NULL
, OPTION_TRACE_DECODE
},
84 '\0', "on|off", "Trace instruction decoding",
85 trace_option_handler
},
86 { {"trace-extract", optional_argument
, NULL
, OPTION_TRACE_EXTRACT
},
87 '\0', "on|off", "Trace instruction extraction",
88 trace_option_handler
},
89 { {"trace-linenum", optional_argument
, NULL
, OPTION_TRACE_LINENUM
},
90 '\0', "on|off", "Perform line number tracing (implies --trace-insn)",
91 trace_option_handler
},
92 { {"trace-memory", optional_argument
, NULL
, OPTION_TRACE_MEMORY
},
93 '\0', "on|off", "Trace memory operations",
94 trace_option_handler
},
95 { {"trace-alu", optional_argument
, NULL
, OPTION_TRACE_ALU
},
96 '\0', "on|off", "Trace ALU operations",
97 trace_option_handler
},
98 { {"trace-fpu", optional_argument
, NULL
, OPTION_TRACE_FPU
},
99 '\0', "on|off", "Trace FPU operations",
100 trace_option_handler
},
101 { {"trace-branch", optional_argument
, NULL
, OPTION_TRACE_BRANCH
},
102 '\0', "on|off", "Trace branching",
103 trace_option_handler
},
104 { {"trace-semantics", optional_argument
, NULL
, OPTION_TRACE_SEMANTICS
},
105 '\0', "on|off", "Perform ALU, FPU, MEMORY, and BRANCH tracing",
106 trace_option_handler
},
107 { {"trace-model", optional_argument
, NULL
, OPTION_TRACE_MODEL
},
108 '\0', "on|off", "Include model performance data",
109 trace_option_handler
},
110 { {"trace-core", optional_argument
, NULL
, OPTION_TRACE_CORE
},
111 '\0', "on|off", "Trace core operations",
112 trace_option_handler
},
113 { {"trace-events", optional_argument
, NULL
, OPTION_TRACE_EVENTS
},
114 '\0', "on|off", "Trace events",
115 trace_option_handler
},
116 { {"trace-debug", optional_argument
, NULL
, OPTION_TRACE_DEBUG
},
117 '\0', "on|off", "Add information useful for debugging the simulator to the tracing output",
118 trace_option_handler
},
119 { {"trace-file", required_argument
, NULL
, OPTION_TRACE_FILE
},
120 '\0', "FILE NAME", "Specify tracing output file",
121 trace_option_handler
},
122 { {NULL
, no_argument
, NULL
, 0}, '\0', NULL
, NULL
, NULL
}
125 /* Set/reset the trace options indicated in MASK. */
128 set_trace_option_mask (sd
, name
, mask
, arg
)
140 if (strcmp (arg
, "yes") == 0
141 || strcmp (arg
, "on") == 0
142 || strcmp (arg
, "1") == 0)
144 else if (strcmp (arg
, "no") == 0
145 || strcmp (arg
, "off") == 0
146 || strcmp (arg
, "0") == 0)
150 sim_io_eprintf (sd
, "Argument `%s' for `--trace%s' invalid, one of `on', `off', `yes', `no' expected\n", arg
, name
);
155 for (trace_nr
= 0; trace_nr
< MAX_TRACE_VALUES
; ++trace_nr
)
157 if ((mask
& (1 << trace_nr
)) == 0)
160 /* Set non-cpu specific values. */
163 case TRACE_EVENTS_IDX
:
164 STATE_EVENTS (sd
)->trace
= trace_val
;
166 case TRACE_DEBUG_IDX
:
167 STATE_TRACE_FLAGS (sd
)[trace_nr
] = trace_val
;
171 /* Set cpu values. */
172 for (cpu_nr
= 0; cpu_nr
< MAX_NR_PROCESSORS
; cpu_nr
++)
174 CPU_TRACE_FLAGS (STATE_CPU (sd
, cpu_nr
))[trace_nr
] = trace_val
;
181 /* Set one trace option based on its IDX value. */
184 set_trace_option (sd
, name
, idx
, arg
)
190 return set_trace_option_mask (sd
, name
, 1 << idx
, arg
);
195 trace_option_handler (sd
, opt
, arg
, is_command
)
207 sim_io_eprintf (sd
, "Tracing not compiled in, `-t' ignored\n");
209 return set_trace_option_mask (sd
, "trace", TRACE_USEFUL_MASK
, arg
);
212 case OPTION_TRACE_INSN
:
213 if (WITH_TRACE_INSN_P
)
214 return set_trace_option (sd
, "-insn", TRACE_INSN_IDX
, arg
);
216 sim_io_eprintf (sd
, "Instruction tracing not compiled in, `--trace-insn' ignored\n");
219 case OPTION_TRACE_DECODE
:
220 if (WITH_TRACE_DECODE_P
)
221 return set_trace_option (sd
, "-decode", TRACE_DECODE_IDX
, arg
);
223 sim_io_eprintf (sd
, "Decode tracing not compiled in, `--trace-decode' ignored\n");
226 case OPTION_TRACE_EXTRACT
:
227 if (WITH_TRACE_EXTRACT_P
)
228 return set_trace_option (sd
, "-extract", TRACE_EXTRACT_IDX
, arg
);
230 sim_io_eprintf (sd
, "Extract tracing not compiled in, `--trace-extract' ignored\n");
233 case OPTION_TRACE_LINENUM
:
234 if (WITH_TRACE_LINENUM_P
&& WITH_TRACE_INSN_P
)
236 if (set_trace_option (sd
, "-linenum", TRACE_LINENUM_IDX
, arg
) != SIM_RC_OK
237 || set_trace_option (sd
, "-linenum", TRACE_INSN_IDX
, arg
) != SIM_RC_OK
)
241 sim_io_eprintf (sd
, "Line number or instruction tracing not compiled in, `--trace-linenum' ignored\n");
244 case OPTION_TRACE_MEMORY
:
245 if (WITH_TRACE_MEMORY_P
)
246 return set_trace_option (sd
, "-memory", TRACE_MEMORY_IDX
, arg
);
248 sim_io_eprintf (sd
, "Memory tracing not compiled in, `--trace-memory' ignored\n");
251 case OPTION_TRACE_MODEL
:
252 if (WITH_TRACE_MODEL_P
)
253 return set_trace_option (sd
, "-model", TRACE_MODEL_IDX
, arg
);
255 sim_io_eprintf (sd
, "Model tracing not compiled in, `--trace-model' ignored\n");
258 case OPTION_TRACE_ALU
:
259 if (WITH_TRACE_ALU_P
)
260 return set_trace_option (sd
, "-alu", TRACE_ALU_IDX
, arg
);
262 sim_io_eprintf (sd
, "ALU tracing not compiled in, `--trace-alu' ignored\n");
265 case OPTION_TRACE_CORE
:
266 if (WITH_TRACE_CORE_P
)
267 return set_trace_option (sd
, "-core", TRACE_CORE_IDX
, arg
);
269 sim_io_eprintf (sd
, "CORE tracing not compiled in, `--trace-core' ignored\n");
272 case OPTION_TRACE_EVENTS
:
273 if (WITH_TRACE_EVENTS_P
)
274 return set_trace_option (sd
, "-events", TRACE_EVENTS_IDX
, arg
);
276 sim_io_eprintf (sd
, "EVENTS tracing not compiled in, `--trace-events' ignored\n");
279 case OPTION_TRACE_FPU
:
280 if (WITH_TRACE_FPU_P
)
281 return set_trace_option (sd
, "-fpu", TRACE_FPU_IDX
, arg
);
283 sim_io_eprintf (sd
, "FPU tracing not compiled in, `--trace-fpu' ignored\n");
286 case OPTION_TRACE_BRANCH
:
287 if (WITH_TRACE_BRANCH_P
)
288 return set_trace_option (sd
, "-branch", TRACE_BRANCH_IDX
, arg
);
290 sim_io_eprintf (sd
, "Branch tracing not compiled in, `--trace-branch' ignored\n");
293 case OPTION_TRACE_SEMANTICS
:
296 && WITH_TRACE_MEMORY_P
297 && WITH_TRACE_BRANCH_P
)
299 if (set_trace_option (sd
, "-semantics", TRACE_ALU_IDX
, arg
) != SIM_RC_OK
300 || set_trace_option (sd
, "-semantics", TRACE_FPU_IDX
, arg
) != SIM_RC_OK
301 || set_trace_option (sd
, "-semantics", TRACE_MEMORY_IDX
, arg
) != SIM_RC_OK
302 || set_trace_option (sd
, "-semantics", TRACE_BRANCH_IDX
, arg
) != SIM_RC_OK
)
306 sim_io_eprintf (sd
, "Alu, fpu, memory, and/or branch tracing not compiled in, `--trace-semantics' ignored\n");
309 case OPTION_TRACE_DEBUG
:
310 if (WITH_TRACE_DEBUG_P
)
311 return set_trace_option (sd
, "-debug", TRACE_DEBUG_IDX
, arg
);
313 sim_io_eprintf (sd
, "Tracing debug support not compiled in, `--trace-debug' ignored\n");
316 case OPTION_TRACE_FILE
:
318 sim_io_eprintf (sd
, "Tracing not compiled in, `--trace-file' ignored\n");
321 FILE *f
= fopen (arg
, "w");
325 sim_io_eprintf (sd
, "Unable to open trace output file `%s'\n", arg
);
328 for (n
= 0; n
< MAX_NR_PROCESSORS
; ++n
)
329 TRACE_FILE (CPU_TRACE_DATA (STATE_CPU (sd
, n
))) = f
;
330 TRACE_FILE (STATE_TRACE_DATA (sd
)) = f
;
338 /* Install tracing support. */
341 trace_install (SIM_DESC sd
)
345 SIM_ASSERT (STATE_MAGIC (sd
) == SIM_MAGIC_NUMBER
);
347 sim_add_option_table (sd
, trace_options
);
348 memset (STATE_TRACE_DATA (sd
), 0, sizeof (* STATE_TRACE_DATA (sd
)));
349 for (i
= 0; i
< MAX_NR_PROCESSORS
; ++i
)
350 memset (CPU_TRACE_DATA (STATE_CPU (sd
, i
)), 0,
351 sizeof (* CPU_TRACE_DATA (STATE_CPU (sd
, i
))));
352 sim_module_add_uninstall_fn (sd
, trace_uninstall
);
357 trace_uninstall (SIM_DESC sd
)
360 FILE *sfile
= TRACE_FILE (STATE_TRACE_DATA (sd
));
365 for (i
= 0; i
< MAX_NR_PROCESSORS
; ++i
)
367 FILE *cfile
= TRACE_FILE (CPU_TRACE_DATA (STATE_CPU (sd
, i
)));
368 if (cfile
!= NULL
&& cfile
!= sfile
)
370 /* If output from different cpus is going to the same file,
371 avoid closing the file twice. */
372 for (j
= 0; j
< i
; ++j
)
373 if (TRACE_FILE (CPU_TRACE_DATA (STATE_CPU (sd
, j
))) == cfile
)
389 trace_fmt_instruction_incomplete
,
392 /* compute the nr of trace data units consumed by data */
394 save_data_size (TRACE_DATA
*data
,
397 return ((size
+ sizeof (TRACE_INPUT_DATA (data
) [0]) - 1)
398 / sizeof (TRACE_INPUT_DATA (data
) [0]));
402 /* Archive DATA into the trace buffer */
404 save_data (SIM_DESC sd
,
410 int i
= TRACE_INPUT_IDX (data
);
411 if (i
== sizeof (TRACE_INPUT_FMT (data
)))
412 sim_io_error (sd
, "trace buffer overflow");
413 TRACE_INPUT_FMT (data
) [i
] = fmt
;
414 TRACE_INPUT_SIZE (data
) [i
] = size
;
415 memcpy (&TRACE_INPUT_DATA (data
) [i
], buf
, size
);
416 i
+= save_data_size (data
, size
);
417 TRACE_INPUT_IDX (data
) = i
;
421 print_data (SIM_DESC sd
,
429 case trace_fmt_instruction_incomplete
:
430 trace_printf (sd
, cpu
, " (instruction incomplete)");
437 case sizeof (unsigned32
):
438 trace_printf (sd
, cpu
, " 0x%08lx", (long) * (unsigned32
*) data
);
440 case sizeof (unsigned64
):
441 trace_printf (sd
, cpu
, " 0x%08lx%08lx",
442 (long) ((* (unsigned64
*) data
) >> 32),
443 (long) * (unsigned64
*) data
);
452 SIM_ASSERT (size
== sizeof (int));
453 trace_printf (sd
, cpu
, " %-8s",
454 (* (int*) data
) ? "true" : "false");
462 /* FIXME: Assumes sizeof float == 4; sizeof double == 8 */
464 sim_fpu_32to (&fp
, * (unsigned32
*) data
);
467 sim_fpu_64to (&fp
, * (unsigned32
*) data
);
472 trace_printf (sd
, cpu
, " %8g", sim_fpu_2d (&fp
));
476 /* FIXME: At present sim_fpu data is stored as a double */
477 trace_printf (sd
, cpu
, " %8g", * (double*) data
);
479 case trace_fmt_string
:
480 trace_printf (sd
, cpu
, " %-8s", (char*) data
);
488 trace_idx_to_str (int trace_idx
)
493 case TRACE_ALU_IDX
: return "alu: ";
494 case TRACE_INSN_IDX
: return "insn: ";
495 case TRACE_DECODE_IDX
: return "decode: ";
496 case TRACE_EXTRACT_IDX
: return "extract: ";
497 case TRACE_MEMORY_IDX
: return "memory: ";
498 case TRACE_CORE_IDX
: return "core: ";
499 case TRACE_EVENTS_IDX
: return "events: ";
500 case TRACE_FPU_IDX
: return "fpu: ";
501 case TRACE_BRANCH_IDX
: return "branch: ";
503 sprintf (num
, "?%d?", trace_idx
);
509 trace_results (SIM_DESC sd
,
514 TRACE_DATA
*data
= CPU_TRACE_DATA (cpu
);
518 /* cross check trace_idx against TRACE_IDX (data)? */
521 trace_printf (sd
, cpu
, "%s %s",
522 trace_idx_to_str (TRACE_IDX (data
)),
523 TRACE_PREFIX (data
));
524 TRACE_IDX (data
) = 0;
526 for (i
= 0, nr_out
= 0;
527 i
< TRACE_INPUT_IDX (data
);
528 i
+= save_data_size (data
, TRACE_INPUT_SIZE (data
) [i
]), nr_out
++)
532 int pad
= (strlen (" 0x") + sizeof (unsigned_word
) * 2);
533 int padding
= pad
* (3 - nr_out
);
536 padding
+= strlen (" ::");
537 trace_printf (sd
, cpu
, "%*s", padding
, " ::");
540 TRACE_INPUT_FMT (data
) [i
],
541 TRACE_INPUT_SIZE (data
) [i
],
542 &TRACE_INPUT_DATA (data
) [i
]);
544 trace_printf (sd
, cpu
, "\n");
548 trace_prefix (SIM_DESC sd
,
552 const char *filename
,
557 TRACE_DATA
*data
= CPU_TRACE_DATA (cpu
);
559 char *prefix
= TRACE_PREFIX (data
);
562 /* if the previous trace data wasn't flushed, flush it now with a
563 note indicating that this occured. */
564 if (TRACE_IDX (data
) != 0)
566 int last_input
= TRACE_INPUT_IDX (data
);
567 save_data (sd
, data
, trace_fmt_instruction_incomplete
, 1, "");
568 trace_results (sd
, cpu
, TRACE_IDX (data
), last_input
);
570 TRACE_IDX (data
) = 0;
571 TRACE_INPUT_IDX (data
) = 0;
575 sprintf (prefix
, "%s:%-*d 0x%.*lx ",
577 SIZE_LINE_NUMBER
, linenum
,
579 chp
= strchr (prefix
, '\0');
581 vsprintf (chp
, fmt
, ap
);
588 if (STATE_TEXT_SECTION (CPU_STATE (cpu
))
589 && pc
>= STATE_TEXT_START (CPU_STATE (cpu
))
590 && pc
< STATE_TEXT_END (CPU_STATE (cpu
)))
592 const char *pc_filename
= (const char *)0;
593 const char *pc_function
= (const char *)0;
594 unsigned int pc_linenum
= 0;
596 if (bfd_find_nearest_line (STATE_PROG_BFD (CPU_STATE (cpu
)),
597 STATE_TEXT_SECTION (CPU_STATE (cpu
)),
598 (struct symbol_cache_entry
**) 0,
599 pc
- STATE_TEXT_START (CPU_STATE (cpu
)),
600 &pc_filename
, &pc_function
, &pc_linenum
))
605 sprintf (p
, "#%-*d ", SIZE_LINE_NUMBER
, pc_linenum
);
610 sprintf (p
, "%-*s ", SIZE_LINE_NUMBER
+1, "---");
611 p
+= SIZE_LINE_NUMBER
+2;
616 sprintf (p
, "%s ", pc_function
);
619 else if (pc_filename
)
621 char *q
= (char *) strrchr (pc_filename
, '/');
622 sprintf (p
, "%s ", (q
) ? q
+1 : pc_filename
);
631 sprintf (prefix
, "0x%.*x %-*.*s ",
632 SIZE_PC
, (unsigned) pc
,
633 SIZE_LOCATION
, SIZE_LOCATION
, buf
);
634 chp
= strchr (prefix
, '\0');
636 vsprintf (chp
, fmt
, ap
);
640 /* pad it out to TRACE_PREFIX_WIDTH. FIXME: The TRACE_PREFIX_WIDTH
641 should be determined at build time using known information about
642 the disassembled instructions */
643 #ifndef TRACE_PREFIX_WIDTH
644 #define TRACE_PREFIX_WIDTH 48
646 chp
= strchr (prefix
, '\0');
647 if (chp
- prefix
< TRACE_PREFIX_WIDTH
)
649 memset (chp
, ' ', TRACE_PREFIX_WIDTH
- (chp
- prefix
));
650 chp
= &prefix
[TRACE_PREFIX_WIDTH
];
655 /* check that we've not over flowed the prefix buffer */
656 if (strlen (prefix
) >= sizeof (TRACE_PREFIX (data
)))
661 trace_generic (SIM_DESC sd
,
668 trace_printf (sd
, cpu
, "%s %s",
669 trace_idx_to_str (trace_idx
),
670 TRACE_PREFIX (CPU_TRACE_DATA (cpu
)));
672 trace_vprintf (sd
, cpu
, fmt
, ap
);
674 trace_printf (sd
, cpu
, "\n");
678 trace_input0 (SIM_DESC sd
,
682 TRACE_DATA
*data
= CPU_TRACE_DATA (cpu
);
683 TRACE_IDX (data
) = trace_idx
;
687 trace_input_word1 (SIM_DESC sd
,
692 TRACE_DATA
*data
= CPU_TRACE_DATA (cpu
);
693 TRACE_IDX (data
) = trace_idx
;
694 save_data (sd
, data
, trace_fmt_word
, sizeof (unsigned_word
), &d0
);
698 trace_input_word2 (SIM_DESC sd
,
704 TRACE_DATA
*data
= CPU_TRACE_DATA (cpu
);
705 TRACE_IDX (data
) = trace_idx
;
706 save_data (sd
, data
, trace_fmt_word
, sizeof (unsigned_word
), &d0
);
707 save_data (sd
, data
, trace_fmt_word
, sizeof (unsigned_word
), &d1
);
711 trace_input_word3 (SIM_DESC sd
,
718 TRACE_DATA
*data
= CPU_TRACE_DATA (cpu
);
719 TRACE_IDX (data
) = trace_idx
;
720 save_data (sd
, data
, trace_fmt_word
, sizeof (unsigned_word
), &d0
);
721 save_data (sd
, data
, trace_fmt_word
, sizeof (unsigned_word
), &d1
);
722 save_data (sd
, data
, trace_fmt_word
, sizeof (unsigned_word
), &d2
);
726 trace_input_word4 (SIM_DESC sd
,
734 TRACE_DATA
*data
= CPU_TRACE_DATA (cpu
);
735 TRACE_IDX (data
) = trace_idx
;
736 save_data (sd
, data
, trace_fmt_word
, sizeof (d0
), &d0
);
737 save_data (sd
, data
, trace_fmt_word
, sizeof (d1
), &d1
);
738 save_data (sd
, data
, trace_fmt_word
, sizeof (d2
), &d2
);
739 save_data (sd
, data
, trace_fmt_word
, sizeof (d3
), &d3
);
743 trace_input_bool1 (SIM_DESC sd
,
748 TRACE_DATA
*data
= CPU_TRACE_DATA (cpu
);
749 TRACE_IDX (data
) = trace_idx
;
750 save_data (sd
, data
, trace_fmt_bool
, sizeof (d0
), &d0
);
754 trace_input_addr1 (SIM_DESC sd
,
759 TRACE_DATA
*data
= CPU_TRACE_DATA (cpu
);
760 TRACE_IDX (data
) = trace_idx
;
761 save_data (sd
, data
, trace_fmt_addr
, sizeof (d0
), &d0
);
765 trace_input_fp1 (SIM_DESC sd
,
770 TRACE_DATA
*data
= CPU_TRACE_DATA (cpu
);
771 TRACE_IDX (data
) = trace_idx
;
772 save_data (sd
, data
, trace_fmt_fp
, sizeof (fp_word
), &f0
);
776 trace_input_fp2 (SIM_DESC sd
,
782 TRACE_DATA
*data
= CPU_TRACE_DATA (cpu
);
783 TRACE_IDX (data
) = trace_idx
;
784 save_data (sd
, data
, trace_fmt_fp
, sizeof (fp_word
), &f0
);
785 save_data (sd
, data
, trace_fmt_fp
, sizeof (fp_word
), &f1
);
789 trace_input_fp3 (SIM_DESC sd
,
796 TRACE_DATA
*data
= CPU_TRACE_DATA (cpu
);
797 TRACE_IDX (data
) = trace_idx
;
798 save_data (sd
, data
, trace_fmt_fp
, sizeof (fp_word
), &f0
);
799 save_data (sd
, data
, trace_fmt_fp
, sizeof (fp_word
), &f1
);
800 save_data (sd
, data
, trace_fmt_fp
, sizeof (fp_word
), &f2
);
804 trace_input_fpu1 (SIM_DESC sd
,
810 TRACE_DATA
*data
= CPU_TRACE_DATA (cpu
);
811 TRACE_IDX (data
) = trace_idx
;
813 save_data (sd
, data
, trace_fmt_fp
, sizeof (double), &d
);
817 trace_input_fpu2 (SIM_DESC sd
,
824 TRACE_DATA
*data
= CPU_TRACE_DATA (cpu
);
825 TRACE_IDX (data
) = trace_idx
;
827 save_data (sd
, data
, trace_fmt_fp
, sizeof (double), &d
);
829 save_data (sd
, data
, trace_fmt_fp
, sizeof (double), &d
);
833 trace_input_fpu3 (SIM_DESC sd
,
841 TRACE_DATA
*data
= CPU_TRACE_DATA (cpu
);
842 TRACE_IDX (data
) = trace_idx
;
844 save_data (sd
, data
, trace_fmt_fp
, sizeof (double), &d
);
846 save_data (sd
, data
, trace_fmt_fp
, sizeof (double), &d
);
848 save_data (sd
, data
, trace_fmt_fp
, sizeof (double), &d
);
852 trace_result_word1 (SIM_DESC sd
,
857 TRACE_DATA
*data
= CPU_TRACE_DATA (cpu
);
860 /* Append any results to the end of the inputs */
861 last_input
= TRACE_INPUT_IDX (data
);
862 save_data (sd
, data
, trace_fmt_word
, sizeof (unsigned_word
), &r0
);
864 trace_results (sd
, cpu
, trace_idx
, last_input
);
868 trace_result_word2 (SIM_DESC sd
,
874 TRACE_DATA
*data
= CPU_TRACE_DATA (cpu
);
877 /* Append any results to the end of the inputs */
878 last_input
= TRACE_INPUT_IDX (data
);
879 save_data (sd
, data
, trace_fmt_word
, sizeof (r0
), &r0
);
880 save_data (sd
, data
, trace_fmt_word
, sizeof (r1
), &r1
);
882 trace_results (sd
, cpu
, trace_idx
, last_input
);
886 trace_result_word4 (SIM_DESC sd
,
894 TRACE_DATA
*data
= CPU_TRACE_DATA (cpu
);
897 /* Append any results to the end of the inputs */
898 last_input
= TRACE_INPUT_IDX (data
);
899 save_data (sd
, data
, trace_fmt_word
, sizeof (r0
), &r0
);
900 save_data (sd
, data
, trace_fmt_word
, sizeof (r1
), &r1
);
901 save_data (sd
, data
, trace_fmt_word
, sizeof (r2
), &r2
);
902 save_data (sd
, data
, trace_fmt_word
, sizeof (r3
), &r3
);
904 trace_results (sd
, cpu
, trace_idx
, last_input
);
908 trace_result_bool1 (SIM_DESC sd
,
913 TRACE_DATA
*data
= CPU_TRACE_DATA (cpu
);
916 /* Append any results to the end of the inputs */
917 last_input
= TRACE_INPUT_IDX (data
);
918 save_data (sd
, data
, trace_fmt_bool
, sizeof (r0
), &r0
);
920 trace_results (sd
, cpu
, trace_idx
, last_input
);
924 trace_result_addr1 (SIM_DESC sd
,
929 TRACE_DATA
*data
= CPU_TRACE_DATA (cpu
);
932 /* Append any results to the end of the inputs */
933 last_input
= TRACE_INPUT_IDX (data
);
934 save_data (sd
, data
, trace_fmt_addr
, sizeof (r0
), &r0
);
936 trace_results (sd
, cpu
, trace_idx
, last_input
);
940 trace_result_fp1 (SIM_DESC sd
,
945 TRACE_DATA
*data
= CPU_TRACE_DATA (cpu
);
948 /* Append any results to the end of the inputs */
949 last_input
= TRACE_INPUT_IDX (data
);
950 save_data (sd
, data
, trace_fmt_fp
, sizeof (fp_word
), &f0
);
952 trace_results (sd
, cpu
, trace_idx
, last_input
);
956 trace_result_fpu1 (SIM_DESC sd
,
962 TRACE_DATA
*data
= CPU_TRACE_DATA (cpu
);
965 /* Append any results to the end of the inputs */
966 last_input
= TRACE_INPUT_IDX (data
);
968 save_data (sd
, data
, trace_fmt_fp
, sizeof (double), &d
);
970 trace_results (sd
, cpu
, trace_idx
, last_input
);
974 trace_result_string1 (SIM_DESC sd
,
979 TRACE_DATA
*data
= CPU_TRACE_DATA (cpu
);
982 /* Append any results to the end of the inputs */
983 last_input
= TRACE_INPUT_IDX (data
);
984 save_data (sd
, data
, trace_fmt_string
, strlen (s0
) + 1, s0
);
986 trace_results (sd
, cpu
, trace_idx
, last_input
);
990 trace_result_word1_string1 (SIM_DESC sd
,
996 TRACE_DATA
*data
= CPU_TRACE_DATA (cpu
);
999 /* Append any results to the end of the inputs */
1000 last_input
= TRACE_INPUT_IDX (data
);
1001 save_data (sd
, data
, trace_fmt_word
, sizeof (unsigned_word
), &r0
);
1002 save_data (sd
, data
, trace_fmt_string
, strlen (s0
) + 1, s0
);
1004 trace_results (sd
, cpu
, trace_idx
, last_input
);
1008 trace_vprintf (SIM_DESC sd
, sim_cpu
*cpu
, const char *fmt
, va_list ap
)
1012 if (TRACE_FILE (CPU_TRACE_DATA (cpu
)) != NULL
)
1013 vfprintf (TRACE_FILE (CPU_TRACE_DATA (cpu
)), fmt
, ap
);
1015 sim_io_evprintf (sd
, fmt
, ap
);
1019 if (TRACE_FILE (STATE_TRACE_DATA (sd
)) != NULL
)
1020 vfprintf (TRACE_FILE (STATE_TRACE_DATA (sd
)), fmt
, ap
);
1022 sim_io_evprintf (sd
, fmt
, ap
);
1027 trace_one_insn (SIM_DESC sd
, sim_cpu
*cpu
, address_word pc
,
1028 int line_p
, const char *filename
, int linenum
,
1029 const char *phase_wo_colon
, const char *fmt
,
1033 char phase
[SIZE_PHASE
+2];
1035 strncpy (phase
, phase_wo_colon
, SIZE_PHASE
);
1036 strcat (phase
, ":");
1040 trace_printf (sd
, cpu
, "%-*s %s:%-*d 0x%.*lx ",
1041 SIZE_PHASE
+1, phase
,
1043 SIZE_LINE_NUMBER
, linenum
,
1046 trace_vprintf (sd
, cpu
, fmt
, ap
);
1048 trace_printf (sd
, cpu
, "\n");
1055 if (STATE_TEXT_SECTION (CPU_STATE (cpu
))
1056 && pc
>= STATE_TEXT_START (CPU_STATE (cpu
))
1057 && pc
< STATE_TEXT_END (CPU_STATE (cpu
)))
1059 const char *pc_filename
= (const char *)0;
1060 const char *pc_function
= (const char *)0;
1061 unsigned int pc_linenum
= 0;
1063 if (bfd_find_nearest_line (STATE_PROG_BFD (CPU_STATE (cpu
)),
1064 STATE_TEXT_SECTION (CPU_STATE (cpu
)),
1065 (struct symbol_cache_entry
**) 0,
1066 pc
- STATE_TEXT_START (CPU_STATE (cpu
)),
1067 &pc_filename
, &pc_function
, &pc_linenum
))
1072 sprintf (p
, "#%-*d ", SIZE_LINE_NUMBER
, pc_linenum
);
1077 sprintf (p
, "%-*s ", SIZE_LINE_NUMBER
+1, "---");
1078 p
+= SIZE_LINE_NUMBER
+2;
1083 sprintf (p
, "%s ", pc_function
);
1086 else if (pc_filename
)
1088 char *q
= (char *) strrchr (pc_filename
, '/');
1089 sprintf (p
, "%s ", (q
) ? q
+1 : pc_filename
);
1098 trace_printf (sd
, cpu
, "%-*s 0x%.*x %-*.*s ",
1099 SIZE_PHASE
+1, phase
,
1100 SIZE_PC
, (unsigned) pc
,
1101 SIZE_LOCATION
, SIZE_LOCATION
, buf
);
1103 trace_vprintf (sd
, cpu
, fmt
, ap
);
1105 trace_printf (sd
, cpu
, "\n");
1110 trace_printf
VPARAMS ((SIM_DESC sd
, sim_cpu
*cpu
, const char *fmt
, ...))
1112 #if !defined __STDC__ && !defined ALMOST_STDC
1120 #if !defined __STDC__ && !defined ALMOST_STDC
1121 sd
= va_arg (ap
, SIM_DESC
);
1122 cpu
= va_arg (ap
, sim_cpu
*);
1123 fmt
= va_arg (ap
, const char *);
1126 trace_vprintf (sd
, cpu
, fmt
, ap
);
1132 debug_printf
VPARAMS ((sim_cpu
*cpu
, const char *fmt
, ...))
1134 #if !defined __STDC__ && !defined ALMOST_STDC
1141 #if !defined __STDC__ && !defined ALMOST_STDC
1142 cpu
= va_arg (ap
, sim_cpu
*);
1143 fmt
= va_arg (ap
, const char *);
1146 if (CPU_DEBUG_FILE (cpu
) == NULL
)
1147 (* STATE_CALLBACK (CPU_STATE (cpu
))->evprintf_filtered
)
1148 (STATE_CALLBACK (CPU_STATE (cpu
)), fmt
, ap
);
1150 vfprintf (CPU_DEBUG_FILE (cpu
), fmt
, ap
);