mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-23 11:39:26 +08:00
2011-10-12 Gary Benson <gbenson@redhat.com>
* breakpoint.h (pc_at_non_inline_function): Declare. * breakpoint.c (is_non_inline_function, pc_at_non_inline_function): New functions. * infrun.c (handle_inferior_event): Don't call skip_inline_frames if the stop is at a location where functions cannot be inlined.
This commit is contained in:
27
gdb/infrun.c
27
gdb/infrun.c
@ -4044,7 +4044,32 @@ handle_inferior_event (struct execution_control_state *ecs)
|
||||
nexti. After stepi and nexti, always show the innermost frame (not any
|
||||
inline function call sites). */
|
||||
if (ecs->event_thread->control.step_range_end != 1)
|
||||
skip_inline_frames (ecs->ptid);
|
||||
{
|
||||
struct address_space *aspace =
|
||||
get_regcache_aspace (get_thread_regcache (ecs->ptid));
|
||||
|
||||
/* skip_inline_frames is expensive, so we avoid it if we can
|
||||
determine that the address is one where functions cannot have
|
||||
been inlined. This improves performance with inferiors that
|
||||
load a lot of shared libraries, because the solib event
|
||||
breakpoint is defined as the address of a function (i.e. not
|
||||
inline). Note that we have to check the previous PC as well
|
||||
as the current one to catch cases when we have just
|
||||
single-stepped off a breakpoint prior to reinstating it.
|
||||
Note that we're assuming that the code we single-step to is
|
||||
not inline, but that's not definitive: there's nothing
|
||||
preventing the event breakpoint function from containing
|
||||
inlined code, and the single-step ending up there. If the
|
||||
user had set a breakpoint on that inlined code, the missing
|
||||
skip_inline_frames call would break things. Fortunately
|
||||
that's an extremely unlikely scenario. */
|
||||
if (!pc_at_non_inline_function (aspace, stop_pc)
|
||||
&& !(ecs->event_thread->suspend.stop_signal == TARGET_SIGNAL_TRAP
|
||||
&& ecs->event_thread->control.trap_expected
|
||||
&& pc_at_non_inline_function (aspace,
|
||||
ecs->event_thread->prev_pc)))
|
||||
skip_inline_frames (ecs->ptid);
|
||||
}
|
||||
|
||||
if (ecs->event_thread->suspend.stop_signal == TARGET_SIGNAL_TRAP
|
||||
&& ecs->event_thread->control.trap_expected
|
||||
|
Reference in New Issue
Block a user