summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJim Ingham <jingham@apple.com>2011-10-15 00:24:48 +0000
committerJim Ingham <jingham@apple.com>2011-10-15 00:24:48 +0000
commitc4c9fedc72272918d0c3bc26946b980af2d80f11 (patch)
tree5302bdd2ba2d5d6ecae34f1903216da9961c5a71
parent10c4b249fc33d1792dd5da03af1754078af8d68a (diff)
downloadbcm5719-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.h10
-rw-r--r--lldb/include/lldb/Target/ThreadPlanStepOverRange.h9
-rw-r--r--lldb/include/lldb/Target/ThreadPlanStepRange.h19
-rw-r--r--lldb/source/Target/ThreadPlanStepInRange.cpp2
-rw-r--r--lldb/source/Target/ThreadPlanStepOverRange.cpp2
-rw-r--r--lldb/source/Target/ThreadPlanStepRange.cpp51
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,
OpenPOWER on IntegriCloud