From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2126) id 4AC6D3858434; Fri, 29 Apr 2022 22:22:45 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 4AC6D3858434 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Tom Tromey To: gdb-cvs@sourceware.org Subject: [binutils-gdb] Convert break-catch-load to vtable ops X-Act-Checkin: binutils-gdb X-Git-Author: Tom Tromey X-Git-Refname: refs/heads/master X-Git-Oldrev: 54485252a9dd409598df621d3072bd349c53a58c X-Git-Newrev: 89e57567f5f1bd09a1049970e4b020317ba3e701 Message-Id: <20220429222245.4AC6D3858434@sourceware.org> Date: Fri, 29 Apr 2022 22:22:45 +0000 (GMT) X-BeenThere: gdb-cvs@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 29 Apr 2022 22:22:45 -0000 https://sourceware.org/git/gitweb.cgi?p=3Dbinutils-gdb.git;h=3D89e57567f5f1= bd09a1049970e4b020317ba3e701 commit 89e57567f5f1bd09a1049970e4b020317ba3e701 Author: Tom Tromey Date: Fri Jan 14 19:03:03 2022 -0700 Convert break-catch-load to vtable ops =20 This converts break-catch-load.c to use vtable_breakpoint_ops. Diff: --- gdb/break-catch-load.c | 126 ++++++++++++++++++++-------------------------= ---- 1 file changed, 52 insertions(+), 74 deletions(-) diff --git a/gdb/break-catch-load.c b/gdb/break-catch-load.c index 8711c00e45c..0a27b05a280 100644 --- a/gdb/break-catch-load.c +++ b/gdb/break-catch-load.c @@ -35,6 +35,19 @@ =20 struct solib_catchpoint : public breakpoint { + int insert_location (struct bp_location *) override; + int remove_location (struct bp_location *, + enum remove_bp_reason reason) override; + int breakpoint_hit (const struct bp_location *bl, + const address_space *aspace, + CORE_ADDR bp_addr, + const target_waitstatus &ws) override; + void check_status (struct bpstat *bs) override; + enum print_stop_action print_it (struct bpstat *bs) override; + bool print_one (struct bp_location **) override; + void print_mention () override; + void print_recreate (struct ui_file *fp) override; + /* True for "catch load", false for "catch unload". */ bool is_load; =20 @@ -44,26 +57,25 @@ struct solib_catchpoint : public breakpoint std::unique_ptr compiled; }; =20 -static int -insert_catch_solib (struct bp_location *ignore) +int +solib_catchpoint::insert_location (struct bp_location *ignore) { return 0; } =20 -static int -remove_catch_solib (struct bp_location *ignore, enum remove_bp_reason reas= on) +int +solib_catchpoint::remove_location (struct bp_location *ignore, + enum remove_bp_reason reason) { return 0; } =20 -static int -breakpoint_hit_catch_solib (const struct bp_location *bl, - const address_space *aspace, - CORE_ADDR bp_addr, - const target_waitstatus &ws) +int +solib_catchpoint::breakpoint_hit (const struct bp_location *bl, + const address_space *aspace, + CORE_ADDR bp_addr, + const target_waitstatus &ws) { - struct solib_catchpoint *self =3D (struct solib_catchpoint *) bl->owner; - if (ws.kind () =3D=3D TARGET_WAITKIND_LOADED) return 1; =20 @@ -75,7 +87,7 @@ breakpoint_hit_catch_solib (const struct bp_location *bl, if (other->type !=3D bp_shlib_event) continue; =20 - if (self->pspace !=3D NULL && other->pspace !=3D self->pspace) + if (pspace !=3D NULL && other->pspace !=3D pspace) continue; =20 for (bp_location *other_bl : other->locations ()) @@ -88,18 +100,15 @@ breakpoint_hit_catch_solib (const struct bp_location *= bl, return 0; } =20 -static void -check_status_catch_solib (struct bpstat *bs) +void +solib_catchpoint::check_status (struct bpstat *bs) { - struct solib_catchpoint *self - =3D (struct solib_catchpoint *) bs->breakpoint_at; - - if (self->is_load) + if (is_load) { for (so_list *iter : current_program_space->added_solibs) { - if (!self->regex - || self->compiled->exec (iter->so_name, 0, NULL, 0) =3D=3D 0) + if (!regex + || compiled->exec (iter->so_name, 0, NULL, 0) =3D=3D 0) return; } } @@ -107,8 +116,8 @@ check_status_catch_solib (struct bpstat *bs) { for (const std::string &iter : current_program_space->deleted_solibs) { - if (!self->regex - || self->compiled->exec (iter.c_str (), 0, NULL, 0) =3D=3D 0) + if (!regex + || compiled->exec (iter.c_str (), 0, NULL, 0) =3D=3D 0) return; } } @@ -117,8 +126,8 @@ check_status_catch_solib (struct bpstat *bs) bs->print_it =3D print_it_noop; } =20 -static enum print_stop_action -print_it_catch_solib (bpstat *bs) +enum print_stop_action +solib_catchpoint::print_it (bpstat *bs) { struct breakpoint *b =3D bs->breakpoint_at; struct ui_out *uiout =3D current_uiout; @@ -137,10 +146,9 @@ print_it_catch_solib (bpstat *bs) return PRINT_SRC_AND_LOC; } =20 -static bool -print_one_catch_solib (struct breakpoint *b, struct bp_location **locs) +bool +solib_catchpoint::print_one (struct bp_location **locs) { - struct solib_catchpoint *self =3D (struct solib_catchpoint *) b; struct value_print_options opts; struct ui_out *uiout =3D current_uiout; =20 @@ -156,54 +164,48 @@ print_one_catch_solib (struct breakpoint *b, struct b= p_location **locs) =20 std::string msg; annotate_field (5); - if (self->is_load) + if (is_load) { - if (self->regex) + if (regex) msg =3D string_printf (_("load of library matching %s"), - self->regex.get ()); + regex.get ()); else msg =3D _("load of library"); } else { - if (self->regex) + if (regex) msg =3D string_printf (_("unload of library matching %s"), - self->regex.get ()); + regex.get ()); else msg =3D _("unload of library"); } uiout->field_string ("what", msg); =20 if (uiout->is_mi_like_p ()) - uiout->field_string ("catch-type", self->is_load ? "load" : "unload"); + uiout->field_string ("catch-type", is_load ? "load" : "unload"); =20 return true; } =20 -static void -print_mention_catch_solib (struct breakpoint *b) +void +solib_catchpoint::print_mention () { - struct solib_catchpoint *self =3D (struct solib_catchpoint *) b; - - gdb_printf (_("Catchpoint %d (%s)"), b->number, - self->is_load ? "load" : "unload"); + gdb_printf (_("Catchpoint %d (%s)"), number, + is_load ? "load" : "unload"); } =20 -static void -print_recreate_catch_solib (struct breakpoint *b, struct ui_file *fp) +void +solib_catchpoint::print_recreate (struct ui_file *fp) { - struct solib_catchpoint *self =3D (struct solib_catchpoint *) b; - gdb_printf (fp, "%s %s", - b->disposition =3D=3D disp_del ? "tcatch" : "catch", - self->is_load ? "load" : "unload"); - if (self->regex) - gdb_printf (fp, " %s", self->regex.get ()); + disposition =3D=3D disp_del ? "tcatch" : "catch", + is_load ? "load" : "unload"); + if (regex) + gdb_printf (fp, " %s", regex.get ()); gdb_printf (fp, "\n"); } =20 -static struct breakpoint_ops catch_solib_breakpoint_ops; - /* See breakpoint.h. */ =20 void @@ -225,8 +227,7 @@ add_solib_catchpoint (const char *arg, bool is_load, bo= ol is_temp, bool enabled) } =20 c->is_load =3D is_load; - init_catchpoint (c.get (), gdbarch, is_temp, NULL, - &catch_solib_breakpoint_ops); + init_catchpoint (c.get (), gdbarch, is_temp, NULL, &vtable_breakpoint_op= s); =20 c->enable_state =3D enabled ? bp_enabled : bp_disabled; =20 @@ -260,33 +261,10 @@ catch_unload_command_1 (const char *arg, int from_tty, catch_load_or_unload (arg, from_tty, 0, command); } =20 -static void -initialize_ops () -{ - struct breakpoint_ops *ops; - - initialize_breakpoint_ops (); - - /* Solib-related catchpoints. */ - ops =3D &catch_solib_breakpoint_ops; - *ops =3D base_breakpoint_ops; - ops->insert_location =3D insert_catch_solib; - ops->remove_location =3D remove_catch_solib; - ops->breakpoint_hit =3D breakpoint_hit_catch_solib; - ops->check_status =3D check_status_catch_solib; - ops->print_it =3D print_it_catch_solib; - ops->print_one =3D print_one_catch_solib; - ops->print_mention =3D print_mention_catch_solib; - ops->print_recreate =3D print_recreate_catch_solib; - -} - void _initialize_break_catch_load (); void _initialize_break_catch_load () { - initialize_ops (); - add_catch_command ("load", _("Catch loads of shared libraries.\n\ Usage: catch load [REGEX]\n\ If REGEX is given, only stop for libraries matching the regular expression= ."),