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
diff --git a/lldb/include/lldb/Target/ThreadPlanStepInRange.h b/lldb/include/lldb/Target/ThreadPlanStepInRange.h
index 2e10554..641a04b 100644
--- a/lldb/include/lldb/Target/ThreadPlanStepInRange.h
+++ b/lldb/include/lldb/Target/ThreadPlanStepInRange.h
@@ -27,6 +27,11 @@
public ThreadPlanShouldStopHere
{
public:
+ ThreadPlanStepInRange (Thread &thread,
+ const AddressRange &range,
+ const SymbolContext &addr_context,
+ lldb::RunMode stop_others);
+
virtual
~ThreadPlanStepInRange ();
@@ -46,11 +51,6 @@
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 79b01cd..8190b81 100644
--- a/lldb/include/lldb/Target/ThreadPlanStepOverRange.h
+++ b/lldb/include/lldb/Target/ThreadPlanStepOverRange.h
@@ -24,6 +24,13 @@
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 @@
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 899d84b..dd3359f 100644
--- a/lldb/include/lldb/Target/ThreadPlanStepRange.h
+++ b/lldb/include/lldb/Target/ThreadPlanStepRange.h
@@ -25,6 +25,13 @@
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 @@
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 28cd8b8..9d3bd24 100644
--- a/lldb/source/Target/ThreadPlanStepInRange.cpp
+++ b/lldb/source/Target/ThreadPlanStepInRange.cpp
@@ -63,7 +63,7 @@
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 adade55..57ea97b 100644
--- a/lldb/source/Target/ThreadPlanStepOverRange.cpp
+++ b/lldb/source/Target/ThreadPlanStepOverRange.cpp
@@ -58,7 +58,7 @@
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 7dc1b7d..3e87ffe 100644
--- a/lldb/source/Target/ThreadPlanStepRange.cpp
+++ b/lldb/source/Target/ThreadPlanStepRange.cpp
@@ -41,13 +41,14 @@
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 @@
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 @@
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 @@
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 @@
// 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,