Convert init_ada_exception_catchpoint to a ctor

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
This commit is contained in:
Pedro Alves 2022-05-07 00:23:08 +01:00
parent 8cd0bf5e7e
commit bd21b6c9cf
3 changed files with 49 additions and 59 deletions

View 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 ())

View 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;
}
/* Compare two breakpoints and return a strcmp-like result. */

View 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) */