]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/exceptions.c
Automatic date update in version.in
[thirdparty/binutils-gdb.git] / gdb / exceptions.c
CommitLineData
60250e8b
AC
1/* Exception (throw catch) mechanism, for GDB, the GNU debugger.
2
b811d2c2 3 Copyright (C) 1986-2020 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"
d55e5aa6 21#include "exceptions.h"
4de283e4
TT
22#include "breakpoint.h"
23#include "target.h"
60250e8b 24#include "inferior.h"
4de283e4
TT
25#include "annotate.h"
26#include "ui-out.h"
e06e2353 27#include "serial.h"
4de283e4 28#include "gdbthread.h"
694ec099 29#include "top.h"
268a13a5 30#include "gdbsupport/gdb_optional.h"
60250e8b 31
6b1b7650 32static void
c6da7a6d 33print_flush (void)
6b1b7650 34{
694ec099 35 struct ui *ui = current_ui;
e06e2353
AC
36 struct serial *gdb_stdout_serial;
37
c6da7a6d
AC
38 if (deprecated_error_begin_hook)
39 deprecated_error_begin_hook ();
5df43998 40
223ffa71 41 gdb::optional<target_terminal::scoped_restore_terminal_state> term_state;
74375d18 42 if (target_supports_terminal_ours ())
481ac8c9 43 {
223ffa71
TT
44 term_state.emplace ();
45 target_terminal::ours_for_output ();
481ac8c9 46 }
e06e2353
AC
47
48 /* We want all output to appear now, before we print the error. We
49 have 3 levels of buffering we have to flush (it's possible that
50 some of these should be changed to flush the lower-level ones
51 too): */
52
53 /* 1. The _filtered buffer. */
5df43998
GB
54 if (filtered_printing_initialized ())
55 wrap_here ("");
e06e2353
AC
56
57 /* 2. The stdio buffer. */
c6da7a6d 58 gdb_flush (gdb_stdout);
e06e2353
AC
59 gdb_flush (gdb_stderr);
60
61 /* 3. The system-level buffer. */
694ec099 62 gdb_stdout_serial = serial_fdopen (fileno (ui->outstream));
cade9e54
PB
63 if (gdb_stdout_serial)
64 {
65 serial_drain_output (gdb_stdout_serial);
66 serial_un_fdopen (gdb_stdout_serial);
67 }
e06e2353 68
c6da7a6d 69 annotate_error_begin ();
6b1b7650
AC
70}
71
9cbc821d 72static void
94aeb44b 73print_exception (struct ui_file *file, const struct gdb_exception &e)
9cbc821d 74{
85102364 75 /* KLUDGE: cagney/2005-01-13: Write the string out one line at a time
9cbc821d
AC
76 as that way the MI's behavior is preserved. */
77 const char *start;
78 const char *end;
d7f9d729 79
3d6e9d23 80 for (start = e.what (); start != NULL; start = end)
9cbc821d
AC
81 {
82 end = strchr (start, '\n');
83 if (end == NULL)
84 fputs_filtered (start, file);
85 else
86 {
87 end++;
da5bd37e 88 file->write (start, end - start);
9cbc821d
AC
89 }
90 }
c6da7a6d 91 fprintf_filtered (file, "\n");
e48f5bee
AC
92
93 /* Now append the annotation. */
94 switch (e.reason)
95 {
96 case RETURN_QUIT:
97 annotate_quit ();
98 break;
99 case RETURN_ERROR:
100 /* Assume that these are all errors. */
101 annotate_error ();
102 break;
103 default:
104 internal_error (__FILE__, __LINE__, _("Bad switch."));
105 }
9cbc821d
AC
106}
107
8a076db9 108void
94aeb44b 109exception_print (struct ui_file *file, const struct gdb_exception &e)
8a076db9
AC
110{
111 if (e.reason < 0 && e.message != NULL)
112 {
c6da7a6d 113 print_flush ();
9cbc821d 114 print_exception (file, e);
9cbc821d
AC
115 }
116}
8a076db9 117
9cbc821d 118void
94aeb44b 119exception_fprintf (struct ui_file *file, const struct gdb_exception &e,
9cbc821d
AC
120 const char *prefix, ...)
121{
122 if (e.reason < 0 && e.message != NULL)
123 {
124 va_list args;
c6da7a6d
AC
125
126 print_flush ();
9cbc821d
AC
127
128 /* Print the prefix. */
129 va_start (args, prefix);
130 vfprintf_filtered (file, prefix, args);
131 va_end (args);
132
133 print_exception (file, e);
8a076db9
AC
134 }
135}
136
ecf45d2c
SL
137/* See exceptions.h. */
138
139int
94aeb44b
TT
140exception_print_same (const struct gdb_exception &e1,
141 const struct gdb_exception &e2)
ecf45d2c 142{
3d6e9d23
TT
143 const char *msg1 = e1.message == nullptr ? "" : e1.what ();
144 const char *msg2 = e2.message == nullptr ? "" : e2.what ();
ecf45d2c
SL
145
146 return (e1.reason == e2.reason
147 && e1.error == e2.error
148 && strcmp (msg1, msg2) == 0);
149}