Make exception_catchpoint inherit base_breakpoint instead of catchpoint
authorPedro Alves <pedro@palves.net>
Sat, 7 May 2022 00:18:34 +0000 (01:18 +0100)
committerPedro Alves <pedro@palves.net>
Fri, 20 May 2022 19:41:01 +0000 (20:41 +0100)
exception_catchpoint is really a code breakpoint, with locations set
by sals, re-set like other code breakpoints, etc., so make it inherit
base_breakpoint.

This adds a bit of duplicated code to exception_catchpoint's ctor
(copied from struct catchpoint's ctor), but it will be eliminated in a
following patch.

Change-Id: I9fbb2927491120e9744a4f5e5cb5e6870ca07009

gdb/break-catch-throw.c

index f15fa531519799295d332d70aa6e9e6db8753fcb..90fc3e6d3257ffa8d0a25dbfd51c782a1e55a825 100644 (file)
@@ -63,15 +63,17 @@ static const struct exception_names exception_functions[] =
   { "-probe-stap libstdcxx:catch", "__cxa_begin_catch" }
 };
 
-/* The type of an exception catchpoint.  */
+/* The type of an exception catchpoint.  Unlike most catchpoints, this
+   one is implemented with code breakpoints, so it inherits struct
+   base_breakpoint, not struct catchpoint.  */
 
-struct exception_catchpoint : public catchpoint
+struct exception_catchpoint : public base_breakpoint
 {
   exception_catchpoint (struct gdbarch *gdbarch,
-                       bool temp, const char *cond_string,
+                       bool temp, const char *cond_string_,
                        enum exception_event_kind kind_,
                        std::string &&except_rx)
-    : catchpoint (gdbarch, temp, cond_string),
+    : base_breakpoint (gdbarch, bp_catchpoint),
       kind (kind_),
       exception_rx (std::move (except_rx)),
       pattern (exception_rx.empty ()
@@ -79,6 +81,12 @@ struct exception_catchpoint : public catchpoint
               : new compiled_regex (exception_rx.c_str (), REG_NOSUB,
                                     _("invalid type-matching regexp")))
   {
+    if (cond_string_ != nullptr)
+      cond_string = make_unique_xstrdup (cond_string_);
+    disposition = temp ? disp_del : disp_donttouch;
+
+    pspace = current_program_space;
+    re_set ();
   }
 
   void re_set () override;
@@ -375,8 +383,6 @@ handle_gnu_v3_exceptions (int tempflag, std::string &&except_rx,
     (new exception_catchpoint (gdbarch, tempflag, cond_string,
                               ex_event, std::move (except_rx)));
 
-  cp->re_set ();
-
   install_breakpoint (0, std::move (cp), 1);
 }