sim: v850: fix build failure after watchpoint constification
[binutils-gdb.git] / sim / rx / main.c
1 /* main.c --- main function for stand-alone RX simulator.
2
3 Copyright (C) 2005, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
4 Contributed by Red Hat, Inc.
5
6 This file is part of the GNU simulators.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
20
21
22 #include "config.h"
23 #include <stdio.h>
24 #include <string.h>
25 #ifdef HAVE_STDLIB_H
26 #include <stdlib.h>
27 #endif
28 #ifdef HAVE_UNISTD_H
29 #include <unistd.h>
30 #endif
31 #include <assert.h>
32 #include <setjmp.h>
33 #include <signal.h>
34 #ifdef HAVE_GETOPT_H
35 #include <getopt.h>
36 #endif
37
38 #include "bfd.h"
39
40 #include "cpu.h"
41 #include "mem.h"
42 #include "misc.h"
43 #include "load.h"
44 #include "trace.h"
45 #include "err.h"
46
47 static int disassemble = 0;
48
49 /* This must be higher than any other option index. */
50 #define OPT_ACT 400
51
52 #define ACT(E,A) (OPT_ACT + SIM_ERR_##E * SIM_ERRACTION_NUM_ACTIONS + SIM_ERRACTION_##A)
53
54 static struct option sim_options[] =
55 {
56 { "end-sim-args", 0, NULL, 'E' },
57 { "exit-null-deref", 0, NULL, ACT(NULL_POINTER_DEREFERENCE,EXIT) },
58 { "warn-null-deref", 0, NULL, ACT(NULL_POINTER_DEREFERENCE,WARN) },
59 { "ignore-null-deref", 0, NULL, ACT(NULL_POINTER_DEREFERENCE,IGNORE) },
60 { "exit-unwritten-pages", 0, NULL, ACT(READ_UNWRITTEN_PAGES,EXIT) },
61 { "warn-unwritten-pages", 0, NULL, ACT(READ_UNWRITTEN_PAGES,WARN) },
62 { "ignore-unwritten-pages", 0, NULL, ACT(READ_UNWRITTEN_PAGES,IGNORE) },
63 { "exit-unwritten-bytes", 0, NULL, ACT(READ_UNWRITTEN_BYTES,EXIT) },
64 { "warn-unwritten-bytes", 0, NULL, ACT(READ_UNWRITTEN_BYTES,WARN) },
65 { "ignore-unwritten-bytes", 0, NULL, ACT(READ_UNWRITTEN_BYTES,IGNORE) },
66 { "exit-corrupt-stack", 0, NULL, ACT(CORRUPT_STACK,EXIT) },
67 { "warn-corrupt-stack", 0, NULL, ACT(CORRUPT_STACK,WARN) },
68 { "ignore-corrupt-stack", 0, NULL, ACT(CORRUPT_STACK,IGNORE) },
69 { 0, 0, 0, 0 }
70 };
71
72 static void
73 done (int exit_code)
74 {
75 if (verbose)
76 {
77 stack_heap_stats ();
78 mem_usage_stats ();
79 /* Only use comma separated numbers when being very verbose.
80 Comma separated numbers are hard to parse in awk scripts. */
81 if (verbose > 1)
82 printf ("insns: %14s\n", comma (rx_cycles));
83 else
84 printf ("insns: %u\n", rx_cycles);
85 }
86 exit (exit_code);
87 }
88
89 int
90 main (int argc, char **argv)
91 {
92 int o;
93 int save_trace;
94 bfd *prog;
95
96 /* By default, we exit when an execution error occurs. */
97 execution_error_init_standalone ();
98
99 while ((o = getopt_long (argc, argv, "tvdeEwi", sim_options, NULL)) != -1)
100 {
101 if (o == 'E')
102 /* Stop processing the command line. This is so that any remaining
103 words on the command line that look like arguments will be passed
104 on to the program being simulated. */
105 break;
106
107 if (o >= OPT_ACT)
108 {
109 int e, a;
110
111 o -= OPT_ACT;
112 e = o / SIM_ERRACTION_NUM_ACTIONS;
113 a = o % SIM_ERRACTION_NUM_ACTIONS;
114 execution_error_set_action (e, a);
115 }
116 else switch (o)
117 {
118 case 't':
119 trace++;
120 break;
121 case 'v':
122 verbose++;
123 break;
124 case 'd':
125 disassemble++;
126 break;
127 case 'e':
128 execution_error_init_standalone ();
129 break;
130 case 'w':
131 execution_error_warn_all ();
132 break;
133 case 'i':
134 execution_error_ignore_all ();
135 break;
136 case '?':
137 {
138 int i;
139 fprintf (stderr,
140 "usage: run [options] program [arguments]\n");
141 fprintf (stderr,
142 "\t-v\t- increase verbosity.\n"
143 "\t-t\t- trace.\n"
144 "\t-d\t- disassemble.\n"
145 "\t-E\t- stop processing sim args\n"
146 "\t-e\t- exit on all execution errors.\n"
147 "\t-w\t- warn (do not exit) on all execution errors.\n"
148 "\t-i\t- ignore all execution errors.\n");
149 for (i=0; sim_options[i].name; i++)
150 fprintf (stderr, "\t--%s\n", sim_options[i].name);
151 exit (1);
152 }
153 }
154 }
155
156 prog = bfd_openr (argv[optind], 0);
157 if (!prog)
158 {
159 fprintf (stderr, "Can't read %s\n", argv[optind]);
160 exit (1);
161 }
162
163 if (!bfd_check_format (prog, bfd_object))
164 {
165 fprintf (stderr, "%s not a rx program\n", argv[optind]);
166 exit (1);
167 }
168
169 init_regs ();
170
171 rx_in_gdb = 0;
172 save_trace = trace;
173 trace = 0;
174 rx_load (prog);
175 trace = save_trace;
176
177 sim_disasm_init (prog);
178
179 while (1)
180 {
181 int rc;
182
183 if (trace)
184 printf ("\n");
185
186 if (disassemble)
187 sim_disasm_one ();
188
189 enable_counting = verbose;
190 rc = decode_opcode ();
191 enable_counting = 0;
192
193 if (RX_HIT_BREAK (rc))
194 done (1);
195 else if (RX_EXITED (rc))
196 done (RX_EXIT_STATUS (rc));
197 else if (RX_STOPPED (rc))
198 {
199 if (verbose)
200 printf("Stopped on signal %d\n", RX_STOP_SIG (rc));
201 exit(1);
202 }
203 else
204 assert (RX_STEPPED (rc));
205
206 trace_register_changes ();
207 }
208 }