From 61c26be85f0e09a208fa46ee839c74081c7d8124 Mon Sep 17 00:00:00 2001 From: Mihails Strasuns Date: Wed, 14 Oct 2020 10:44:36 +0200 Subject: [PATCH] gdb: get jiter objfile from a bound minsym This fixes a regression introduced by the following commit: fe053b9e853 gdb/jit: pass the jiter objfile as an argument to jit_event_handler In the refactoring `handle_jit_event` function was changed to pass a matching objfile pointer to the `jit_event_handler` explicitly, rather using internal storage: ``` --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -5448,8 +5448,9 @@ handle_jit_event (void) frame = get_current_frame (); gdbarch = get_frame_arch (frame); + objfile *jiter = symbol_objfile (get_frame_function (frame)); - jit_event_handler (gdbarch); + jit_event_handler (gdbarch, jiter); ``` This was needed to add support for multiple jiters. However it has also introduced a regression, because `get_frame_function (frame)` here may return `nullptr`, resulting in a crash. A more resilient way would be to use an approach mirroring `jit_breakpoint_re_set` - to find a minimal symbol matching the breakpoint location and use its object file. We know that this breakpoint event comes from a breakpoint set by `jit_breakpoint_re_set`, thus using the reverse approach should be reliable enough. gdb/Changelog: 2020-10-14 Mihails Strasuns * breakpoint.c (handle_jit_event): Add an argument, change how `jit_event_handler` is called. --- gdb/ChangeLog | 5 +++++ gdb/breakpoint.c | 19 +++++++++++-------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 419b716eb41..0a81dacc9e0 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2020-10-14 Mihails Strasuns + + * breakpoint.c (handle_jit_event): Add an argument, change how + `jit_event_handler` is called. + 2020-10-17 Tom Tromey * xcoffread.c (xcoff_end_psymtab): Use partial_symtab::empty. diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 296b08c0afc..631bee540b4 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -5441,9 +5441,8 @@ bpstat_stop_status (const address_space *aspace, } static void -handle_jit_event (void) +handle_jit_event (CORE_ADDR address) { - struct frame_info *frame; struct gdbarch *gdbarch; infrun_debug_printf ("handling bp_jit_event"); @@ -5452,11 +5451,15 @@ handle_jit_event (void) breakpoint_re_set. */ target_terminal::ours_for_output (); - frame = get_current_frame (); - gdbarch = get_frame_arch (frame); - objfile *jiter = symbol_objfile (get_frame_function (frame)); - - jit_event_handler (gdbarch, jiter); + gdbarch = get_frame_arch (get_current_frame ()); + /* This event is caused by a breakpoint set in `jit_breakpoint_re_set`, + thus it is expected that its objectfile can be found through + minimal symbol lookup. If it doesn't work (and assert fails), it + most likely means that `jit_breakpoint_re_set` was changes and this + function needs to be updated too. */ + bound_minimal_symbol jit_bp_sym = lookup_minimal_symbol_by_pc (address); + gdb_assert (jit_bp_sym.objfile != nullptr); + jit_event_handler (gdbarch, jit_bp_sym.objfile); target_terminal::inferior (); } @@ -5657,7 +5660,7 @@ bpstat_run_callbacks (bpstat bs_head) switch (b->type) { case bp_jit_event: - handle_jit_event (); + handle_jit_event (bs->bp_location_at->address); break; case bp_gnu_ifunc_resolver: gnu_ifunc_resolver_stop (b); -- 2.30.2