bfd/
[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,
9b254dd1 4 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
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);
60250e8b 224
60250e8b
AC
225 /* Jump to the containing catch_errors() call, communicating REASON
226 to that call via setjmp's return value. Note that REASON can't
227 be zero, by definition in defs.h. */
6941d02a 228 exceptions_state_mc (CATCH_THROWING);
2a78bfb5 229 *current_catcher->exception = exception;
6941d02a 230 EXCEPTIONS_SIGLONGJMP (current_catcher->buf, exception.reason);
2a78bfb5
AC
231}
232
6b1b7650
AC
233static char *last_message;
234
2a78bfb5 235NORETURN void
315a522e 236deprecated_throw_reason (enum return_reason reason)
2a78bfb5 237{
71fff37b 238 struct gdb_exception exception;
2a78bfb5
AC
239 memset (&exception, 0, sizeof exception);
240
241 exception.reason = reason;
242 switch (reason)
243 {
244 case RETURN_QUIT:
245 break;
246 case RETURN_ERROR:
247 exception.error = GENERIC_ERROR;
2a78bfb5
AC
248 break;
249 default:
e2e0b3e5 250 internal_error (__FILE__, __LINE__, _("bad switch"));
2a78bfb5
AC
251 }
252
253 throw_exception (exception);
60250e8b
AC
254}
255
6b1b7650 256static void
c6da7a6d 257print_flush (void)
6b1b7650 258{
e06e2353
AC
259 struct serial *gdb_stdout_serial;
260
c6da7a6d
AC
261 if (deprecated_error_begin_hook)
262 deprecated_error_begin_hook ();
263 target_terminal_ours ();
e06e2353
AC
264
265 /* We want all output to appear now, before we print the error. We
266 have 3 levels of buffering we have to flush (it's possible that
267 some of these should be changed to flush the lower-level ones
268 too): */
269
270 /* 1. The _filtered buffer. */
271 wrap_here ("");
272
273 /* 2. The stdio buffer. */
c6da7a6d 274 gdb_flush (gdb_stdout);
e06e2353
AC
275 gdb_flush (gdb_stderr);
276
277 /* 3. The system-level buffer. */
278 gdb_stdout_serial = serial_fdopen (1);
cade9e54
PB
279 if (gdb_stdout_serial)
280 {
281 serial_drain_output (gdb_stdout_serial);
282 serial_un_fdopen (gdb_stdout_serial);
283 }
e06e2353 284
c6da7a6d 285 annotate_error_begin ();
6b1b7650
AC
286}
287
9cbc821d 288static void
71fff37b 289print_exception (struct ui_file *file, struct gdb_exception e)
9cbc821d
AC
290{
291 /* KLUGE: cagney/2005-01-13: Write the string out one line at a time
292 as that way the MI's behavior is preserved. */
293 const char *start;
294 const char *end;
295 for (start = e.message; start != NULL; start = end)
296 {
297 end = strchr (start, '\n');
298 if (end == NULL)
299 fputs_filtered (start, file);
300 else
301 {
302 end++;
303 ui_file_write (file, start, end - start);
304 }
305 }
c6da7a6d 306 fprintf_filtered (file, "\n");
e48f5bee
AC
307
308 /* Now append the annotation. */
309 switch (e.reason)
310 {
311 case RETURN_QUIT:
312 annotate_quit ();
313 break;
314 case RETURN_ERROR:
315 /* Assume that these are all errors. */
316 annotate_error ();
317 break;
318 default:
319 internal_error (__FILE__, __LINE__, _("Bad switch."));
320 }
9cbc821d
AC
321}
322
8a076db9 323void
71fff37b 324exception_print (struct ui_file *file, struct gdb_exception e)
8a076db9
AC
325{
326 if (e.reason < 0 && e.message != NULL)
327 {
c6da7a6d 328 print_flush ();
9cbc821d 329 print_exception (file, e);
9cbc821d
AC
330 }
331}
8a076db9 332
9cbc821d 333void
71fff37b 334exception_fprintf (struct ui_file *file, struct gdb_exception e,
9cbc821d
AC
335 const char *prefix, ...)
336{
337 if (e.reason < 0 && e.message != NULL)
338 {
339 va_list args;
c6da7a6d
AC
340
341 print_flush ();
9cbc821d
AC
342
343 /* Print the prefix. */
344 va_start (args, prefix);
345 vfprintf_filtered (file, prefix, args);
346 va_end (args);
347
348 print_exception (file, e);
8a076db9
AC
349 }
350}
351
e48f5bee
AC
352void
353print_any_exception (struct ui_file *file, const char *prefix,
71fff37b 354 struct gdb_exception e)
e48f5bee
AC
355{
356 if (e.reason < 0 && e.message != NULL)
357 {
358 target_terminal_ours ();
359 wrap_here (""); /* Force out any buffered output */
360 gdb_flush (gdb_stdout);
361 annotate_error_begin ();
362
363 /* Print the prefix. */
364 if (prefix != NULL && prefix[0] != '\0')
365 fputs_filtered (prefix, file);
366 print_exception (file, e);
367 }
368}
369
bee0189a 370NORETURN static void ATTR_NORETURN ATTR_FORMAT (printf, 3, 0)
3af1e0e3
AC
371throw_it (enum return_reason reason, enum errors error, const char *fmt,
372 va_list ap)
6b1b7650 373{
71fff37b 374 struct gdb_exception e;
17d92a02 375 char *new_message;
6b1b7650 376
17d92a02
AC
377 /* Save the message. Create the new message before deleting the
378 old, the new message may include the old message text. */
379 new_message = xstrvprintf (fmt, ap);
6b1b7650 380 xfree (last_message);
17d92a02 381 last_message = new_message;
c6da7a6d
AC
382
383 /* Create the exception. */
384 e.reason = reason;
385 e.error = error;
386 e.message = last_message;
6b1b7650 387
6b1b7650 388 /* Throw the exception. */
6b1b7650
AC
389 throw_exception (e);
390}
391
392NORETURN void
393throw_verror (enum errors error, const char *fmt, va_list ap)
394{
3af1e0e3 395 throw_it (RETURN_ERROR, error, fmt, ap);
6b1b7650
AC
396}
397
398NORETURN void
399throw_vfatal (const char *fmt, va_list ap)
400{
7b871fab 401 throw_it (RETURN_QUIT, GDB_NO_ERROR, fmt, ap);
6b1b7650
AC
402}
403
404NORETURN void
05ff989b 405throw_error (enum errors error, const char *fmt, ...)
6b1b7650 406{
05ff989b
AC
407 va_list args;
408 va_start (args, fmt);
3af1e0e3 409 throw_it (RETURN_ERROR, error, fmt, args);
05ff989b 410 va_end (args);
6b1b7650
AC
411}
412
60250e8b
AC
413/* Call FUNC() with args FUNC_UIOUT and FUNC_ARGS, catching any
414 errors. Set FUNC_CAUGHT to an ``enum return_reason'' if the
415 function is aborted (using throw_exception() or zero if the
416 function returns normally. Set FUNC_VAL to the value returned by
417 the function or 0 if the function was aborted.
418
419 Must not be called with immediate_quit in effect (bad things might
420 happen, say we got a signal in the middle of a memcpy to quit_return).
421 This is an OK restriction; with very few exceptions immediate_quit can
422 be replaced by judicious use of QUIT.
423
424 MASK specifies what to catch; it is normally set to
425 RETURN_MASK_ALL, if for no other reason than that the code which
426 calls catch_errors might not be set up to deal with a quit which
427 isn't caught. But if the code can deal with it, it generally
428 should be RETURN_MASK_ERROR, unless for some reason it is more
429 useful to abort only the portion of the operation inside the
430 catch_errors. Note that quit should return to the command line
431 fairly quickly, even if some further processing is being done. */
432
433/* MAYBE: cagney/1999-11-05: catch_errors() in conjunction with
434 error() et.al. could maintain a set of flags that indicate the the
435 current state of each of the longjmp buffers. This would give the
436 longjmp code the chance to detect a longjmp botch (before it gets
437 to longjmperror()). Prior to 1999-11-05 this wasn't possible as
438 code also randomly used a SET_TOP_LEVEL macro that directly
439 initialize the longjmp buffers. */
440
441/* MAYBE: cagney/1999-11-05: Should the catch_errors and cleanups code
442 be consolidated into a single file instead of being distributed
443 between utils.c and top.c? */
444
60250e8b
AC
445int
446catch_exceptions (struct ui_out *uiout,
447 catch_exceptions_ftype *func,
448 void *func_args,
60250e8b
AC
449 return_mask mask)
450{
1c3c7ee7 451 return catch_exceptions_with_msg (uiout, func, func_args, NULL, mask);
60250e8b
AC
452}
453
71fff37b 454struct gdb_exception
2a78bfb5
AC
455catch_exception (struct ui_out *uiout,
456 catch_exception_ftype *func,
457 void *func_args,
458 return_mask mask)
459{
71fff37b 460 volatile struct gdb_exception exception;
6941d02a
AC
461 TRY_CATCH (exception, mask)
462 {
463 (*func) (uiout, func_args);
464 }
2a78bfb5
AC
465 return exception;
466}
467
60250e8b
AC
468int
469catch_exceptions_with_msg (struct ui_out *uiout,
470 catch_exceptions_ftype *func,
471 void *func_args,
60250e8b
AC
472 char **gdberrmsg,
473 return_mask mask)
474{
71fff37b 475 volatile struct gdb_exception exception;
2a78bfb5 476 volatile int val = 0;
6941d02a
AC
477 TRY_CATCH (exception, mask)
478 {
479 val = (*func) (uiout, func_args);
480 }
e48f5bee 481 print_any_exception (gdb_stderr, NULL, exception);
60250e8b 482 gdb_assert (val >= 0);
2a78bfb5
AC
483 gdb_assert (exception.reason <= 0);
484 if (exception.reason < 0)
485 {
486 /* If caller wants a copy of the low-level error message, make
487 one. This is used in the case of a silent error whereby the
488 caller may optionally want to issue the message. */
489 if (gdberrmsg != NULL)
6b1b7650
AC
490 {
491 if (exception.message != NULL)
492 *gdberrmsg = xstrdup (exception.message);
493 else
494 *gdberrmsg = NULL;
495 }
2a78bfb5
AC
496 return exception.reason;
497 }
60250e8b
AC
498 return val;
499}
500
60250e8b
AC
501int
502catch_errors (catch_errors_ftype *func, void *func_args, char *errstring,
503 return_mask mask)
504{
2a78bfb5 505 volatile int val = 0;
71fff37b 506 volatile struct gdb_exception exception;
6941d02a
AC
507 TRY_CATCH (exception, mask)
508 {
509 val = func (func_args);
510 }
e48f5bee 511 print_any_exception (gdb_stderr, errstring, exception);
2a78bfb5 512 if (exception.reason != 0)
60250e8b
AC
513 return 0;
514 return val;
515}
516
60250e8b
AC
517int
518catch_command_errors (catch_command_errors_ftype * command,
519 char *arg, int from_tty, return_mask mask)
520{
71fff37b 521 volatile struct gdb_exception e;
6941d02a
AC
522 TRY_CATCH (e, mask)
523 {
524 command (arg, from_tty);
525 }
5a14cc1a
AC
526 print_any_exception (gdb_stderr, NULL, e);
527 if (e.reason < 0)
528 return 0;
529 return 1;
60250e8b 530}
This page took 0.254909 seconds and 4 git commands to generate.