]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/exceptions.c
Convert struct target_ops to C++
[thirdparty/binutils-gdb.git] / gdb / exceptions.c
CommitLineData
60250e8b
AC
1/* Exception (throw catch) mechanism, for GDB, the GNU debugger.
2
e2882c85 3 Copyright (C) 1986-2018 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"
694ec099 29#include "top.h"
223ffa71 30#include "common/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;
f6ac5f3d
PA
42 /* While normally there's always something pushed on the target
43 stack, the NULL check is needed here because we can get here very
44 early during startup, before the target stack is first
45 initialized. */
46 if (target_stack != NULL && target_supports_terminal_ours ())
481ac8c9 47 {
223ffa71
TT
48 term_state.emplace ();
49 target_terminal::ours_for_output ();
481ac8c9 50 }
e06e2353
AC
51
52 /* We want all output to appear now, before we print the error. We
53 have 3 levels of buffering we have to flush (it's possible that
54 some of these should be changed to flush the lower-level ones
55 too): */
56
57 /* 1. The _filtered buffer. */
5df43998
GB
58 if (filtered_printing_initialized ())
59 wrap_here ("");
e06e2353
AC
60
61 /* 2. The stdio buffer. */
c6da7a6d 62 gdb_flush (gdb_stdout);
e06e2353
AC
63 gdb_flush (gdb_stderr);
64
65 /* 3. The system-level buffer. */
694ec099 66 gdb_stdout_serial = serial_fdopen (fileno (ui->outstream));
cade9e54
PB
67 if (gdb_stdout_serial)
68 {
69 serial_drain_output (gdb_stdout_serial);
70 serial_un_fdopen (gdb_stdout_serial);
71 }
e06e2353 72
c6da7a6d 73 annotate_error_begin ();
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
ecf45d2c
SL
141/* See exceptions.h. */
142
143int
144exception_print_same (struct gdb_exception e1, struct gdb_exception e2)
145{
146 const char *msg1 = e1.message;
147 const char *msg2 = e2.message;
148
149 if (msg1 == NULL)
150 msg1 = "";
151 if (msg2 == NULL)
152 msg2 = "";
153
154 return (e1.reason == e2.reason
155 && e1.error == e2.error
156 && strcmp (msg1, msg2) == 0);
157}