Eliminate immediate_quit
[deliverable/binutils-gdb.git] / gdb / exceptions.c
CommitLineData
60250e8b
AC
1/* Exception (throw catch) mechanism, for GDB, the GNU debugger.
2
618f726f 3 Copyright (C) 1986-2016 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"
e06e2353 27#include "serial.h"
347bddb7 28#include "gdbthread.h"
60250e8b 29
c25c4a8b 30void
ff55e1b5 31prepare_to_throw_exception (void)
60250e8b 32{
2a78bfb5
AC
33}
34
6b1b7650 35static void
c6da7a6d 36print_flush (void)
6b1b7650 37{
e06e2353 38 struct serial *gdb_stdout_serial;
481ac8c9 39 struct cleanup *old_chain = make_cleanup (null_cleanup, NULL);
e06e2353 40
c6da7a6d
AC
41 if (deprecated_error_begin_hook)
42 deprecated_error_begin_hook ();
5df43998
GB
43
44 if (target_supports_terminal_ours ())
481ac8c9
PA
45 {
46 make_cleanup_restore_target_terminal ();
47 target_terminal_ours_for_output ();
48 }
e06e2353
AC
49
50 /* We want all output to appear now, before we print the error. We
51 have 3 levels of buffering we have to flush (it's possible that
52 some of these should be changed to flush the lower-level ones
53 too): */
54
55 /* 1. The _filtered buffer. */
5df43998
GB
56 if (filtered_printing_initialized ())
57 wrap_here ("");
e06e2353
AC
58
59 /* 2. The stdio buffer. */
c6da7a6d 60 gdb_flush (gdb_stdout);
e06e2353
AC
61 gdb_flush (gdb_stderr);
62
63 /* 3. The system-level buffer. */
64 gdb_stdout_serial = serial_fdopen (1);
cade9e54
PB
65 if (gdb_stdout_serial)
66 {
67 serial_drain_output (gdb_stdout_serial);
68 serial_un_fdopen (gdb_stdout_serial);
69 }
e06e2353 70
c6da7a6d 71 annotate_error_begin ();
481ac8c9
PA
72
73 do_cleanups (old_chain);
6b1b7650
AC
74}
75
9cbc821d 76static void
71fff37b 77print_exception (struct ui_file *file, struct gdb_exception e)
9cbc821d
AC
78{
79 /* KLUGE: cagney/2005-01-13: Write the string out one line at a time
80 as that way the MI's behavior is preserved. */
81 const char *start;
82 const char *end;
d7f9d729 83
9cbc821d
AC
84 for (start = e.message; start != NULL; start = end)
85 {
86 end = strchr (start, '\n');
87 if (end == NULL)
88 fputs_filtered (start, file);
89 else
90 {
91 end++;
92 ui_file_write (file, start, end - start);
93 }
94 }
c6da7a6d 95 fprintf_filtered (file, "\n");
e48f5bee
AC
96
97 /* Now append the annotation. */
98 switch (e.reason)
99 {
100 case RETURN_QUIT:
101 annotate_quit ();
102 break;
103 case RETURN_ERROR:
104 /* Assume that these are all errors. */
105 annotate_error ();
106 break;
107 default:
108 internal_error (__FILE__, __LINE__, _("Bad switch."));
109 }
9cbc821d
AC
110}
111
8a076db9 112void
71fff37b 113exception_print (struct ui_file *file, struct gdb_exception e)
8a076db9
AC
114{
115 if (e.reason < 0 && e.message != NULL)
116 {
c6da7a6d 117 print_flush ();
9cbc821d 118 print_exception (file, e);
9cbc821d
AC
119 }
120}
8a076db9 121
9cbc821d 122void
71fff37b 123exception_fprintf (struct ui_file *file, struct gdb_exception e,
9cbc821d
AC
124 const char *prefix, ...)
125{
126 if (e.reason < 0 && e.message != NULL)
127 {
128 va_list args;
c6da7a6d
AC
129
130 print_flush ();
9cbc821d
AC
131
132 /* Print the prefix. */
133 va_start (args, prefix);
134 vfprintf_filtered (file, prefix, args);
135 va_end (args);
136
137 print_exception (file, e);
8a076db9
AC
138 }
139}
140
787274f0
DE
141/* Call FUNC(UIOUT, FUNC_ARGS) but wrapped within an exception
142 handler. If an exception (enum return_reason) is thrown using
143 throw_exception() than all cleanups installed since
144 catch_exceptions() was entered are invoked, the (-ve) exception
145 value is then returned by catch_exceptions. If FUNC() returns
146 normally (with a positive or zero return value) then that value is
147 returned by catch_exceptions(). It is an internal_error() for
148 FUNC() to return a negative value.
149
585a46a2 150 See exceptions.h for further usage details. */
60250e8b
AC
151
152/* MAYBE: cagney/1999-11-05: catch_errors() in conjunction with
7a9dd1b2 153 error() et al. could maintain a set of flags that indicate the
60250e8b
AC
154 current state of each of the longjmp buffers. This would give the
155 longjmp code the chance to detect a longjmp botch (before it gets
156 to longjmperror()). Prior to 1999-11-05 this wasn't possible as
157 code also randomly used a SET_TOP_LEVEL macro that directly
0963b4bd 158 initialized the longjmp buffers. */
60250e8b 159
60250e8b
AC
160int
161catch_exceptions (struct ui_out *uiout,
162 catch_exceptions_ftype *func,
163 void *func_args,
60250e8b
AC
164 return_mask mask)
165{
1c3c7ee7 166 return catch_exceptions_with_msg (uiout, func, func_args, NULL, mask);
60250e8b
AC
167}
168
169int
f9679975 170catch_exceptions_with_msg (struct ui_out *func_uiout,
60250e8b
AC
171 catch_exceptions_ftype *func,
172 void *func_args,
60250e8b
AC
173 char **gdberrmsg,
174 return_mask mask)
175{
7556d4a4 176 struct gdb_exception exception = exception_none;
2a78bfb5 177 volatile int val = 0;
f9679975 178 struct ui_out *saved_uiout;
d7f9d729 179
f9679975 180 /* Save and override the global ``struct ui_out'' builder. */
79a45e25
PA
181 saved_uiout = current_uiout;
182 current_uiout = func_uiout;
f9679975 183
492d29ea 184 TRY
6941d02a 185 {
79a45e25 186 val = (*func) (current_uiout, func_args);
6941d02a 187 }
492d29ea 188 CATCH (ex, RETURN_MASK_ALL)
7556d4a4
PA
189 {
190 exception = ex;
191 }
492d29ea 192 END_CATCH
f9679975
PA
193
194 /* Restore the global builder. */
79a45e25 195 current_uiout = saved_uiout;
f9679975
PA
196
197 if (exception.reason < 0 && (mask & RETURN_MASK (exception.reason)) == 0)
198 {
199 /* The caller didn't request that the event be caught.
200 Rethrow. */
201 throw_exception (exception);
202 }
203
feefc97b 204 exception_print (gdb_stderr, exception);
60250e8b 205 gdb_assert (val >= 0);
2a78bfb5
AC
206 gdb_assert (exception.reason <= 0);
207 if (exception.reason < 0)
208 {
209 /* If caller wants a copy of the low-level error message, make
210 one. This is used in the case of a silent error whereby the
211 caller may optionally want to issue the message. */
212 if (gdberrmsg != NULL)
6b1b7650
AC
213 {
214 if (exception.message != NULL)
215 *gdberrmsg = xstrdup (exception.message);
216 else
217 *gdberrmsg = NULL;
218 }
2a78bfb5
AC
219 return exception.reason;
220 }
60250e8b
AC
221 return val;
222}
223
787274f0
DE
224/* This function is superseded by catch_exceptions(). */
225
60250e8b
AC
226int
227catch_errors (catch_errors_ftype *func, void *func_args, char *errstring,
228 return_mask mask)
229{
492d29ea 230 struct gdb_exception exception = exception_none;
2a78bfb5 231 volatile int val = 0;
f9679975 232 struct ui_out *saved_uiout;
d7f9d729 233
f9679975 234 /* Save the global ``struct ui_out'' builder. */
79a45e25 235 saved_uiout = current_uiout;
f9679975 236
492d29ea 237 TRY
6941d02a
AC
238 {
239 val = func (func_args);
240 }
492d29ea
PA
241 CATCH (ex, RETURN_MASK_ALL)
242 {
243 exception = ex;
244 }
245 END_CATCH
f9679975
PA
246
247 /* Restore the global builder. */
79a45e25 248 current_uiout = saved_uiout;
f9679975
PA
249
250 if (exception.reason < 0 && (mask & RETURN_MASK (exception.reason)) == 0)
251 {
252 /* The caller didn't request that the event be caught.
253 Rethrow. */
254 throw_exception (exception);
255 }
256
feefc97b 257 exception_fprintf (gdb_stderr, exception, "%s", errstring);
2a78bfb5 258 if (exception.reason != 0)
60250e8b
AC
259 return 0;
260 return val;
261}
This page took 0.812744 seconds and 4 git commands to generate.