From 089cfe113da1395427dd31f21067d5b618b89d7c Mon Sep 17 00:00:00 2001 From: Jaroslav Sevcik Date: Fri, 20 Mar 2020 11:39:30 +0100 Subject: [PATCH] Improve step over performance Summary: This patch improves step over performance for the case when we are stepping over a call with a next-branch-breakpoint (see https://reviews.llvm.org/D58678), and we encounter a stop during the call. Currently, this causes the thread plan to step-out //each frame// until it reaches the step-over range. This is a regression introduced by https://reviews.llvm.org/D58678 (which did improve other things!). Prior to that change, the step-over plan would always step-out just once. With this patch, if we find ourselves stopped in a deeper stack frame and we already have a next branch breakpoint, we simply return from the step-over plan's ShouldStop handler without pushing the step out plan. In my experiments this improved the time of stepping over a call that loads 12 dlls from 14s to 5s. This was in remote debugging scenario with 10ms RTT, the call in question was Vulkan initialization (vkCreateInstance), which loads various driver dlls. Loading those dlls must stop on the rendezvous breakpoint, causing the perf problem described above. Reviewers: clayborg, labath, jingham Reviewed By: jingham Subscribers: lldb-commits Tags: #lldb Differential Revision: https://reviews.llvm.org/D76216 --- lldb/source/Target/ThreadPlanStepOverRange.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lldb/source/Target/ThreadPlanStepOverRange.cpp b/lldb/source/Target/ThreadPlanStepOverRange.cpp index efffcb165018f..37795176119a5 100644 --- a/lldb/source/Target/ThreadPlanStepOverRange.cpp +++ b/lldb/source/Target/ThreadPlanStepOverRange.cpp @@ -171,6 +171,10 @@ bool ThreadPlanStepOverRange::ShouldStop(Event *event_ptr) { const SymbolContext &older_context = older_frame_sp->GetSymbolContext(eSymbolContextEverything); if (IsEquivalentContext(older_context)) { + // If we have the next-branch-breakpoint in the range, we can just + // rely on that breakpoint to trigger once we return to the range. + if (m_next_branch_bp_sp) + return false; new_plan_sp = m_thread.QueueThreadPlanForStepOutNoShouldStop( false, nullptr, true, stop_others, eVoteNo, eVoteNoOpinion, 0, m_status, true);