diff options
author | Simon Marchi <simon.marchi@polymtl.ca> | 2017-06-02 23:16:21 +0200 |
---|---|---|
committer | Simon Marchi <simon.marchi@ericsson.com> | 2017-06-02 23:16:21 +0200 |
commit | c1fc2657206188767cb66813d07b9ecbb5e9ec51 (patch) | |
tree | d38faab12cc15c6954b51ae5b0ec9c225cbf1174 /gdb/breakpoint.h | |
parent | 3b0871f44a3402f4e1e811ae81c8ba1293c1c7be (diff) | |
download | binutils-gdb-c1fc2657206188767cb66813d07b9ecbb5e9ec51.tar.gz |
C++ify breakpoint class hierarchy (destructors only)
Breakpoints are currently in a limbo state between C and C++. There is
a pseudo class hierarchy implemented using struct fields. Taking
watchpoint as an example:
struct watchpoint
{
/* The base class. */
struct breakpoint base;
...
}
and it is instantianted with "new watchpoint ()". When destroyed, a
destructor is first invoked through the breakpoint_ops, and then the
memory is freed by calling delete through a pointer to breakpoint.
Address sanitizer complains about this, for example, because we new and
delete the same memory using different types.
This patch takes the logical step of making breakpoint subclasses extend
the breakpoint class for real, and converts their destructors to actual
C++ destructors.
Regtested on the buildbot.
gdb/ChangeLog:
* breakpoint.h (struct breakpoint_ops) <dtor>: Remove.
(struct breakpoint) <~breakpoint>: New.
(struct watchpoint): Inherit from breakpoint.
<~watchpoint>: New.
<base>: Remove.
(struct tracepoint): Inherit from breakpoint.
<base>: Remove.
* breakpoint.c (longjmp_breakpoint_ops): Remove.
(struct longjmp_breakpoint): Inherit from breakpoint.
<~longjmp_breakpoint>: New.
<base>: Remove.
(new_breakpoint_from_type): Remove casts.
(watchpoint_in_thread_scope): Remove reference to base field.
(watchpoint_del_at_next_stop): Likewise.
(update_watchpoint): Likewise.
(watchpoint_check): Likewise.
(bpstat_check_watchpoint): Likewise.
(set_longjmp_breakpoint): Likewise.
(struct fork_catchpoint): Inherit from breakpoint.
<base>: Remove.
(struct solib_catchpoint): Inherit from breakpoint.
<~solib_catchpoint>: New.
<base>: Remove.
(dtor_catch_solib): Change to ...
(solib_catchpoint::~solib_catchpoint): ... this.
(breakpoint_hit_catch_solib): Remove reference to base field.
(add_solib_catchpoint): Likewise.
(create_fork_vfork_event_catchpoint): Likewise.
(struct exec_catchpoint): Inherit from breakpoint.
<~exec_catchpoint>: New.
<base>: Remove.
(dtor_catch_exec): Change to ...
(exec_catchpoint::~exec_catchpoint): ... this.
(dtor_watchpoint): Change to ...
(watchpoint::~watchpoint): ... this.
(watch_command_1): Remove reference to base field.
(catch_exec_command_1): Likewise.
(base_breakpoint_dtor): Change to ...
(breakpoint::~breakpoint): ... this.
(base_breakpoint_ops): Remove dtor field value.
(longjmp_bkpt_dtor): Change to ...
(longjmp_breakpoint::~longjmp_breakpoint): ... this.
(strace_marker_create_breakpoints_sal): Remove reference to base
field.
(delete_breakpoint): Don't manually call breakpoint destructor.
(create_tracepoint_from_upload): Remove reference to base field.
(trace_pass_set_count): Likewise.
(initialize_breakpoint_ops): Don't initialize
momentary_breakpoint_ops, don't set dtors.
* ada-lang.c (struct ada_catchpoint): Inherit from breakpoint.
<~ada_catchpoint>: New.
<base>: Remove.
(create_excep_cond_exprs): Remove reference to base field.
(dtor_exception): Change to ...
(ada_catchpoint::~ada_catchpoint): ... this.
(dtor_catch_exception): Remove.
(dtor_catch_exception_unhandled): Remove.
(dtor_catch_assert): Remove.
(create_ada_exception_catchpoint): Remove reference to base
field.
(initialize_ada_catchpoint_ops): Don't set dtors.
* break-catch-sig.c (struct signal_catchpoint): Inherit from
breakpoint.
<~signal_catchpoint>: New.
<base>: Remove.
(signal_catchpoint_dtor): Change to ...
(signal_catchpoint::~signal_catchpoint): ... this.
(create_signal_catchpoint): Remove reference to base field.
(initialize_signal_catchpoint_ops): Don't set dtor.
* break-catch-syscall.c (struct syscall_catchpoint): Inherit
from breakpoint.
<~syscall_catchpoint>: New.
<base>: Remove.
(dtor_catch_syscall): Change to ...
(syscall_catchpoint::~syscall_catchpoint): ... this.
(create_syscall_event_catchpoint): Remove reference to base
field.
(initialize_syscall_catchpoint_ops): Don't set dtor.
* break-catch-throw.c (struct exception_catchpoint): Inherit
from breakpoint.
<~exception_catchpoint>: New.
<base>: Remove.
(dtor_exception_catchpoint): Change to ...
(exception_catchpoint::~exception_catchpoint): ... this.
(handle_gnu_v3_exceptions): Remove reference to base field.
(initialize_throw_catchpoint_ops): Don't set dtor.
* ctf.c (ctf_get_traceframe_address): Remove reference to base
field.
* remote.c (remote_get_tracepoint_status): Likewise.
* tracefile-tfile.c (tfile_get_traceframe_address): Likewise.
* tracefile.c (tracefile_fetch_registers): Likewise.
* tracepoint.c (actions_command): Likewise.
(validate_actionline): Likewise.
(tfind_1): Likewise.
(get_traceframe_location): Likewise.
(find_matching_tracepoint_location): Likewise.
(parse_tracepoint_status): Likewise.
* mi/mi-cmd-break.c (mi_cmd_break_passcount): Likewise.
Diffstat (limited to 'gdb/breakpoint.h')
-rw-r--r-- | gdb/breakpoint.h | 23 |
1 files changed, 7 insertions, 16 deletions
diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h index 26b0aa53a8d..848d2c6f631 100644 --- a/gdb/breakpoint.h +++ b/gdb/breakpoint.h @@ -512,10 +512,6 @@ enum print_stop_action struct breakpoint_ops { - /* Destructor. Releases everything from SELF (but not SELF - itself). */ - void (*dtor) (struct breakpoint *self); - /* Allocate a location for this breakpoint. */ struct bp_location * (*allocate_location) (struct breakpoint *); @@ -680,6 +676,8 @@ extern int target_exact_watchpoints; struct breakpoint { + virtual ~breakpoint (); + /* Methods associated with this breakpoint. */ const breakpoint_ops *ops = NULL; @@ -783,14 +781,11 @@ struct breakpoint gdbscm_breakpoint_object *scm_bp_object = NULL; }; -/* An instance of this type is used to represent a watchpoint. It - includes a "struct breakpoint" as a kind of base class; users - downcast to "struct breakpoint *" when needed. */ +/* An instance of this type is used to represent a watchpoint. */ -struct watchpoint +struct watchpoint : public breakpoint { - /* The base class. */ - struct breakpoint base; + ~watchpoint () override; /* String form of exp to use for displaying to the user (malloc'd), or NULL if none. */ @@ -867,14 +862,10 @@ extern int is_breakpoint (const struct breakpoint *bpt); extern int is_watchpoint (const struct breakpoint *bpt); /* An instance of this type is used to represent all kinds of - tracepoints. It includes a "struct breakpoint" as a kind of base - class; users downcast to "struct breakpoint *" when needed. */ + tracepoints. */ -struct tracepoint +struct tracepoint : public breakpoint { - /* The base class. */ - struct breakpoint base; - /* Number of times this tracepoint should single-step and collect additional data. */ long step_count; |