summaryrefslogtreecommitdiffstats
path: root/lldb/source/Target/Thread.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Target/Thread.cpp')
-rw-r--r--lldb/source/Target/Thread.cpp198
1 files changed, 24 insertions, 174 deletions
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