1 /* MI Command Set - catch commands.
2 Copyright (C) 2012-2024 Free Software Foundation, Inc.
4 Contributed by Intel Corporation.
6 This file is part of GDB.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
21 #include "arch-utils.h"
22 #include "breakpoint.h"
25 #include "mi-getopt.h"
26 #include "mi-cmd-break.h"
28 /* Handler for the -catch-assert command. */
31 mi_cmd_catch_assert (const char *cmd
, const char *const *argv
, int argc
)
33 struct gdbarch
*gdbarch
= get_current_arch();
34 std::string condition
;
43 OPT_CONDITION
, OPT_DISABLED
, OPT_TEMP
,
45 static const struct mi_opt opts
[] =
47 { "c", OPT_CONDITION
, 1},
48 { "d", OPT_DISABLED
, 0 },
55 int opt
= mi_getopt ("-catch-assert", argc
, argv
, opts
,
61 switch ((enum opt
) opt
)
64 condition
.assign (oarg
);
75 /* This command does not accept any argument. Make sure the user
76 did not provide any. */
78 error (_("Invalid argument: %s"), argv
[oind
]);
80 scoped_restore restore_breakpoint_reporting
= setup_breakpoint_reporting ();
81 create_ada_exception_catchpoint (gdbarch
, ada_catch_assert
, std::string (),
82 condition
, temp
, enabled
, 0);
85 /* Handler for the -catch-exception command. */
88 mi_cmd_catch_exception (const char *cmd
, const char *const *argv
, int argc
)
90 struct gdbarch
*gdbarch
= get_current_arch();
91 std::string condition
;
93 std::string exception_name
;
95 enum ada_exception_catchpoint_kind ex_kind
= ada_catch_exception
;
102 OPT_CONDITION
, OPT_DISABLED
, OPT_EXCEPTION_NAME
, OPT_TEMP
,
105 static const struct mi_opt opts
[] =
107 { "c", OPT_CONDITION
, 1},
108 { "d", OPT_DISABLED
, 0 },
109 { "e", OPT_EXCEPTION_NAME
, 1 },
110 { "t", OPT_TEMP
, 0 },
111 { "u", OPT_UNHANDLED
, 0},
117 int opt
= mi_getopt ("-catch-exception", argc
, argv
, opts
,
123 switch ((enum opt
) opt
)
126 condition
.assign (oarg
);
131 case OPT_EXCEPTION_NAME
:
132 exception_name
= oarg
;
138 ex_kind
= ada_catch_exception_unhandled
;
143 /* This command does not accept any argument. Make sure the user
144 did not provide any. */
146 error (_("Invalid argument: %s"), argv
[oind
]);
148 /* Specifying an exception name does not make sense when requesting
149 an unhandled exception breakpoint. */
150 if (ex_kind
== ada_catch_exception_unhandled
&& !exception_name
.empty ())
151 error (_("\"-e\" and \"-u\" are mutually exclusive"));
153 scoped_restore restore_breakpoint_reporting
= setup_breakpoint_reporting ();
154 create_ada_exception_catchpoint (gdbarch
, ex_kind
,
155 std::move (exception_name
),
156 condition
, temp
, enabled
, 0);
159 /* Handler for the -catch-handlers command. */
162 mi_cmd_catch_handlers (const char *cmd
, const char *const *argv
, int argc
)
164 struct gdbarch
*gdbarch
= get_current_arch ();
165 std::string condition
;
167 std::string exception_name
;
175 OPT_CONDITION
, OPT_DISABLED
, OPT_EXCEPTION_NAME
, OPT_TEMP
177 static const struct mi_opt opts
[] =
179 { "c", OPT_CONDITION
, 1},
180 { "d", OPT_DISABLED
, 0 },
181 { "e", OPT_EXCEPTION_NAME
, 1 },
182 { "t", OPT_TEMP
, 0 },
188 int opt
= mi_getopt ("-catch-handlers", argc
, argv
, opts
,
194 switch ((enum opt
) opt
)
197 condition
.assign (oarg
);
202 case OPT_EXCEPTION_NAME
:
203 exception_name
= oarg
;
211 /* This command does not accept any argument. Make sure the user
212 did not provide any. */
214 error (_("Invalid argument: %s"), argv
[oind
]);
216 scoped_restore restore_breakpoint_reporting
217 = setup_breakpoint_reporting ();
218 create_ada_exception_catchpoint (gdbarch
, ada_catch_handlers
,
219 std::move (exception_name
),
220 condition
, temp
, enabled
, 0);
223 /* Common path for the -catch-load and -catch-unload. */
226 mi_catch_load_unload (int load
, const char *const *argv
, int argc
)
228 const char *actual_cmd
= load
? "-catch-load" : "-catch-unload";
238 static const struct mi_opt opts
[] =
240 { "t", OPT_TEMP
, 0 },
241 { "d", OPT_DISABLED
, 0 },
247 int opt
= mi_getopt (actual_cmd
, argc
, argv
, opts
,
253 switch ((enum opt
) opt
)
265 error (_("-catch-load/unload: Missing <library name>"));
267 error (_("-catch-load/unload: Garbage following the <library name>"));
269 scoped_restore restore_breakpoint_reporting
= setup_breakpoint_reporting ();
270 add_solib_catchpoint (argv
[oind
], load
, temp
, enabled
);
273 /* Handler for the -catch-load. */
276 mi_cmd_catch_load (const char *cmd
, const char *const *argv
, int argc
)
278 mi_catch_load_unload (1, argv
, argc
);
282 /* Handler for the -catch-unload. */
285 mi_cmd_catch_unload (const char *cmd
, const char *const *argv
, int argc
)
287 mi_catch_load_unload (0, argv
, argc
);
290 /* Core handler for -catch-throw, -catch-rethrow, and -catch-catch
291 commands. The argument handling for all of these is identical, we just
292 pass KIND through to GDB's core to select the correct event type. */
295 mi_cmd_catch_exception_event (enum exception_event_kind kind
,
296 const char *cmd
, const char *const *argv
,
299 const char *regex
= NULL
;
308 static const struct mi_opt opts
[] =
310 { "t", OPT_TEMP
, 0 },
311 { "r", OPT_REGEX
, 1 },
317 int opt
= mi_getopt (cmd
, argc
, argv
, opts
,
323 switch ((enum opt
) opt
)
334 scoped_restore restore_breakpoint_reporting
= setup_breakpoint_reporting ();
335 catch_exception_event (kind
, regex
, temp
, 0 /* from_tty */);
338 /* Handler for -catch-throw. */
341 mi_cmd_catch_throw (const char *cmd
, const char *const *argv
, int argc
)
343 mi_cmd_catch_exception_event (EX_EVENT_THROW
, cmd
, argv
, argc
);
346 /* Handler for -catch-rethrow. */
349 mi_cmd_catch_rethrow (const char *cmd
, const char *const *argv
, int argc
)
351 mi_cmd_catch_exception_event (EX_EVENT_RETHROW
, cmd
, argv
, argc
);
354 /* Handler for -catch-catch. */
357 mi_cmd_catch_catch (const char *cmd
, const char *const *argv
, int argc
)
359 mi_cmd_catch_exception_event (EX_EVENT_CATCH
, cmd
, argv
, argc
);