Convert init_ada_exception_catchpoint to a ctor
authorPedro Alves <pedro@palves.net>
Fri, 6 May 2022 23:23:08 +0000 (00:23 +0100)
committerPedro Alves <pedro@palves.net>
Fri, 20 May 2022 19:41:01 +0000 (20:41 +0100)
Currently, init_ada_exception_catchpoint is defined in breakpoint.c, I
presume so it can call the static describe_other_breakpoints function.
I think this is a dependency inversion.
init_ada_exception_catchpoint, being code specific to Ada catchpoints,
should be in ada-lang.c, and describe_other_breakpoints, a core
function, should be exported.

And then, we can convert init_ada_exception_catchpoint to an
ada_catchpoint ctor.

Change-Id: I07695572dabc5a75d3d3740fd9b95db1529406a1

gdb/ada-lang.c
gdb/breakpoint.c
gdb/breakpoint.h

index 1c70f4178d0a0ab14fc551b28ba94986481ddc6a..5ddca104dc3f6dbeb98cd144d7a4b277e3bcdd8b 100644 (file)
@@ -12107,10 +12107,45 @@ static std::string ada_exception_catchpoint_cond_string
 struct ada_catchpoint : public base_breakpoint
 {
   ada_catchpoint (struct gdbarch *gdbarch_,
-                 enum ada_exception_catchpoint_kind kind)
+                 enum ada_exception_catchpoint_kind kind,
+                 struct symtab_and_line sal,
+                 const char *addr_string_,
+                 bool tempflag,
+                 bool enabled,
+                 bool from_tty)
     : base_breakpoint (gdbarch_, bp_catchpoint),
       m_kind (kind)
   {
+    add_location (sal);
+
+    /* Unlike most base_breakpoint types, Ada catchpoints are
+       pspace-specific.  */
+    gdb_assert (sal.pspace != nullptr);
+    this->pspace = sal.pspace;
+
+    if (from_tty)
+      {
+       struct gdbarch *loc_gdbarch = get_sal_arch (sal);
+       if (!loc_gdbarch)
+         loc_gdbarch = gdbarch;
+
+       describe_other_breakpoints (loc_gdbarch,
+                                   sal.pspace, sal.pc, sal.section, -1);
+       /* FIXME: brobecker/2006-12-28: Actually, re-implement a special
+          version for exception catchpoints, because two catchpoints
+          used for different exception names will use the same address.
+          In this case, a "breakpoint ... also set at..." warning is
+          unproductive.  Besides, the warning phrasing is also a bit
+          inappropriate, we should use the word catchpoint, and tell
+          the user what type of catchpoint it is.  The above is good
+          enough for now, though.  */
+      }
+
+    enable_state = enabled ? bp_enabled : bp_disabled;
+    disposition = tempflag ? disp_del : disp_donttouch;
+    location = string_to_event_location (&addr_string_,
+                                        language_def (language_ada));
+    language = language_ada;
   }
 
   struct bp_location *allocate_location () override;
@@ -12759,9 +12794,9 @@ create_ada_exception_catchpoint (struct gdbarch *gdbarch,
   std::string addr_string;
   struct symtab_and_line sal = ada_exception_sal (ex_kind, &addr_string);
 
-  std::unique_ptr<ada_catchpoint> c (new ada_catchpoint (gdbarch, ex_kind));
-  init_ada_exception_breakpoint (c.get (), gdbarch, sal, addr_string.c_str (),
-                                tempflag, disabled, from_tty);
+  std::unique_ptr<ada_catchpoint> c
+    (new ada_catchpoint (gdbarch, ex_kind, sal, addr_string.c_str (),
+                        tempflag, disabled, from_tty));
   c->excep_string = excep_string;
   create_excep_cond_exprs (c.get (), ex_kind);
   if (!cond_string.empty ())
index 485488a933d04e95d87ef46b76aded38f167e58b..ec7a8ea2322051cd93f3d7332eccca91f5deab6a 100644 (file)
@@ -130,10 +130,6 @@ static CORE_ADDR adjust_breakpoint_address (struct gdbarch *gdbarch,
                                            CORE_ADDR bpaddr,
                                            enum bptype bptype);
 
-static void describe_other_breakpoints (struct gdbarch *,
-                                       struct program_space *, CORE_ADDR,
-                                       struct obj_section *, int);
-
 static int watchpoint_locations_match (struct bp_location *loc1,
                                       struct bp_location *loc2);
 
@@ -6862,11 +6858,9 @@ breakpoint_has_pc (struct breakpoint *b,
   return 0;
 }
 
-/* Print a message describing any user-breakpoints set at PC.  This
-   concerns with logical breakpoints, so we match program spaces, not
-   address spaces.  */
+/* See breakpoint.h.  */
 
-static void
+void
 describe_other_breakpoints (struct gdbarch *gdbarch,
                            struct program_space *pspace, CORE_ADDR pc,
                            struct obj_section *section, int thread)
@@ -10590,42 +10584,6 @@ until_break_command (const char *arg, int from_tty, int anywhere)
   proceed (-1, GDB_SIGNAL_DEFAULT);
 }
 
-void
-init_ada_exception_breakpoint (struct breakpoint *b,
-                              struct gdbarch *gdbarch,
-                              struct symtab_and_line sal,
-                              const char *addr_string,
-                              int tempflag,
-                              int enabled,
-                              int from_tty)
-{
-  if (from_tty)
-    {
-      struct gdbarch *loc_gdbarch = get_sal_arch (sal);
-      if (!loc_gdbarch)
-       loc_gdbarch = gdbarch;
-
-      describe_other_breakpoints (loc_gdbarch,
-                                 sal.pspace, sal.pc, sal.section, -1);
-      /* FIXME: brobecker/2006-12-28: Actually, re-implement a special
-        version for exception catchpoints, because two catchpoints
-        used for different exception names will use the same address.
-        In this case, a "breakpoint ... also set at..." warning is
-        unproductive.  Besides, the warning phrasing is also a bit
-        inappropriate, we should use the word catchpoint, and tell
-        the user what type of catchpoint it is.  The above is good
-        enough for now, though.  */
-    }
-
-  init_raw_breakpoint (b, sal, bp_catchpoint);
-
-  b->enable_state = enabled ? bp_enabled : bp_disabled;
-  b->disposition = tempflag ? disp_del : disp_donttouch;
-  b->location = string_to_event_location (&addr_string,
-                                         language_def (language_ada));
-  b->language = language_ada;
-}
-
 \f
 
 /* Compare two breakpoints and return a strcmp-like result.  */
index 40ba98b74969e39cc6ec2fec50e03d995f4fc174..a4ead8b4d4e12c9ae683d02507355ffac511275d 100644 (file)
@@ -1460,17 +1460,6 @@ extern void
                     void *user_data_catch,
                     void *user_data_tcatch);
 
-/* Initialize a breakpoint struct for Ada exception catchpoints.  */
-
-extern void
-  init_ada_exception_breakpoint (struct breakpoint *b,
-                                struct gdbarch *gdbarch,
-                                struct symtab_and_line sal,
-                                const char *addr_string,
-                                int tempflag,
-                                int enabled,
-                                int from_tty);
-
 /* Add breakpoint B on the breakpoint list, and notify the user, the
    target and breakpoint_created observers of its existence.  If
    INTERNAL is non-zero, the breakpoint number will be allocated from
@@ -1905,4 +1894,12 @@ extern void catch_exception_event (enum exception_event_kind ex_event,
 
 extern void print_solib_event (bool is_catchpoint);
 
+/* Print a message describing any user-breakpoints set at PC.  This
+   concerns with logical breakpoints, so we match program spaces, not
+   address spaces.  */
+
+extern void describe_other_breakpoints (struct gdbarch *,
+                                       struct program_space *, CORE_ADDR,
+                                       struct obj_section *, int);
+
 #endif /* !defined (BREAKPOINT_H) */