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