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", (long) * (unsigned64*) data);
450 SIM_ASSERT (size == sizeof (int));
451 trace_printf (sd, cpu, " %-8s",
452 (* (int*) data) ? "true" : "false");
460 /* FIXME: Assumes sizeof float == 4; sizeof double == 8 */
462 sim_fpu_32to (&fp, * (unsigned32*) data);
465 sim_fpu_64to (&fp, * (unsigned32*) data);
470 trace_printf (sd, cpu, " %8g", sim_fpu_2d (&fp));
474 /* FIXME: At present sim_fpu data is stored as a double */
475 trace_printf (sd, cpu, " %8g", * (double*) data);
477 case trace_fmt_string:
478 trace_printf (sd, cpu, " %-8s", (char*) data);
486 trace_idx_to_str (int trace_idx)
491 case TRACE_ALU_IDX: return "alu: ";
492 case TRACE_INSN_IDX: return "insn: ";
493 case TRACE_DECODE_IDX: return "decode: ";
494 case TRACE_EXTRACT_IDX: return "extract: ";
495 case TRACE_MEMORY_IDX: return "memory: ";
496 case TRACE_CORE_IDX: return "core: ";
497 case TRACE_EVENTS_IDX: return "events: ";
498 case TRACE_FPU_IDX: return "fpu: ";
499 case TRACE_BRANCH_IDX: return "branch: ";
501 sprintf (num, "?%d?", trace_idx);
507 trace_results (SIM_DESC sd,
512 TRACE_DATA *data = CPU_TRACE_DATA (cpu);
516 /* cross check trace_idx against TRACE_IDX (data)? */
519 trace_printf (sd, cpu, "%s %s",
520 trace_idx_to_str (TRACE_IDX (data)),
521 TRACE_PREFIX (data));
522 TRACE_IDX (data) = 0;
524 for (i = 0, nr_out = 0;
525 i < TRACE_INPUT_IDX (data);
526 i += save_data_size (data, TRACE_INPUT_SIZE (data) [i]), nr_out++)
530 int pad = (strlen (" 0x") + sizeof (unsigned_word) * 2);
531 int padding = pad * (3 - nr_out);
534 padding += strlen (" ::");
535 trace_printf (sd, cpu, "%*s", padding, " ::");
538 TRACE_INPUT_FMT (data) [i],
539 TRACE_INPUT_SIZE (data) [i],
540 &TRACE_INPUT_DATA (data) [i]);
542 trace_printf (sd, cpu, "\n");
546 trace_prefix (SIM_DESC sd,
550 const char *filename,
555 TRACE_DATA *data = CPU_TRACE_DATA (cpu);
557 char *prefix = TRACE_PREFIX (data);
560 /* if the previous trace data wasn't flushed, flush it now with a
561 note indicating that this occured. */
562 if (TRACE_IDX (data) != 0)
564 int last_input = TRACE_INPUT_IDX (data);
565 save_data (sd, data, trace_fmt_instruction_incomplete, 1, "");
566 trace_results (sd, cpu, TRACE_IDX (data), last_input);
568 TRACE_IDX (data) = 0;
569 TRACE_INPUT_IDX (data) = 0;
573 sprintf (prefix, "%s:%-*d 0x%.*lx ",
575 SIZE_LINE_NUMBER, linenum,
577 chp = strchr (prefix, '\0');
579 vsprintf (chp, fmt, ap);
586 if (STATE_TEXT_SECTION (CPU_STATE (cpu))
587 && pc >= STATE_TEXT_START (CPU_STATE (cpu))
588 && pc < STATE_TEXT_END (CPU_STATE (cpu)))
590 const char *pc_filename = (const char *)0;
591 const char *pc_function = (const char *)0;
592 unsigned int pc_linenum = 0;
594 if (bfd_find_nearest_line (STATE_PROG_BFD (CPU_STATE (cpu)),
595 STATE_TEXT_SECTION (CPU_STATE (cpu)),
596 (struct symbol_cache_entry **) 0,
597 pc - STATE_TEXT_START (CPU_STATE (cpu)),
598 &pc_filename, &pc_function, &pc_linenum))
603 sprintf (p, "#%-*d ", SIZE_LINE_NUMBER, pc_linenum);
608 sprintf (p, "%-*s ", SIZE_LINE_NUMBER+1, "---");
609 p += SIZE_LINE_NUMBER+2;
614 sprintf (p, "%s ", pc_function);
617 else if (pc_filename)
619 char *q = (char *) strrchr (pc_filename, '/');
620 sprintf (p, "%s ", (q) ? q+1 : pc_filename);
629 sprintf (prefix, "0x%.*x %-*.*s ",
630 SIZE_PC, (unsigned) pc,
631 SIZE_LOCATION, SIZE_LOCATION, buf);
632 chp = strchr (prefix, '\0');
634 vsprintf (chp, fmt, ap);
638 /* pad it out to TRACE_PREFIX_WIDTH. FIXME: The TRACE_PREFIX_WIDTH
639 should be determined at build time using known information about
640 the disassembled instructions */
641 #ifndef TRACE_PREFIX_WIDTH
642 #define TRACE_PREFIX_WIDTH 48
644 chp = strchr (prefix, '\0');
645 if (chp - prefix < TRACE_PREFIX_WIDTH)
647 memset (chp, ' ', TRACE_PREFIX_WIDTH - (chp - prefix));
648 chp = &prefix [TRACE_PREFIX_WIDTH];
653 /* check that we've not over flowed the prefix buffer */
654 if (strlen (prefix) >= sizeof (TRACE_PREFIX (data)))
659 trace_generic (SIM_DESC sd,
666 trace_printf (sd, cpu, "%s %s",
667 trace_idx_to_str (trace_idx),
668 TRACE_PREFIX (CPU_TRACE_DATA (cpu)));
670 trace_vprintf (sd, cpu, fmt, ap);
672 trace_printf (sd, cpu, "\n");
676 trace_input0 (SIM_DESC sd,
680 TRACE_DATA *data = CPU_TRACE_DATA (cpu);
681 TRACE_IDX (data) = trace_idx;
685 trace_input_word1 (SIM_DESC sd,
690 TRACE_DATA *data = CPU_TRACE_DATA (cpu);
691 TRACE_IDX (data) = trace_idx;
692 save_data (sd, data, trace_fmt_word, sizeof (unsigned_word), &d0);
696 trace_input_word2 (SIM_DESC sd,
702 TRACE_DATA *data = CPU_TRACE_DATA (cpu);
703 TRACE_IDX (data) = trace_idx;
704 save_data (sd, data, trace_fmt_word, sizeof (unsigned_word), &d0);
705 save_data (sd, data, trace_fmt_word, sizeof (unsigned_word), &d1);
709 trace_input_word3 (SIM_DESC sd,
716 TRACE_DATA *data = CPU_TRACE_DATA (cpu);
717 TRACE_IDX (data) = trace_idx;
718 save_data (sd, data, trace_fmt_word, sizeof (unsigned_word), &d0);
719 save_data (sd, data, trace_fmt_word, sizeof (unsigned_word), &d1);
720 save_data (sd, data, trace_fmt_word, sizeof (unsigned_word), &d2);
724 trace_input_bool1 (SIM_DESC sd,
729 TRACE_DATA *data = CPU_TRACE_DATA (cpu);
730 TRACE_IDX (data) = trace_idx;
731 save_data (sd, data, trace_fmt_bool, sizeof (d0), &d0);
735 trace_input_addr1 (SIM_DESC sd,
740 TRACE_DATA *data = CPU_TRACE_DATA (cpu);
741 TRACE_IDX (data) = trace_idx;
742 save_data (sd, data, trace_fmt_addr, sizeof (d0), &d0);
746 trace_input_fp1 (SIM_DESC sd,
751 TRACE_DATA *data = CPU_TRACE_DATA (cpu);
752 TRACE_IDX (data) = trace_idx;
753 save_data (sd, data, trace_fmt_fp, sizeof (fp_word), &f0);
757 trace_input_fp2 (SIM_DESC sd,
763 TRACE_DATA *data = CPU_TRACE_DATA (cpu);
764 TRACE_IDX (data) = trace_idx;
765 save_data (sd, data, trace_fmt_fp, sizeof (fp_word), &f0);
766 save_data (sd, data, trace_fmt_fp, sizeof (fp_word), &f1);
770 trace_input_fp3 (SIM_DESC sd,
777 TRACE_DATA *data = CPU_TRACE_DATA (cpu);
778 TRACE_IDX (data) = trace_idx;
779 save_data (sd, data, trace_fmt_fp, sizeof (fp_word), &f0);
780 save_data (sd, data, trace_fmt_fp, sizeof (fp_word), &f1);
781 save_data (sd, data, trace_fmt_fp, sizeof (fp_word), &f2);
785 trace_input_fpu1 (SIM_DESC sd,
791 TRACE_DATA *data = CPU_TRACE_DATA (cpu);
792 TRACE_IDX (data) = trace_idx;
794 save_data (sd, data, trace_fmt_fp, sizeof (double), &d);
798 trace_input_fpu2 (SIM_DESC sd,
805 TRACE_DATA *data = CPU_TRACE_DATA (cpu);
806 TRACE_IDX (data) = trace_idx;
808 save_data (sd, data, trace_fmt_fp, sizeof (double), &d);
810 save_data (sd, data, trace_fmt_fp, sizeof (double), &d);
814 trace_input_fpu3 (SIM_DESC sd,
822 TRACE_DATA *data = CPU_TRACE_DATA (cpu);
823 TRACE_IDX (data) = trace_idx;
825 save_data (sd, data, trace_fmt_fp, sizeof (double), &d);
827 save_data (sd, data, trace_fmt_fp, sizeof (double), &d);
829 save_data (sd, data, trace_fmt_fp, sizeof (double), &d);
833 trace_result_word1 (SIM_DESC sd,
838 TRACE_DATA *data = CPU_TRACE_DATA (cpu);
841 /* Append any results to the end of the inputs */
842 last_input = TRACE_INPUT_IDX (data);
843 save_data (sd, data, trace_fmt_word, sizeof (unsigned_word), &r0);
845 trace_results (sd, cpu, trace_idx, last_input);
849 trace_result_bool1 (SIM_DESC sd,
854 TRACE_DATA *data = CPU_TRACE_DATA (cpu);
857 /* Append any results to the end of the inputs */
858 last_input = TRACE_INPUT_IDX (data);
859 save_data (sd, data, trace_fmt_bool, sizeof (r0), &r0);
861 trace_results (sd, cpu, trace_idx, last_input);
865 trace_result_addr1 (SIM_DESC sd,
870 TRACE_DATA *data = CPU_TRACE_DATA (cpu);
873 /* Append any results to the end of the inputs */
874 last_input = TRACE_INPUT_IDX (data);
875 save_data (sd, data, trace_fmt_addr, sizeof (r0), &r0);
877 trace_results (sd, cpu, trace_idx, last_input);
881 trace_result_fp1 (SIM_DESC sd,
886 TRACE_DATA *data = CPU_TRACE_DATA (cpu);
889 /* Append any results to the end of the inputs */
890 last_input = TRACE_INPUT_IDX (data);
891 save_data (sd, data, trace_fmt_fp, sizeof (fp_word), &f0);
893 trace_results (sd, cpu, trace_idx, last_input);
897 trace_result_fpu1 (SIM_DESC sd,
903 TRACE_DATA *data = CPU_TRACE_DATA (cpu);
906 /* Append any results to the end of the inputs */
907 last_input = TRACE_INPUT_IDX (data);
909 save_data (sd, data, trace_fmt_fp, sizeof (double), &d);
911 trace_results (sd, cpu, trace_idx, last_input);
915 trace_result_string1 (SIM_DESC sd,
920 TRACE_DATA *data = CPU_TRACE_DATA (cpu);
923 /* Append any results to the end of the inputs */
924 last_input = TRACE_INPUT_IDX (data);
925 save_data (sd, data, trace_fmt_string, strlen (s0) + 1, s0);
927 trace_results (sd, cpu, trace_idx, last_input);
931 trace_result_word1_string1 (SIM_DESC sd,
937 TRACE_DATA *data = CPU_TRACE_DATA (cpu);
940 /* Append any results to the end of the inputs */
941 last_input = TRACE_INPUT_IDX (data);
942 save_data (sd, data, trace_fmt_word, sizeof (unsigned_word), &r0);
943 save_data (sd, data, trace_fmt_string, strlen (s0) + 1, s0);
945 trace_results (sd, cpu, trace_idx, last_input);
949 trace_vprintf (SIM_DESC sd, sim_cpu *cpu, const char *fmt, va_list ap)
953 if (TRACE_FILE (CPU_TRACE_DATA (cpu)) != NULL)
954 vfprintf (TRACE_FILE (CPU_TRACE_DATA (cpu)), fmt, ap);
956 sim_io_evprintf (sd, fmt, ap);
960 if (TRACE_FILE (STATE_TRACE_DATA (sd)) != NULL)
961 vfprintf (TRACE_FILE (STATE_TRACE_DATA (sd)), fmt, ap);
963 sim_io_evprintf (sd, fmt, ap);
968 trace_one_insn (SIM_DESC sd, sim_cpu *cpu, address_word pc,
969 int line_p, const char *filename, int linenum,
970 const char *phase_wo_colon, const char *fmt,
974 char phase[SIZE_PHASE+2];
976 strncpy (phase, phase_wo_colon, SIZE_PHASE);
981 trace_printf (sd, cpu, "%-*s %s:%-*d 0x%.*lx ",
984 SIZE_LINE_NUMBER, linenum,
987 trace_vprintf (sd, cpu, fmt, ap);
989 trace_printf (sd, cpu, "\n");
996 if (STATE_TEXT_SECTION (CPU_STATE (cpu))
997 && pc >= STATE_TEXT_START (CPU_STATE (cpu))
998 && pc < STATE_TEXT_END (CPU_STATE (cpu)))
1000 const char *pc_filename = (const char *)0;
1001 const char *pc_function = (const char *)0;
1002 unsigned int pc_linenum = 0;
1004 if (bfd_find_nearest_line (STATE_PROG_BFD (CPU_STATE (cpu)),
1005 STATE_TEXT_SECTION (CPU_STATE (cpu)),
1006 (struct symbol_cache_entry **) 0,
1007 pc - STATE_TEXT_START (CPU_STATE (cpu)),
1008 &pc_filename, &pc_function, &pc_linenum))
1013 sprintf (p, "#%-*d ", SIZE_LINE_NUMBER, pc_linenum);
1018 sprintf (p, "%-*s ", SIZE_LINE_NUMBER+1, "---");
1019 p += SIZE_LINE_NUMBER+2;
1024 sprintf (p, "%s ", pc_function);
1027 else if (pc_filename)
1029 char *q = (char *) strrchr (pc_filename, '/');
1030 sprintf (p, "%s ", (q) ? q+1 : pc_filename);
1039 trace_printf (sd, cpu, "%-*s 0x%.*x %-*.*s ",
1040 SIZE_PHASE+1, phase,
1041 SIZE_PC, (unsigned) pc,
1042 SIZE_LOCATION, SIZE_LOCATION, buf);
1044 trace_vprintf (sd, cpu, fmt, ap);
1046 trace_printf (sd, cpu, "\n");
1051 trace_printf VPARAMS ((SIM_DESC sd, sim_cpu *cpu, const char *fmt, ...))
1053 #if !defined __STDC__ && !defined ALMOST_STDC
1061 #if !defined __STDC__ && !defined ALMOST_STDC
1062 sd = va_arg (ap, SIM_DESC);
1063 cpu = va_arg (ap, sim_cpu *);
1064 fmt = va_arg (ap, const char *);
1067 trace_vprintf (sd, cpu, fmt, ap);
1073 debug_printf VPARAMS ((sim_cpu *cpu, const char *fmt, ...))
1075 #if !defined __STDC__ && !defined ALMOST_STDC
1082 #if !defined __STDC__ && !defined ALMOST_STDC
1083 cpu = va_arg (ap, sim_cpu *);
1084 fmt = va_arg (ap, const char *);
1087 if (CPU_DEBUG_FILE (cpu) == NULL)
1088 (* STATE_CALLBACK (CPU_STATE (cpu))->evprintf_filtered)
1089 (STATE_CALLBACK (CPU_STATE (cpu)), fmt, ap);
1091 vfprintf (CPU_DEBUG_FILE (cpu), fmt, ap);