diff options
| author | Jim Ingham <jingham@apple.com> | 2011-10-15 00:24:48 +0000 |
|---|---|---|
| committer | Jim Ingham <jingham@apple.com> | 2011-10-15 00:24:48 +0000 |
| commit | c4c9fedc72272918d0c3bc26946b980af2d80f11 (patch) | |
| tree | 5302bdd2ba2d5d6ecae34f1903216da9961c5a71 | |
| parent | 10c4b249fc33d1792dd5da03af1754078af8d68a (diff) | |
| download | bcm5719-llvm-c4c9fedc72272918d0c3bc26946b980af2d80f11.tar.gz bcm5719-llvm-c4c9fedc72272918d0c3bc26946b980af2d80f11.zip | |
Make the step range plans capable of supporting multiple ranges. Also make their constructors public, there isn't any good reason why you shouldn't be able to make these plans.
llvm-svn: 142026
| -rw-r--r-- | lldb/include/lldb/Target/ThreadPlanStepInRange.h | 10 | ||||
| -rw-r--r-- | lldb/include/lldb/Target/ThreadPlanStepOverRange.h | 9 | ||||
| -rw-r--r-- | lldb/include/lldb/Target/ThreadPlanStepRange.h | 19 | ||||
| -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 |
6 files changed, 70 insertions, 23 deletions
diff --git a/lldb/include/lldb/Target/ThreadPlanStepInRange.h b/lldb/include/lldb/Target/ThreadPlanStepInRange.h index 2e105543d50..641a04b3521 100644 --- a/lldb/include/lldb/Target/ThreadPlanStepInRange.h +++ b/lldb/include/lldb/Target/ThreadPlanStepInRange.h @@ -27,6 +27,11 @@ class ThreadPlanStepInRange : public ThreadPlanShouldStopHere { public: + ThreadPlanStepInRange (Thread &thread, + const AddressRange &range, + const SymbolContext &addr_context, + lldb::RunMode stop_others); + virtual ~ThreadPlanStepInRange (); @@ -46,11 +51,6 @@ public: protected: - ThreadPlanStepInRange (Thread &thread, - const AddressRange &range, - const SymbolContext &addr_context, - lldb::RunMode stop_others); - virtual void SetFlagsToDefault (); diff --git a/lldb/include/lldb/Target/ThreadPlanStepOverRange.h b/lldb/include/lldb/Target/ThreadPlanStepOverRange.h index 79b01cd3966..8190b81d14f 100644 --- a/lldb/include/lldb/Target/ThreadPlanStepOverRange.h +++ b/lldb/include/lldb/Target/ThreadPlanStepOverRange.h @@ -24,6 +24,13 @@ namespace lldb_private { class ThreadPlanStepOverRange : public ThreadPlanStepRange { public: + + ThreadPlanStepOverRange (Thread &thread, + const AddressRange &range, + const SymbolContext &addr_context, + lldb::RunMode stop_others, + bool okay_to_discard = false); + virtual ~ThreadPlanStepOverRange (); virtual void GetDescription (Stream *s, lldb::DescriptionLevel level); @@ -36,8 +43,6 @@ public: protected: - ThreadPlanStepOverRange (Thread &thread, const AddressRange &range, const SymbolContext &addr_context, lldb::RunMode stop_others, bool okay_to_discard = false); - private: friend ThreadPlan * diff --git a/lldb/include/lldb/Target/ThreadPlanStepRange.h b/lldb/include/lldb/Target/ThreadPlanStepRange.h index 899d84b31bd..dd3359f3bf4 100644 --- a/lldb/include/lldb/Target/ThreadPlanStepRange.h +++ b/lldb/include/lldb/Target/ThreadPlanStepRange.h @@ -25,6 +25,13 @@ namespace lldb_private { class ThreadPlanStepRange : public ThreadPlan { public: + ThreadPlanStepRange (ThreadPlanKind kind, + const char *name, + Thread &thread, + const AddressRange &range, + const SymbolContext &addr_context, + lldb::RunMode stop_others); + virtual ~ThreadPlanStepRange (); virtual void GetDescription (Stream *s, lldb::DescriptionLevel level) = 0; @@ -37,22 +44,18 @@ public: virtual bool WillStop (); virtual bool MischiefManaged (); -protected: + void AddRange(const AddressRange &new_range); - ThreadPlanStepRange (ThreadPlanKind kind, - const char *name, - Thread &thread, - const AddressRange &range, - const SymbolContext &addr_context, - lldb::RunMode stop_others); +protected: bool InRange(); bool FrameIsYounger(); bool FrameIsOlder(); bool InSymbol(); + void DumpRanges (Stream *s); SymbolContext m_addr_context; - AddressRange m_address_range; + std::vector<AddressRange> m_address_ranges; lldb::RunMode m_stop_others; uint32_t m_stack_depth; StackID m_stack_id; // Use the stack ID so we can tell step out from step in. 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, |

