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