diff options
Diffstat (limited to 'lldb/source')
-rw-r--r-- | lldb/source/Target/ThreadPlanStepInRange.cpp | 2 | ||||
-rw-r--r-- | lldb/source/Target/ThreadPlanStepOverRange.cpp | 2 | ||||
-rw-r--r-- | lldb/source/Target/ThreadPlanStepRange.cpp | 51 |
3 files changed, 47 insertions, 8 deletions
diff --git a/lldb/source/Target/ThreadPlanStepInRange.cpp b/lldb/source/Target/ThreadPlanStepInRange.cpp index 28cd8b86ced..9d3bd24ec73 100644 --- a/lldb/source/Target/ThreadPlanStepInRange.cpp +++ b/lldb/source/Target/ThreadPlanStepInRange.cpp @@ -63,7 +63,7 @@ ThreadPlanStepInRange::GetDescription (Stream *s, lldb::DescriptionLevel level) else { s->Printf ("Stepping through range (stepping into functions): "); - m_address_range.Dump (s, &m_thread.GetProcess().GetTarget(), Address::DumpStyleLoadAddress); + DumpRanges(s); } } diff --git a/lldb/source/Target/ThreadPlanStepOverRange.cpp b/lldb/source/Target/ThreadPlanStepOverRange.cpp index adade557f7a..57ea97bc315 100644 --- a/lldb/source/Target/ThreadPlanStepOverRange.cpp +++ b/lldb/source/Target/ThreadPlanStepOverRange.cpp @@ -58,7 +58,7 @@ ThreadPlanStepOverRange::GetDescription (Stream *s, lldb::DescriptionLevel level else { s->Printf ("stepping through range (stepping over functions): "); - m_address_range.Dump (s, &m_thread.GetProcess().GetTarget(), Address::DumpStyleLoadAddress); + DumpRanges(s); } } diff --git a/lldb/source/Target/ThreadPlanStepRange.cpp b/lldb/source/Target/ThreadPlanStepRange.cpp index 7dc1b7dd526..3e87ffeb8e5 100644 --- a/lldb/source/Target/ThreadPlanStepRange.cpp +++ b/lldb/source/Target/ThreadPlanStepRange.cpp @@ -41,13 +41,14 @@ ThreadPlanStepRange::ThreadPlanStepRange (ThreadPlanKind kind, lldb::RunMode stop_others) : ThreadPlan (kind, name, thread, eVoteNoOpinion, eVoteNoOpinion), m_addr_context (addr_context), - m_address_range (range), + m_address_ranges (), m_stop_others (stop_others), m_stack_depth (0), m_stack_id (), m_no_more_plans (false), m_first_run_event (true) { + AddRange(range); m_stack_depth = m_thread.GetStackFrameCount(); m_stack_id = m_thread.GetStackFrameAtIndex(0)->GetStackID(); } @@ -97,6 +98,33 @@ ThreadPlanStepRange::ShouldReportStop (Event *event_ptr) return vote; } +void +ThreadPlanStepRange::AddRange(const AddressRange &new_range) +{ + // For now I'm just adding the ranges. At some point we may want to + // condense the ranges if they overlap, though I don't think it is likely + // to be very important. + m_address_ranges.push_back (new_range); +} + +void +ThreadPlanStepRange::DumpRanges(Stream *s) +{ + size_t num_ranges = m_address_ranges.size(); + if (num_ranges == 1) + { + m_address_ranges[0].Dump (s, &m_thread.GetProcess().GetTarget(), Address::DumpStyleLoadAddress); + } + else + { + for (size_t i = 0; i < num_ranges; i++) + { + s->PutCString("%d: "); + m_address_ranges[i].Dump (s, &m_thread.GetProcess().GetTarget(), Address::DumpStyleLoadAddress); + } + } +} + bool ThreadPlanStepRange::InRange () { @@ -105,7 +133,13 @@ ThreadPlanStepRange::InRange () lldb::addr_t pc_load_addr = m_thread.GetRegisterContext()->GetPC(); - ret_value = m_address_range.ContainsLoadAddress(pc_load_addr, &m_thread.GetProcess().GetTarget()); + size_t num_ranges = m_address_ranges.size(); + for (size_t i = 0; i < num_ranges; i++) + { + ret_value = m_address_ranges[i].ContainsLoadAddress(pc_load_addr, &m_thread.GetProcess().GetTarget()); + if (ret_value) + break; + } if (!ret_value) { @@ -120,12 +154,14 @@ ThreadPlanStepRange::InRange () if (m_addr_context.line_entry.line == new_context.line_entry.line) { m_addr_context = new_context; - m_address_range = m_addr_context.line_entry.range; + AddRange(m_addr_context.line_entry.range); ret_value = true; if (log) { StreamString s; - m_address_range.Dump (&s, &m_thread.GetProcess().GetTarget(), Address::DumpStyleLoadAddress); + m_addr_context.line_entry.range.Dump (&s, + &m_thread.GetProcess().GetTarget(), + Address::DumpStyleLoadAddress); log->Printf ("Step range plan stepped to another range of same line: %s", s.GetData()); } @@ -138,12 +174,15 @@ ThreadPlanStepRange::InRange () // But we probably don't want to be in the middle of a line range, so in that case reset the stepping // range to the line we've stepped into the middle of and continue. m_addr_context = new_context; - m_address_range = m_addr_context.line_entry.range; + m_address_ranges.clear(); + AddRange(m_addr_context.line_entry.range); ret_value = true; if (log) { StreamString s; - m_address_range.Dump (&s, &m_thread.GetProcess().GetTarget(), Address::DumpStyleLoadAddress); + m_addr_context.line_entry.range.Dump (&s, + &m_thread.GetProcess().GetTarget(), + Address::DumpStyleLoadAddress); log->Printf ("Step range plan stepped to the middle of new line(%d): %s, continuing to clear this line.", new_context.line_entry.line, |