summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/include/lldb/Target/StackFrameList.h41
-rw-r--r--lldb/include/lldb/Target/Thread.h25
-rw-r--r--lldb/include/lldb/lldb-forward-rtti.h1
-rw-r--r--lldb/source/Target/StackFrameList.cpp273
-rw-r--r--lldb/source/Target/Thread.cpp198
5 files changed, 306 insertions, 232 deletions
diff --git a/lldb/include/lldb/Target/StackFrameList.h b/lldb/include/lldb/Target/StackFrameList.h
index 678bff5a3d8..97bbce258c1 100644
--- a/lldb/include/lldb/Target/StackFrameList.h
+++ b/lldb/include/lldb/Target/StackFrameList.h
@@ -28,19 +28,16 @@ public:
//------------------------------------------------------------------
// Constructors and Destructors
//------------------------------------------------------------------
- StackFrameList();
+ StackFrameList (Thread &thread, bool show_inline_frames);
virtual
~StackFrameList();
uint32_t
- GetNumFrames() const;
+ GetNumFrames();
lldb::StackFrameSP
- GetFrameAtIndex (uint32_t idx) const;
-
- bool
- SetFrameAtIndex (uint32_t idx, lldb::StackFrameSP &frame_sp);
+ GetFrameAtIndex (uint32_t idx);
// Mark a stack frame as the current frame
uint32_t
@@ -56,15 +53,31 @@ public:
void
Clear ();
- // After we have determined the number of frames, we can set the count here
- // and have the frame info be generated on demand.
- void
- SetNumFrames(uint32_t count);
-
void
InvalidateFrames (uint32_t start_idx);
protected:
+ bool
+ SetActualFrameAtIndex (uint32_t idx, lldb::StackFrameSP &frame_sp);
+
+ bool
+ SetInlineFrameAtIndex (uint32_t idx, lldb::StackFrameSP &frame_sp);
+
+
+ lldb::StackFrameSP
+ GetActualFrameAtIndex (uint32_t idx) const;
+
+ lldb::StackFrameSP
+ GetInlineFrameAtIndex (uint32_t idx) const;
+
+ typedef struct InlinedFrameInfo
+ {
+ uint32_t concrete_frame_index;
+ uint32_t inline_height;
+ Block *block;
+ } InlinedFrameInfo;
+ typedef std::vector<InlinedFrameInfo> InlinedFrameInfoCollection;
+
//------------------------------------------------------------------
// Classes that inherit from StackFrameList can see and modify these
//------------------------------------------------------------------
@@ -72,9 +85,13 @@ protected:
typedef collection::iterator iterator;
typedef collection::const_iterator const_iterator;
+ Thread &m_thread;
mutable Mutex m_mutex;
- collection m_frames;
+ collection m_actual_frames;
+ collection m_inline_frames;
+ InlinedFrameInfoCollection m_inlined_frame_info;
uint32_t m_current_frame_idx;
+ bool m_show_inlined_frames;
private:
//------------------------------------------------------------------
diff --git a/lldb/include/lldb/Target/Thread.h b/lldb/include/lldb/Target/Thread.h
index 2bd5f4bdfaf..2f7a819baa2 100644
--- a/lldb/include/lldb/Target/Thread.h
+++ b/lldb/include/lldb/Target/Thread.h
@@ -198,12 +198,7 @@ public:
CreateRegisterContextForFrame (StackFrame *frame) = 0;
virtual void
- ClearStackFrames ()
- {
- m_concrete_frames.Clear();
- m_inlined_frames.Clear();
- m_inlined_frame_info.clear();
- }
+ ClearStackFrames ();
void
DumpInfo (Stream &strm,
@@ -522,6 +517,7 @@ public:
protected:
friend class ThreadPlan;
+ friend class StackFrameList;
void
PushPlan (lldb::ThreadPlanSP &plan_sp);
@@ -542,13 +538,9 @@ protected:
virtual lldb_private::Unwind *
GetUnwinder () = 0;
- typedef struct InlinedFrameInfo
- {
- uint32_t concrete_frame_index;
- uint32_t inline_height;
- Block *block;
- } InlinedFrameInfo;
- typedef std::vector<InlinedFrameInfo> InlinedFrameInfoCollection;
+ StackFrameList &
+ GetStackFrameList ();
+
//------------------------------------------------------------------
// Classes that inherit from Process can see and modify these
//------------------------------------------------------------------
@@ -558,15 +550,12 @@ protected:
const uint32_t m_index_id; ///< A unique 1 based index assigned to each thread for easy UI/command line access.
lldb::RegisterContextSP m_reg_context_sp; ///< The register context for this thread's current register state.
lldb::StateType m_state; ///< The state of our process.
+ mutable Mutex m_state_mutex; ///< Multithreaded protection for m_state.
plan_stack m_plan_stack; ///< The stack of plans this thread is executing.
plan_stack m_immediate_plan_stack; ///< The plans that need to get executed before any other work gets done.
plan_stack m_completed_plan_stack; ///< Plans that have been completed by this stop. They get deleted when the thread resumes.
plan_stack m_discarded_plan_stack; ///< Plans that have been discarded by this stop. They get deleted when the thread resumes.
- mutable Mutex m_state_mutex; ///< Multithreaded protection for m_state.
- StackFrameList m_concrete_frames; ///< The stack frames that get lazily populated after a thread stops.
- StackFrameList m_inlined_frames; ///< The stack frames that get lazily populated after a thread stops.
- InlinedFrameInfoCollection m_inlined_frame_info;
- bool m_show_inlined_frames;
+ lldb::StackFrameListSP m_frames_sp; ///< The stack frames that get lazily populated after a thread stops.
int m_resume_signal; ///< The signal that should be used when continuing this thread.
lldb::StateType m_resume_state; ///< The state that indicates what this thread should do when the process is resumed.
std::auto_ptr<lldb_private::Unwind> m_unwinder_ap;
diff --git a/lldb/include/lldb/lldb-forward-rtti.h b/lldb/include/lldb/lldb-forward-rtti.h
index c372be46017..8841322a156 100644
--- a/lldb/include/lldb/lldb-forward-rtti.h
+++ b/lldb/include/lldb/lldb-forward-rtti.h
@@ -49,6 +49,7 @@ namespace lldb {
typedef SharedPtr<lldb_private::Section>::Type SectionSP;
typedef SharedPtr<lldb_private::SearchFilter>::Type SearchFilterSP;
typedef SharedPtr<lldb_private::StackFrame>::Type StackFrameSP;
+ typedef SharedPtr<lldb_private::StackFrameList>::Type StackFrameListSP;
typedef SharedPtr<lldb_private::StateVariable>::Type StateVariableSP;
typedef SharedPtr<lldb_private::StopInfo>::Type StopInfoSP;
typedef SharedPtr<lldb_private::StoppointLocation>::Type StoppointLocationSP;
diff --git a/lldb/source/Target/StackFrameList.cpp b/lldb/source/Target/StackFrameList.cpp
index 8615f714673..1ebe8a4ae78 100644
--- a/lldb/source/Target/StackFrameList.cpp
+++ b/lldb/source/Target/StackFrameList.cpp
@@ -7,12 +7,18 @@
//
//===----------------------------------------------------------------------===//
+#include "lldb/Target/StackFrameList.h"
+
// C Includes
// C++ Includes
// Other libraries and framework includes
// Project includes
-#include "lldb/Target/StackFrameList.h"
+#include "lldb/Symbol/Block.h"
+#include "lldb/Symbol/Function.h"
+#include "lldb/Target/RegisterContext.h"
#include "lldb/Target/StackFrame.h"
+#include "lldb/Target/Thread.h"
+#include "lldb/Target/Unwind.h"
using namespace lldb;
using namespace lldb_private;
@@ -20,9 +26,12 @@ using namespace lldb_private;
//----------------------------------------------------------------------
// StackFrameList constructor
//----------------------------------------------------------------------
-StackFrameList::StackFrameList() :
+StackFrameList::StackFrameList(Thread &thread, bool show_inline_frames) :
+ m_thread (thread),
+ m_show_inlined_frames (show_inline_frames),
m_mutex (Mutex::eMutexTypeRecursive),
- m_frames (),
+ m_actual_frames (),
+ m_inline_frames (),
m_current_frame_idx (0)
{
}
@@ -36,43 +45,242 @@ StackFrameList::~StackFrameList()
uint32_t
-StackFrameList::GetNumFrames() const
+StackFrameList::GetNumFrames()
{
Mutex::Locker locker (m_mutex);
- return m_frames.size();
+
+ if (m_show_inlined_frames)
+ {
+ if (m_inlined_frame_info.empty())
+ {
+ Unwind *unwinder = m_thread.GetUnwinder ();
+ // If we are going to show inlined stack frames as actual frames,
+ // we need to calculate all concrete frames first, then iterate
+ // through all of them and count up how many inlined functions are
+ // in each frame. We can then fill in m_inlined_frame_info with
+ // the concrete frame index and inlined depth
+ const uint32_t concrete_frame_count = unwinder->GetFrameCount();
+
+ addr_t pc, cfa;
+ InlinedFrameInfo inlined_frame_info;
+
+ StackFrameSP frame_sp;
+ for (uint32_t idx=0; idx<concrete_frame_count; ++idx)
+ {
+ if (idx == 0)
+ {
+ m_thread.GetRegisterContext();
+ frame_sp.reset (new StackFrame (0,
+ 0,
+ m_thread,
+ m_thread.m_reg_context_sp,
+ m_thread.m_reg_context_sp->GetSP(),
+ 0,
+ m_thread.m_reg_context_sp->GetPC(),
+ NULL));
+ }
+ else
+ {
+ const bool success = unwinder->GetFrameInfoAtIndex(idx, cfa, pc);
+ assert (success);
+ frame_sp.reset (new StackFrame (m_inlined_frame_info.size(), idx, m_thread, cfa, 0, pc, NULL));
+ }
+ SetActualFrameAtIndex (idx, frame_sp);
+ Block *block = frame_sp->GetSymbolContext (eSymbolContextBlock).block;
+
+ inlined_frame_info.concrete_frame_index = idx;
+ inlined_frame_info.inline_height = 0;
+ inlined_frame_info.block = block;
+ m_inlined_frame_info.push_back (inlined_frame_info);
+
+ if (block)
+ {
+ Block *inlined_block;
+ if (block->InlinedFunctionInfo())
+ inlined_block = block;
+ else
+ inlined_block = block->GetInlinedParent ();
+
+ while (inlined_block)
+ {
+ inlined_frame_info.block = inlined_block;
+ inlined_frame_info.inline_height++;
+ m_inlined_frame_info.push_back (inlined_frame_info);
+ inlined_block = inlined_block->GetInlinedParent ();
+ }
+ }
+ }
+ }
+ return m_inlined_frame_info.size();
+ }
+ else
+ {
+ if (m_actual_frames.empty())
+ m_actual_frames.resize(m_thread.GetUnwinder()->GetFrameCount());
+
+ return m_actual_frames.size();
+ }
+ return 0;
}
-// After we have determined the number of frames, we can set the count here
-// and have the frame info be generated on demand.
-void
-StackFrameList::SetNumFrames(uint32_t count)
+lldb::StackFrameSP
+StackFrameList::GetActualFrameAtIndex (uint32_t idx) const
{
- Mutex::Locker locker (m_mutex);
- return m_frames.resize(count);
+ StackFrameSP frame_sp;
+ if (idx < m_actual_frames.size())
+ frame_sp = m_actual_frames[idx];
+ return frame_sp;
+}
+
+lldb::StackFrameSP
+StackFrameList::GetInlineFrameAtIndex (uint32_t idx) const
+{
+ StackFrameSP frame_sp;
+ if (idx < m_inline_frames.size())
+ frame_sp = m_inline_frames[idx];
+ return frame_sp;
}
+
StackFrameSP
-StackFrameList::GetFrameAtIndex (uint32_t idx) const
+StackFrameList::GetFrameAtIndex (uint32_t idx)
{
StackFrameSP frame_sp;
{
Mutex::Locker locker (m_mutex);
- if (idx < m_frames.size())
- frame_sp = m_frames[idx];
+
+ if (m_show_inlined_frames)
+ {
+ frame_sp = GetInlineFrameAtIndex (idx);
+ }
+ else
+ {
+ frame_sp = GetActualFrameAtIndex (idx);
+ }
+
+ if (frame_sp.get())
+ return frame_sp;
+
+ // Special case the first frame (idx == 0) so that we don't need to
+ // know how many stack frames there are to get it. If we need any other
+ // frames, then we do need to know if "idx" is a valid index.
+ if (idx == 0)
+ {
+ // If this is the first frame, we want to share the thread register
+ // context with the stack frame at index zero.
+ m_thread.GetRegisterContext();
+ assert (m_thread.m_reg_context_sp.get());
+ frame_sp.reset (new StackFrame (0,
+ 0,
+ m_thread,
+ m_thread.m_reg_context_sp,
+ m_thread.m_reg_context_sp->GetSP(),
+ 0,
+ m_thread.m_reg_context_sp->GetPC(),
+ NULL));
+ }
+ else if (idx < GetNumFrames())
+ {
+ if (m_show_inlined_frames)
+ {
+ if (m_inlined_frame_info[idx].inline_height == 0)
+ {
+ // Same as the concrete stack frame if block is NULL
+ assert (m_inlined_frame_info[idx].concrete_frame_index < m_actual_frames.size());
+ frame_sp = GetActualFrameAtIndex (m_inlined_frame_info[idx].concrete_frame_index);
+ }
+ else
+ {
+ // We have blocks that were above an inlined function. Inlined
+ // functions are represented as blocks with non-NULL inline
+ // function info. Here we must reconstruct a frame by looking
+ // at the block
+ StackFrameSP previous_frame_sp (m_thread.GetStackFrameAtIndex (idx-1));
+
+ SymbolContext inline_sc;
+
+ Block *inlined_parent_block = m_inlined_frame_info[idx].block->GetInlinedParent();
+
+ if (inlined_parent_block)
+ inlined_parent_block->CalculateSymbolContext (&inline_sc);
+ else
+ {
+ Block *parent_block = m_inlined_frame_info[idx].block->GetParent();
+ parent_block->CalculateSymbolContext(&inline_sc);
+ }
+
+ Address previous_frame_lookup_addr (previous_frame_sp->GetFrameCodeAddress());
+ if (previous_frame_sp->IsConcrete () && previous_frame_sp->GetFrameIndex() > 0)
+ previous_frame_lookup_addr.Slide (-1);
+
+ AddressRange range;
+ m_inlined_frame_info[idx].block->GetRangeContainingAddress (previous_frame_lookup_addr, range);
+
+ const InlineFunctionInfo* inline_info = m_inlined_frame_info[idx].block->InlinedFunctionInfo();
+ assert (inline_info);
+ inline_sc.line_entry.range.GetBaseAddress() = previous_frame_sp->GetFrameCodeAddress();
+ inline_sc.line_entry.file = inline_info->GetCallSite().GetFile();
+ inline_sc.line_entry.line = inline_info->GetCallSite().GetLine();
+ inline_sc.line_entry.column = inline_info->GetCallSite().GetColumn();
+
+ StackFrameSP concrete_frame_sp (GetActualFrameAtIndex (m_inlined_frame_info[idx].concrete_frame_index));
+ assert (previous_frame_sp.get());
+
+ frame_sp.reset (new StackFrame (idx,
+ m_inlined_frame_info[idx].concrete_frame_index,
+ m_thread,
+ concrete_frame_sp->GetRegisterContextSP (),
+ concrete_frame_sp->GetStackID().GetCallFrameAddress(), // CFA
+ m_inlined_frame_info[idx].inline_height, // Inline height
+ range.GetBaseAddress(),
+ &inline_sc)); // The symbol context for this inline frame
+
+ }
+ }
+ else
+ {
+ Unwind *unwinder = m_thread.GetUnwinder ();
+ if (unwinder)
+ {
+ addr_t pc, cfa;
+ if (unwinder->GetFrameInfoAtIndex(idx, cfa, pc))
+ frame_sp.reset (new StackFrame (idx, idx, m_thread, cfa, 0, pc, NULL));
+ }
+ }
+ }
+ if (m_show_inlined_frames)
+ SetInlineFrameAtIndex(idx, frame_sp);
+ else
+ SetActualFrameAtIndex(idx, frame_sp);
+ return frame_sp;
+
}
return frame_sp;
}
bool
-StackFrameList::SetFrameAtIndex (uint32_t idx, StackFrameSP &frame_sp)
+StackFrameList::SetActualFrameAtIndex (uint32_t idx, StackFrameSP &frame_sp)
{
- Mutex::Locker locker (m_mutex);
- if (idx >= m_frames.size())
- m_frames.resize(idx + 1);
+ if (idx >= m_actual_frames.size())
+ m_actual_frames.resize(idx + 1);
// Make sure allocation succeeded by checking bounds again
- if (idx < m_frames.size())
+ if (idx < m_actual_frames.size())
{
- m_frames[idx] = frame_sp;
+ m_actual_frames[idx] = frame_sp;
+ return true;
+ }
+ return false; // resize failed, out of memory?
+}
+
+bool
+StackFrameList::SetInlineFrameAtIndex (uint32_t idx, StackFrameSP &frame_sp)
+{
+ if (idx >= m_inline_frames.size())
+ m_inline_frames.resize(idx + 1);
+ // Make sure allocation succeeded by checking bounds again
+ if (idx < m_inline_frames.size())
+ {
+ m_inline_frames[idx] = frame_sp;
return true;
}
return false; // resize failed, out of memory?
@@ -90,9 +298,9 @@ uint32_t
StackFrameList::SetCurrentFrame (lldb_private::StackFrame *frame)
{
Mutex::Locker locker (m_mutex);
- const_iterator pos,
- begin = m_frames.begin(),
- end = m_frames.end();
+ const_iterator pos;
+ const_iterator begin = m_show_inlined_frames ? m_inline_frames.begin() : m_actual_frames.begin();
+ const_iterator end = m_show_inlined_frames ? m_inline_frames.end() : m_actual_frames.end();
for (pos = begin; pos != end; ++pos)
{
if (pos->get() == frame)
@@ -119,17 +327,26 @@ void
StackFrameList::Clear ()
{
Mutex::Locker locker (m_mutex);
- m_frames.clear();
+ m_actual_frames.clear();
+ m_inline_frames.clear();
+ m_inlined_frame_info.clear();
}
void
StackFrameList::InvalidateFrames (uint32_t start_idx)
{
Mutex::Locker locker (m_mutex);
- size_t num_frames = m_frames.size();
- while (start_idx < num_frames)
+ if (m_show_inlined_frames)
+ {
+ Clear();
+ }
+ else
{
- m_frames[start_idx].reset();
- ++start_idx;
+ const size_t num_frames = m_actual_frames.size();
+ while (start_idx < num_frames)
+ {
+ m_actual_frames[start_idx].reset();
+ ++start_idx;
+ }
}
}
diff --git a/lldb/source/Target/Thread.cpp b/lldb/source/Target/Thread.cpp
index 1f70adafd73..97dd52f8c5f 100644
--- a/lldb/source/Target/Thread.cpp
+++ b/lldb/source/Target/Thread.cpp
@@ -45,14 +45,11 @@ Thread::Thread (Process &process, lldb::tid_t tid) :
m_index_id (process.GetNextThreadIndexID ()),
m_reg_context_sp (),
m_state (eStateUnloaded),
+ m_state_mutex (Mutex::eMutexTypeRecursive),
m_plan_stack (),
m_immediate_plan_stack(),
m_completed_plan_stack(),
- m_state_mutex (Mutex::eMutexTypeRecursive),
- m_concrete_frames (),
- m_inlined_frames (),
- m_inlined_frame_info (),
- m_show_inlined_frames (true),
+ m_frames_sp (),
m_resume_signal (LLDB_INVALID_SIGNAL_NUMBER),
m_resume_state (eStateRunning),
m_unwinder_ap ()
@@ -795,200 +792,53 @@ Thread::Calculate (ExecutionContext &exe_ctx)
exe_ctx.frame = NULL;
}
+
+StackFrameList &
+Thread::GetStackFrameList ()
+{
+ if (m_frames_sp.get() == NULL)
+ m_frames_sp.reset (new StackFrameList (*this, true));
+ return *m_frames_sp;
+}
+
+
+
uint32_t
Thread::GetStackFrameCount()
{
- Unwind *unwinder = GetUnwinder ();
- if (unwinder)
- {
- if (m_show_inlined_frames)
- {
- if (m_inlined_frame_info.empty())
- {
- // If we are going to show inlined stack frames as actual frames,
- // we need to calculate all concrete frames first, then iterate
- // through all of them and count up how many inlined functions are
- // in each frame. We can then fill in m_inlined_frame_info with
- // the concrete frame index and inlined depth
- const uint32_t concrete_frame_count = unwinder->GetFrameCount();
-
- addr_t pc, cfa;
- InlinedFrameInfo inlined_frame_info;
-
- StackFrameSP frame_sp;
- for (uint32_t idx=0; idx<concrete_frame_count; ++idx)
- {
- if (idx == 0)
- {
- GetRegisterContext();
- assert (m_reg_context_sp.get());
- frame_sp.reset (new StackFrame (0, 0, *this, m_reg_context_sp, m_reg_context_sp->GetSP(), 0, m_reg_context_sp->GetPC(), NULL));
- }
- else
- {
- const bool success = unwinder->GetFrameInfoAtIndex(idx, cfa, pc);
- assert (success);
- frame_sp.reset (new StackFrame (m_inlined_frame_info.size(), idx, *this, cfa, 0, pc, NULL));
- }
- m_concrete_frames.SetFrameAtIndex(idx, frame_sp);
- Block *block = frame_sp->GetSymbolContext (eSymbolContextBlock).block;
+ return GetStackFrameList().GetNumFrames();
+}
- inlined_frame_info.concrete_frame_index = idx;
- inlined_frame_info.inline_height = 0;
- inlined_frame_info.block = block;
- m_inlined_frame_info.push_back (inlined_frame_info);
- if (block)
- {
- Block *inlined_block;
- if (block->InlinedFunctionInfo())
- inlined_block = block;
- else
- inlined_block = block->GetInlinedParent ();
-
- while (inlined_block)
- {
- inlined_frame_info.block = inlined_block;
- inlined_frame_info.inline_height++;
- m_inlined_frame_info.push_back (inlined_frame_info);
- inlined_block = inlined_block->GetInlinedParent ();
- }
- }
- }
- }
- return m_inlined_frame_info.size();
- }
- else
- {
- return unwinder->GetFrameCount();
- }
- }
- return 0;
+void
+Thread::ClearStackFrames ()
+{
+ if (m_frames_sp)
+ m_frames_sp->Clear();
}
lldb::StackFrameSP
Thread::GetStackFrameAtIndex (uint32_t idx)
{
-
- StackFrameSP frame_sp;
-
- if (m_show_inlined_frames)
- frame_sp = m_inlined_frames.GetFrameAtIndex(idx);
- else
- frame_sp = m_concrete_frames.GetFrameAtIndex(idx);
-
- if (frame_sp.get())
- return frame_sp;
-
- // Don't try and fetch a frame while process is running
-// FIXME: This check isn't right because IsRunning checks the Public state, but this
-// is work you need to do - for instance in ShouldStop & friends - before the public
-// state has been changed.
-// if (m_process.IsRunning())
-// return frame_sp;
-
- // Special case the first frame (idx == 0) so that we don't need to
- // know how many stack frames there are to get it. If we need any other
- // frames, then we do need to know if "idx" is a valid index.
- if (idx == 0)
- {
- // If this is the first frame, we want to share the thread register
- // context with the stack frame at index zero.
- GetRegisterContext();
- assert (m_reg_context_sp.get());
- frame_sp.reset (new StackFrame (0, 0, *this, m_reg_context_sp, m_reg_context_sp->GetSP(), 0, m_reg_context_sp->GetPC(), NULL));
- }
- else if (idx < GetStackFrameCount())
- {
- if (m_show_inlined_frames)
- {
- if (m_inlined_frame_info[idx].inline_height == 0)
- {
- // Same as the concrete stack frame if block is NULL
- frame_sp = m_concrete_frames.GetFrameAtIndex (m_inlined_frame_info[idx].concrete_frame_index);
- }
- else
- {
- // We have blocks that were above an inlined function. Inlined
- // functions are represented as blocks with non-NULL inline
- // function info. Here we must reconstruct a frame by looking
- // at the block
- StackFrameSP previous_frame_sp (GetStackFrameAtIndex (idx-1));
-
- SymbolContext inline_sc;
-
- Block *inlined_parent_block = m_inlined_frame_info[idx].block->GetInlinedParent();
-
- if (inlined_parent_block)
- inlined_parent_block->CalculateSymbolContext (&inline_sc);
- else
- {
- Block *parent_block = m_inlined_frame_info[idx].block->GetParent();
- parent_block->CalculateSymbolContext(&inline_sc);
- }
-
- Address previous_frame_lookup_addr (previous_frame_sp->GetFrameCodeAddress());
- if (previous_frame_sp->IsConcrete () && previous_frame_sp->GetFrameIndex() > 0)
- previous_frame_lookup_addr.Slide (-1);
-
- AddressRange range;
- m_inlined_frame_info[idx].block->GetRangeContainingAddress (previous_frame_lookup_addr, range);
-
- const InlineFunctionInfo* inline_info = m_inlined_frame_info[idx].block->InlinedFunctionInfo();
- assert (inline_info);
- inline_sc.line_entry.range.GetBaseAddress() = previous_frame_sp->GetFrameCodeAddress();
- inline_sc.line_entry.file = inline_info->GetCallSite().GetFile();
- inline_sc.line_entry.line = inline_info->GetCallSite().GetLine();
- inline_sc.line_entry.column = inline_info->GetCallSite().GetColumn();
-
- StackFrameSP concrete_frame_sp (m_concrete_frames.GetFrameAtIndex (m_inlined_frame_info[idx].concrete_frame_index));
- assert (previous_frame_sp.get());
-
- frame_sp.reset (new StackFrame (idx,
- m_inlined_frame_info[idx].concrete_frame_index,
- *this,
- concrete_frame_sp->GetRegisterContextSP (),
- concrete_frame_sp->GetStackID().GetCallFrameAddress(), // CFA
- m_inlined_frame_info[idx].inline_height, // Inline height
- range.GetBaseAddress(),
- &inline_sc)); // The symbol context for this inline frame
-
- }
- }
- else
- {
- Unwind *unwinder = GetUnwinder ();
- if (unwinder)
- {
- addr_t pc, cfa;
- if (unwinder->GetFrameInfoAtIndex(idx, cfa, pc))
- frame_sp.reset (new StackFrame (idx, idx, *this, cfa, 0, pc, NULL));
- }
- }
- }
- if (m_show_inlined_frames)
- m_inlined_frames.SetFrameAtIndex(idx, frame_sp);
- else
- m_concrete_frames.SetFrameAtIndex(idx, frame_sp);
- return frame_sp;
+ return StackFrameSP (GetStackFrameList().GetFrameAtIndex(idx));
}
lldb::StackFrameSP
Thread::GetCurrentFrame ()
{
- return GetStackFrameAtIndex (m_concrete_frames.GetCurrentFrameIndex());
+ return GetStackFrameAtIndex (GetStackFrameList().GetCurrentFrameIndex());
}
uint32_t
Thread::SetCurrentFrame (lldb_private::StackFrame *frame)
{
- return m_concrete_frames.SetCurrentFrame(frame);
+ return GetStackFrameList().SetCurrentFrame(frame);
}
void
Thread::SetCurrentFrameByIndex (uint32_t idx)
{
- m_concrete_frames.SetCurrentFrameByIndex(idx);
+ GetStackFrameList().SetCurrentFrameByIndex(idx);
}
void
OpenPOWER on IntegriCloud