* features/rs6000/powerpc-32.c, features/rs6000/powerpc-403.c,
[deliverable/binutils-gdb.git] / gdb / exceptions.c
CommitLineData
60250e8b
AC
1/* Exception (throw catch) mechanism, for GDB, the GNU debugger.
2
6aba47ca
DJ
3 Copyright (C) 1986, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
4 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
7b871fab 5 Free Software Foundation, Inc.
60250e8b
AC
6
7 This file is part of GDB.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
60250e8b
AC
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
60250e8b
AC
21
22#include "defs.h"
23#include "exceptions.h"
60250e8b
AC
24#include "breakpoint.h"
25#include "target.h"
26#include "inferior.h"
27#include "annotate.h"
28#include "ui-out.h"
29#include "gdb_assert.h"
db5f402d 30#include "gdb_string.h"
e06e2353 31#include "serial.h"
60250e8b 32
7b871fab 33const struct gdb_exception exception_none = { 0, GDB_NO_ERROR, NULL };
c1043fc2 34
db5f402d
AC
35/* Possible catcher states. */
36enum catcher_state {
37 /* Initial state, a new catcher has just been created. */
38 CATCHER_CREATED,
39 /* The catch code is running. */
40 CATCHER_RUNNING,
41 CATCHER_RUNNING_1,
42 /* The catch code threw an exception. */
43 CATCHER_ABORTING
44};
45
46/* Possible catcher actions. */
47enum catcher_action {
48 CATCH_ITER,
49 CATCH_ITER_1,
50 CATCH_THROWING
51};
52
53struct catcher
54{
55 enum catcher_state state;
2a78bfb5 56 /* Jump buffer pointing back at the exception handler. */
6941d02a 57 EXCEPTIONS_SIGJMP_BUF buf;
8a076db9 58 /* Status buffer belonging to the exception handler. */
71fff37b 59 volatile struct gdb_exception *exception;
db5f402d
AC
60 /* Saved/current state. */
61 int mask;
db5f402d
AC
62 struct ui_out *saved_uiout;
63 struct cleanup *saved_cleanup_chain;
db5f402d
AC
64 /* Back link. */
65 struct catcher *prev;
66};
67
60250e8b 68/* Where to go for throw_exception(). */
db5f402d
AC
69static struct catcher *current_catcher;
70
6941d02a
AC
71EXCEPTIONS_SIGJMP_BUF *
72exceptions_state_mc_init (struct ui_out *func_uiout,
71fff37b 73 volatile struct gdb_exception *exception,
6941d02a 74 return_mask mask)
db5f402d
AC
75{
76 struct catcher *new_catcher = XZALLOC (struct catcher);
77
2a78bfb5
AC
78 /* Start with no exception, save it's address. */
79 exception->reason = 0;
7b871fab 80 exception->error = GDB_NO_ERROR;
2a78bfb5
AC
81 exception->message = NULL;
82 new_catcher->exception = exception;
83
db5f402d
AC
84 new_catcher->mask = mask;
85
db5f402d
AC
86 /* Override the global ``struct ui_out'' builder. */
87 new_catcher->saved_uiout = uiout;
88 uiout = func_uiout;
89
90 /* Prevent error/quit during FUNC from calling cleanups established
91 prior to here. */
92 new_catcher->saved_cleanup_chain = save_cleanups ();
93
94 /* Push this new catcher on the top. */
95 new_catcher->prev = current_catcher;
96 current_catcher = new_catcher;
97 new_catcher->state = CATCHER_CREATED;
98
99 return &new_catcher->buf;
100}
101
102static void
103catcher_pop (void)
104{
105 struct catcher *old_catcher = current_catcher;
106 current_catcher = old_catcher->prev;
107
108 /* Restore the cleanup chain, the error/quit messages, and the uiout
109 builder, to their original states. */
110
111 restore_cleanups (old_catcher->saved_cleanup_chain);
112
113 uiout = old_catcher->saved_uiout;
114
db5f402d
AC
115 xfree (old_catcher);
116}
117
118/* Catcher state machine. Returns non-zero if the m/c should be run
119 again, zero if it should abort. */
120
6941d02a
AC
121static int
122exceptions_state_mc (enum catcher_action action)
db5f402d
AC
123{
124 switch (current_catcher->state)
125 {
126 case CATCHER_CREATED:
127 switch (action)
128 {
129 case CATCH_ITER:
130 /* Allow the code to run the catcher. */
131 current_catcher->state = CATCHER_RUNNING;
132 return 1;
133 default:
e2e0b3e5 134 internal_error (__FILE__, __LINE__, _("bad state"));
db5f402d
AC
135 }
136 case CATCHER_RUNNING:
137 switch (action)
138 {
139 case CATCH_ITER:
140 /* No error/quit has occured. Just clean up. */
141 catcher_pop ();
142 return 0;
143 case CATCH_ITER_1:
144 current_catcher->state = CATCHER_RUNNING_1;
145 return 1;
146 case CATCH_THROWING:
147 current_catcher->state = CATCHER_ABORTING;
148 /* See also throw_exception. */
149 return 1;
150 default:
e2e0b3e5 151 internal_error (__FILE__, __LINE__, _("bad switch"));
db5f402d
AC
152 }
153 case CATCHER_RUNNING_1:
154 switch (action)
155 {
156 case CATCH_ITER:
157 /* The did a "break" from the inner while loop. */
158 catcher_pop ();
159 return 0;
160 case CATCH_ITER_1:
161 current_catcher->state = CATCHER_RUNNING;
162 return 0;
163 case CATCH_THROWING:
164 current_catcher->state = CATCHER_ABORTING;
165 /* See also throw_exception. */
166 return 1;
167 default:
e2e0b3e5 168 internal_error (__FILE__, __LINE__, _("bad switch"));
db5f402d
AC
169 }
170 case CATCHER_ABORTING:
171 switch (action)
172 {
173 case CATCH_ITER:
174 {
71fff37b 175 struct gdb_exception exception = *current_catcher->exception;
2a78bfb5 176 if (current_catcher->mask & RETURN_MASK (exception.reason))
db5f402d
AC
177 {
178 /* Exit normally if this catcher can handle this
179 exception. The caller analyses the func return
180 values. */
181 catcher_pop ();
182 return 0;
183 }
184 /* The caller didn't request that the event be caught,
185 relay the event to the next containing
186 catch_errors(). */
187 catcher_pop ();
2a78bfb5 188 throw_exception (exception);
db5f402d
AC
189 }
190 default:
e2e0b3e5 191 internal_error (__FILE__, __LINE__, _("bad state"));
db5f402d
AC
192 }
193 default:
e2e0b3e5 194 internal_error (__FILE__, __LINE__, _("bad switch"));
db5f402d
AC
195 }
196}
60250e8b 197
6941d02a
AC
198int
199exceptions_state_mc_action_iter (void)
200{
201 return exceptions_state_mc (CATCH_ITER);
202}
203
204int
205exceptions_state_mc_action_iter_1 (void)
206{
207 return exceptions_state_mc (CATCH_ITER_1);
208}
209
2a78bfb5 210/* Return EXCEPTION to the nearest containing catch_errors(). */
60250e8b
AC
211
212NORETURN void
71fff37b 213throw_exception (struct gdb_exception exception)
60250e8b
AC
214{
215 quit_flag = 0;
216 immediate_quit = 0;
217
218 /* Perhaps it would be cleaner to do this via the cleanup chain (not sure
219 I can think of a reason why that is vital, though). */
220 bpstat_clear_actions (stop_bpstat); /* Clear queued breakpoint commands */
221
222 disable_current_display ();
223 do_cleanups (ALL_CLEANUPS);
224 if (target_can_async_p () && !target_executing)
225 do_exec_cleanups (ALL_CLEANUPS);
226 if (sync_execution)
227 do_exec_error_cleanups (ALL_CLEANUPS);
228
60250e8b
AC
229 /* Jump to the containing catch_errors() call, communicating REASON
230 to that call via setjmp's return value. Note that REASON can't
231 be zero, by definition in defs.h. */
6941d02a 232 exceptions_state_mc (CATCH_THROWING);
2a78bfb5 233 *current_catcher->exception = exception;
6941d02a 234 EXCEPTIONS_SIGLONGJMP (current_catcher->buf, exception.reason);
2a78bfb5
AC
235}
236
6b1b7650
AC
237static char *last_message;
238
2a78bfb5 239NORETURN void
315a522e 240deprecated_throw_reason (enum return_reason reason)
2a78bfb5 241{
71fff37b 242 struct gdb_exception exception;
2a78bfb5
AC
243 memset (&exception, 0, sizeof exception);
244
245 exception.reason = reason;
246 switch (reason)
247 {
248 case RETURN_QUIT:
249 break;
250 case RETURN_ERROR:
251 exception.error = GENERIC_ERROR;
2a78bfb5
AC
252 break;
253 default:
e2e0b3e5 254 internal_error (__FILE__, __LINE__, _("bad switch"));
2a78bfb5
AC
255 }
256
257 throw_exception (exception);
60250e8b
AC
258}
259
6b1b7650 260static void
c6da7a6d 261print_flush (void)
6b1b7650 262{
e06e2353
AC
263 struct serial *gdb_stdout_serial;
264
c6da7a6d
AC
265 if (deprecated_error_begin_hook)
266 deprecated_error_begin_hook ();
267 target_terminal_ours ();
e06e2353
AC
268
269 /* We want all output to appear now, before we print the error. We
270 have 3 levels of buffering we have to flush (it's possible that
271 some of these should be changed to flush the lower-level ones
272 too): */
273
274 /* 1. The _filtered buffer. */
275 wrap_here ("");
276
277 /* 2. The stdio buffer. */
c6da7a6d 278 gdb_flush (gdb_stdout);
e06e2353
AC
279 gdb_flush (gdb_stderr);
280
281 /* 3. The system-level buffer. */
282 gdb_stdout_serial = serial_fdopen (1);
cade9e54
PB
283 if (gdb_stdout_serial)
284 {
285 serial_drain_output (gdb_stdout_serial);
286 serial_un_fdopen (gdb_stdout_serial);
287 }
e06e2353 288
c6da7a6d 289 annotate_error_begin ();
6b1b7650
AC
290}
291
9cbc821d 292static void
71fff37b 293print_exception (struct ui_file *file, struct gdb_exception e)
9cbc821d
AC
294{
295 /* KLUGE: cagney/2005-01-13: Write the string out one line at a time
296 as that way the MI's behavior is preserved. */
297 const char *start;
298 const char *end;
299 for (start = e.message; start != NULL; start = end)
300 {
301 end = strchr (start, '\n');
302 if (end == NULL)
303 fputs_filtered (start, file);
304 else
305 {
306 end++;
307 ui_file_write (file, start, end - start);
308 }
309 }
c6da7a6d 310 fprintf_filtered (file, "\n");
e48f5bee
AC
311
312 /* Now append the annotation. */
313 switch (e.reason)
314 {
315 case RETURN_QUIT:
316 annotate_quit ();
317 break;
318 case RETURN_ERROR:
319 /* Assume that these are all errors. */
320 annotate_error ();
321 break;
322 default:
323 internal_error (__FILE__, __LINE__, _("Bad switch."));
324 }
9cbc821d
AC
325}
326
8a076db9 327void
71fff37b 328exception_print (struct ui_file *file, struct gdb_exception e)
8a076db9
AC
329{
330 if (e.reason < 0 && e.message != NULL)
331 {
c6da7a6d 332 print_flush ();
9cbc821d 333 print_exception (file, e);
9cbc821d
AC
334 }
335}
8a076db9 336
9cbc821d 337void
71fff37b 338exception_fprintf (struct ui_file *file, struct gdb_exception e,
9cbc821d
AC
339 const char *prefix, ...)
340{
341 if (e.reason < 0 && e.message != NULL)
342 {
343 va_list args;
c6da7a6d
AC
344
345 print_flush ();
9cbc821d
AC
346
347 /* Print the prefix. */
348 va_start (args, prefix);
349 vfprintf_filtered (file, prefix, args);
350 va_end (args);
351
352 print_exception (file, e);
8a076db9
AC
353 }
354}
355
e48f5bee
AC
356void
357print_any_exception (struct ui_file *file, const char *prefix,
71fff37b 358 struct gdb_exception e)
e48f5bee
AC
359{
360 if (e.reason < 0 && e.message != NULL)
361 {
362 target_terminal_ours ();
363 wrap_here (""); /* Force out any buffered output */
364 gdb_flush (gdb_stdout);
365 annotate_error_begin ();
366
367 /* Print the prefix. */
368 if (prefix != NULL && prefix[0] != '\0')
369 fputs_filtered (prefix, file);
370 print_exception (file, e);
371 }
372}
373
bee0189a 374NORETURN static void ATTR_NORETURN ATTR_FORMAT (printf, 3, 0)
3af1e0e3
AC
375throw_it (enum return_reason reason, enum errors error, const char *fmt,
376 va_list ap)
6b1b7650 377{
71fff37b 378 struct gdb_exception e;
17d92a02 379 char *new_message;
6b1b7650 380
17d92a02
AC
381 /* Save the message. Create the new message before deleting the
382 old, the new message may include the old message text. */
383 new_message = xstrvprintf (fmt, ap);
6b1b7650 384 xfree (last_message);
17d92a02 385 last_message = new_message;
c6da7a6d
AC
386
387 /* Create the exception. */
388 e.reason = reason;
389 e.error = error;
390 e.message = last_message;
6b1b7650 391
6b1b7650 392 /* Throw the exception. */
6b1b7650
AC
393 throw_exception (e);
394}
395
396NORETURN void
397throw_verror (enum errors error, const char *fmt, va_list ap)
398{
3af1e0e3 399 throw_it (RETURN_ERROR, error, fmt, ap);
6b1b7650
AC
400}
401
402NORETURN void
403throw_vfatal (const char *fmt, va_list ap)
404{
7b871fab 405 throw_it (RETURN_QUIT, GDB_NO_ERROR, fmt, ap);
6b1b7650
AC
406}
407
408NORETURN void
05ff989b 409throw_error (enum errors error, const char *fmt, ...)
6b1b7650 410{
05ff989b
AC
411 va_list args;
412 va_start (args, fmt);
3af1e0e3 413 throw_it (RETURN_ERROR, error, fmt, args);
05ff989b 414 va_end (args);
6b1b7650
AC
415}
416
60250e8b
AC
417/* Call FUNC() with args FUNC_UIOUT and FUNC_ARGS, catching any
418 errors. Set FUNC_CAUGHT to an ``enum return_reason'' if the
419 function is aborted (using throw_exception() or zero if the
420 function returns normally. Set FUNC_VAL to the value returned by
421 the function or 0 if the function was aborted.
422
423 Must not be called with immediate_quit in effect (bad things might
424 happen, say we got a signal in the middle of a memcpy to quit_return).
425 This is an OK restriction; with very few exceptions immediate_quit can
426 be replaced by judicious use of QUIT.
427
428 MASK specifies what to catch; it is normally set to
429 RETURN_MASK_ALL, if for no other reason than that the code which
430 calls catch_errors might not be set up to deal with a quit which
431 isn't caught. But if the code can deal with it, it generally
432 should be RETURN_MASK_ERROR, unless for some reason it is more
433 useful to abort only the portion of the operation inside the
434 catch_errors. Note that quit should return to the command line
435 fairly quickly, even if some further processing is being done. */
436
437/* MAYBE: cagney/1999-11-05: catch_errors() in conjunction with
438 error() et.al. could maintain a set of flags that indicate the the
439 current state of each of the longjmp buffers. This would give the
440 longjmp code the chance to detect a longjmp botch (before it gets
441 to longjmperror()). Prior to 1999-11-05 this wasn't possible as
442 code also randomly used a SET_TOP_LEVEL macro that directly
443 initialize the longjmp buffers. */
444
445/* MAYBE: cagney/1999-11-05: Should the catch_errors and cleanups code
446 be consolidated into a single file instead of being distributed
447 between utils.c and top.c? */
448
60250e8b
AC
449int
450catch_exceptions (struct ui_out *uiout,
451 catch_exceptions_ftype *func,
452 void *func_args,
60250e8b
AC
453 return_mask mask)
454{
1c3c7ee7 455 return catch_exceptions_with_msg (uiout, func, func_args, NULL, mask);
60250e8b
AC
456}
457
71fff37b 458struct gdb_exception
2a78bfb5
AC
459catch_exception (struct ui_out *uiout,
460 catch_exception_ftype *func,
461 void *func_args,
462 return_mask mask)
463{
71fff37b 464 volatile struct gdb_exception exception;
6941d02a
AC
465 TRY_CATCH (exception, mask)
466 {
467 (*func) (uiout, func_args);
468 }
2a78bfb5
AC
469 return exception;
470}
471
60250e8b
AC
472int
473catch_exceptions_with_msg (struct ui_out *uiout,
474 catch_exceptions_ftype *func,
475 void *func_args,
60250e8b
AC
476 char **gdberrmsg,
477 return_mask mask)
478{
71fff37b 479 volatile struct gdb_exception exception;
2a78bfb5 480 volatile int val = 0;
6941d02a
AC
481 TRY_CATCH (exception, mask)
482 {
483 val = (*func) (uiout, func_args);
484 }
e48f5bee 485 print_any_exception (gdb_stderr, NULL, exception);
60250e8b 486 gdb_assert (val >= 0);
2a78bfb5
AC
487 gdb_assert (exception.reason <= 0);
488 if (exception.reason < 0)
489 {
490 /* If caller wants a copy of the low-level error message, make
491 one. This is used in the case of a silent error whereby the
492 caller may optionally want to issue the message. */
493 if (gdberrmsg != NULL)
6b1b7650
AC
494 {
495 if (exception.message != NULL)
496 *gdberrmsg = xstrdup (exception.message);
497 else
498 *gdberrmsg = NULL;
499 }
2a78bfb5
AC
500 return exception.reason;
501 }
60250e8b
AC
502 return val;
503}
504
60250e8b
AC
505int
506catch_errors (catch_errors_ftype *func, void *func_args, char *errstring,
507 return_mask mask)
508{
2a78bfb5 509 volatile int val = 0;
71fff37b 510 volatile struct gdb_exception exception;
6941d02a
AC
511 TRY_CATCH (exception, mask)
512 {
513 val = func (func_args);
514 }
e48f5bee 515 print_any_exception (gdb_stderr, errstring, exception);
2a78bfb5 516 if (exception.reason != 0)
60250e8b
AC
517 return 0;
518 return val;
519}
520
60250e8b
AC
521int
522catch_command_errors (catch_command_errors_ftype * command,
523 char *arg, int from_tty, return_mask mask)
524{
71fff37b 525 volatile struct gdb_exception e;
6941d02a
AC
526 TRY_CATCH (e, mask)
527 {
528 command (arg, from_tty);
529 }
5a14cc1a
AC
530 print_any_exception (gdb_stderr, NULL, e);
531 if (e.reason < 0)
532 return 0;
533 return 1;
60250e8b 534}
This page took 0.22196 seconds and 4 git commands to generate.