diff options
-rwxr-xr-x | lldb/examples/python/symbolicate-crash.py | 4 | ||||
-rw-r--r-- | lldb/include/lldb/API/SBSymbolContext.h | 5 | ||||
-rw-r--r-- | lldb/include/lldb/Core/Broadcaster.h | 3 | ||||
-rw-r--r-- | lldb/include/lldb/Symbol/Block.h | 7 | ||||
-rw-r--r-- | lldb/include/lldb/Symbol/SymbolContext.h | 27 | ||||
-rw-r--r-- | lldb/scripts/Python/interface/SBSymbolContext.i | 5 | ||||
-rw-r--r-- | lldb/source/API/SBSymbolContext.cpp | 7 | ||||
-rw-r--r-- | lldb/source/Commands/CommandObjectTarget.cpp | 3 | ||||
-rw-r--r-- | lldb/source/Core/Broadcaster.cpp | 30 | ||||
-rw-r--r-- | lldb/source/Core/Debugger.cpp | 1 | ||||
-rw-r--r-- | lldb/source/Core/Listener.cpp | 2 | ||||
-rw-r--r-- | lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp | 5 | ||||
-rw-r--r-- | lldb/source/Symbol/Block.cpp | 89 | ||||
-rw-r--r-- | lldb/source/Symbol/SymbolContext.cpp | 135 | ||||
-rw-r--r-- | lldb/source/Target/Process.cpp | 3 | ||||
-rw-r--r-- | lldb/source/Target/StackFrameList.cpp | 62 |
16 files changed, 136 insertions, 252 deletions
diff --git a/lldb/examples/python/symbolicate-crash.py b/lldb/examples/python/symbolicate-crash.py index 6afd9e1eb9a..c7972abec9d 100755 --- a/lldb/examples/python/symbolicate-crash.py +++ b/lldb/examples/python/symbolicate-crash.py @@ -399,7 +399,7 @@ if __name__ == '__main__': # inlined, it will return a valid symbol context for the parent # frame of the current inlined function parent_pc_addr = lldb.SBAddress() - new_frame.sym_ctx = frame.sym_ctx.GetParentInlinedFrameInfo (pc_addr, True, parent_pc_addr) + new_frame.sym_ctx = frame.sym_ctx.GetParentOfInlinedScope (pc_addr, parent_pc_addr) # See if we were able to reconstruct anything? while new_frame.sym_ctx: @@ -419,7 +419,7 @@ if __name__ == '__main__': new_frame = CrashLog.Frame (frame.index, -1, None) # Swap the addresses so we can try another inlined lookup pc_addr = parent_pc_addr; - new_frame.sym_ctx = prev_new_frame.sym_ctx.GetParentInlinedFrameInfo (pc_addr, False, parent_pc_addr) + new_frame.sym_ctx = prev_new_frame.sym_ctx.GetParentOfInlinedScope (pc_addr, parent_pc_addr) # Replace our thread frames with our new list that includes parent # frames for inlined functions thread.frames = new_thread_frames diff --git a/lldb/include/lldb/API/SBSymbolContext.h b/lldb/include/lldb/API/SBSymbolContext.h index b93db5dc648..a678b6733ed 100644 --- a/lldb/include/lldb/API/SBSymbolContext.h +++ b/lldb/include/lldb/API/SBSymbolContext.h @@ -52,9 +52,8 @@ public: void SetSymbol (lldb::SBSymbol symbol); SBSymbolContext - GetParentInlinedFrameInfo (const SBAddress &curr_frame_pc, - bool is_concrete_frame, - SBAddress &parent_frame_addr) const; + GetParentOfInlinedScope (const SBAddress &curr_frame_pc, + SBAddress &parent_frame_addr) const; bool GetDescription (lldb::SBStream &description); diff --git a/lldb/include/lldb/Core/Broadcaster.h b/lldb/include/lldb/Core/Broadcaster.h index 8eea00baccc..0dff7e8b868 100644 --- a/lldb/include/lldb/Core/Broadcaster.h +++ b/lldb/include/lldb/Core/Broadcaster.h @@ -104,6 +104,9 @@ public: void BroadcastEventIfUnique (uint32_t event_type, EventData *event_data = NULL); + void + Clear(); + virtual void AddInitialEventsToListener (Listener *listener, uint32_t requested_events); diff --git a/lldb/include/lldb/Symbol/Block.h b/lldb/include/lldb/Symbol/Block.h index dcad6caa8aa..34465ebc788 100644 --- a/lldb/include/lldb/Symbol/Block.h +++ b/lldb/include/lldb/Symbol/Block.h @@ -181,13 +181,6 @@ public: void Dump (Stream *s, lldb::addr_t base_addr, int32_t depth, bool show_context) const; - void - DumpStopContext (Stream *s, - const SymbolContext *sc, - const Declaration *child_inline_call_site, - bool show_fullpaths, - bool show_inline_blocks); - //------------------------------------------------------------------ /// @copydoc SymbolContextScope::DumpSymbolContext(Stream*) /// diff --git a/lldb/include/lldb/Symbol/SymbolContext.h b/lldb/include/lldb/Symbol/SymbolContext.h index 4d21b5e068b..a5df5e1be1f 100644 --- a/lldb/include/lldb/Symbol/SymbolContext.h +++ b/lldb/include/lldb/Symbol/SymbolContext.h @@ -284,11 +284,30 @@ public: ConstString GetFunctionName (Mangled::NamePreference preference = Mangled::ePreferDemangled); + //------------------------------------------------------------------ + /// Find the block containing the inlined block that contains this block. + /// + /// For instance, if the symbol context contains an inlined block, + /// it will return the inlined function name. + /// + /// @param[in] curr_frame_pc + /// The address within the block of this object. + /// + /// @param[out] next_frame_sc + /// A new symbol context that does what the title says it does. + /// + /// @param[out] next_frame_addr + /// This is what you should report as the PC in \a next_frame_sc. + /// + /// @return + /// \b true if this SymbolContext specifies a block contained in an + /// inlined block. If this returns \b true, \a next_frame_sc and + /// \a next_frame_addr will be filled in correctly. + //------------------------------------------------------------------ bool - GetParentInlinedFrameInfo (const Address &curr_frame_pc, - bool is_concrete_frame, - SymbolContext &next_frame_sc, - Address &inlined_frame_addr) const; + GetParentOfInlinedScope (const Address &curr_frame_pc, + SymbolContext &next_frame_sc, + Address &inlined_frame_addr) const; //------------------------------------------------------------------ // Member variables diff --git a/lldb/scripts/Python/interface/SBSymbolContext.i b/lldb/scripts/Python/interface/SBSymbolContext.i index 00d80da9892..5f29e8e2c3b 100644 --- a/lldb/scripts/Python/interface/SBSymbolContext.i +++ b/lldb/scripts/Python/interface/SBSymbolContext.i @@ -73,9 +73,8 @@ public: void SetSymbol (lldb::SBSymbol symbol); lldb::SBSymbolContext - GetParentInlinedFrameInfo (const lldb::SBAddress &curr_frame_pc, - bool is_concrete_frame, - lldb::SBAddress &parent_frame_addr) const; + GetParentOfInlinedScope (const lldb::SBAddress &curr_frame_pc, + lldb::SBAddress &parent_frame_addr) const; bool diff --git a/lldb/source/API/SBSymbolContext.cpp b/lldb/source/API/SBSymbolContext.cpp index c2b70fb5166..01118c86483 100644 --- a/lldb/source/API/SBSymbolContext.cpp +++ b/lldb/source/API/SBSymbolContext.cpp @@ -266,14 +266,13 @@ SBSymbolContext::GetDescription (SBStream &description) } SBSymbolContext -SBSymbolContext::GetParentInlinedFrameInfo (const SBAddress &curr_frame_pc, - bool is_concrete_frame, - SBAddress &parent_frame_addr) const +SBSymbolContext::GetParentOfInlinedScope (const SBAddress &curr_frame_pc, + SBAddress &parent_frame_addr) const { SBSymbolContext sb_sc; if (m_opaque_ap.get() && curr_frame_pc.IsValid()) { - if (m_opaque_ap->GetParentInlinedFrameInfo (curr_frame_pc.ref(), is_concrete_frame, sb_sc.ref(), parent_frame_addr.ref())) + if (m_opaque_ap->GetParentOfInlinedScope (curr_frame_pc.ref(), sb_sc.ref(), parent_frame_addr.ref())) return sb_sc; } return SBSymbolContext(); diff --git a/lldb/source/Commands/CommandObjectTarget.cpp b/lldb/source/Commands/CommandObjectTarget.cpp index 4ff540defd7..8933f961453 100644 --- a/lldb/source/Commands/CommandObjectTarget.cpp +++ b/lldb/source/Commands/CommandObjectTarget.cpp @@ -1304,12 +1304,13 @@ LookupAddressInModule strm.EOL(); strm.Indent (" Summary: "); const uint32_t save_indent = strm.GetIndentLevel (); - strm.SetIndentLevel (save_indent + 11); + strm.SetIndentLevel (save_indent + 13); so_addr.Dump (&strm, exe_scope, Address::DumpStyleResolvedDescription); strm.SetIndentLevel (save_indent); // Print out detailed address information when verbose is enabled if (verbose) { + strm.EOL(); so_addr.Dump (&strm, exe_scope, Address::DumpStyleDetailedSymbolContext); } strm.IndentLess(); diff --git a/lldb/source/Core/Broadcaster.cpp b/lldb/source/Core/Broadcaster.cpp index fe1b7164d5d..1d264a6c675 100644 --- a/lldb/source/Core/Broadcaster.cpp +++ b/lldb/source/Core/Broadcaster.cpp @@ -40,22 +40,24 @@ Broadcaster::~Broadcaster() if (log) log->Printf ("%p Broadcaster::~Broadcaster(\"%s\")", this, m_broadcaster_name.AsCString()); - // Scope for "listeners_locker" - { - Mutex::Locker listeners_locker(m_listeners_mutex); - - // Make sure the listener forgets about this broadcaster. We do - // this in the broadcaster in case the broadcaster object initiates - // the removal. - - collection::iterator pos, end = m_listeners.end(); - for (pos = m_listeners.begin(); pos != end; ++pos) - pos->first->BroadcasterWillDestruct (this); - - m_listeners.clear(); - } + Clear(); } +void +Broadcaster::Clear() +{ + Mutex::Locker listeners_locker(m_listeners_mutex); + + // Make sure the listener forgets about this broadcaster. We do + // this in the broadcaster in case the broadcaster object initiates + // the removal. + + collection::iterator pos, end = m_listeners.end(); + for (pos = m_listeners.begin(); pos != end; ++pos) + pos->first->BroadcasterWillDestruct (this); + + m_listeners.clear(); +} const ConstString & Broadcaster::GetBroadcasterName () { diff --git a/lldb/source/Core/Debugger.cpp b/lldb/source/Core/Debugger.cpp index 83c226b7664..583c1caf0f9 100644 --- a/lldb/source/Core/Debugger.cpp +++ b/lldb/source/Core/Debugger.cpp @@ -249,6 +249,7 @@ void Debugger::Clear() { CleanUpInputReaders(); + m_listener.Clear(); int num_targets = m_target_list.GetNumTargets(); for (int i = 0; i < num_targets; i++) { diff --git a/lldb/source/Core/Listener.cpp b/lldb/source/Core/Listener.cpp index b1da3645057..7b0888aac92 100644 --- a/lldb/source/Core/Listener.cpp +++ b/lldb/source/Core/Listener.cpp @@ -55,6 +55,8 @@ Listener::Clear() m_broadcasters.clear(); m_cond_wait.SetValue (false, eBroadcastNever); m_broadcasters.clear(); + Mutex::Locker event_locker(m_events_mutex); + m_events.clear(); } uint32_t diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp index 3d263838d28..d39fbe4d622 100644 --- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp @@ -152,6 +152,11 @@ ProcessGDBRemote::~ProcessGDBRemote() } // m_mach_process.UnregisterNotificationCallbacks (this); Clear(); + // We need to call finalize on the process before destroying ourselves + // to make sure all of the broadcaster cleanup goes as planned. If we + // destruct this class, then Process::~Process() might have problems + // trying to fully destroy the broadcaster. + Finalize(); } //---------------------------------------------------------------------- diff --git a/lldb/source/Symbol/Block.cpp b/lldb/source/Symbol/Block.cpp index d0f8ff32389..2b00cf8e4b2 100644 --- a/lldb/source/Symbol/Block.cpp +++ b/lldb/source/Symbol/Block.cpp @@ -186,95 +186,6 @@ Block::CalculateSymbolContextBlock () } void -Block::DumpStopContext -( - Stream *s, - const SymbolContext *sc_ptr, - const Declaration *child_inline_call_site, - bool show_fullpaths, - bool show_inline_blocks) -{ - const InlineFunctionInfo* inline_info = NULL; - Block* inlined_block; - if (sc_ptr) - inlined_block = GetContainingInlinedBlock (); - else - inlined_block = GetInlinedParent(); - - if (inlined_block) - inline_info = inlined_block->GetInlinedFunctionInfo(); - const Declaration *inline_call_site = child_inline_call_site; - if (inline_info) - { - inline_call_site = &inline_info->GetCallSite(); - if (sc_ptr) - { - // First frame in a frame with inlined functions - s->PutCString (" [inlined]"); - } - if (show_inline_blocks && child_inline_call_site) - s->EOL(); - else - s->PutChar(' '); - - if (sc_ptr == NULL) - s->Indent(); - - s->PutCString(inline_info->GetName ().AsCString()); - - if (child_inline_call_site && child_inline_call_site->IsValid()) - { - s->PutCString(" at "); - child_inline_call_site->DumpStopContext (s, show_fullpaths); - } - } - - // The first call to this function from something that has a symbol - // context will pass in a valid sc_ptr. Subsequent calls to this function - // from this function for inline purposes will NULL out sc_ptr. So on the - // first time through we dump the line table entry (which is always at the - // deepest inline code block). And subsequent calls to this function we - // will use hte inline call site information to print line numbers. - if (sc_ptr) - { - // If we have any inlined functions, this will be the deepest most - // inlined location - if (sc_ptr->line_entry.IsValid()) - { - s->PutCString(" at "); - sc_ptr->line_entry.DumpStopContext (s, show_fullpaths); - } - } - - if (show_inline_blocks) - { - if (inlined_block) - { - inlined_block->Block::DumpStopContext (s, - NULL, - inline_call_site, - show_fullpaths, - show_inline_blocks); - } - else if (child_inline_call_site) - { - Function *function = CalculateSymbolContextFunction(); - if (function) - { - s->EOL(); - s->Indent (function->GetMangled().GetName().AsCString()); - if (child_inline_call_site && child_inline_call_site->IsValid()) - { - s->PutCString(" at "); - child_inline_call_site->DumpStopContext (s, show_fullpaths); - } - } - } - } -} - - -void Block::DumpSymbolContext(Stream *s) { Function *function = CalculateSymbolContextFunction(); diff --git a/lldb/source/Symbol/SymbolContext.cpp b/lldb/source/Symbol/SymbolContext.cpp index 3bc4565b45d..85da9799840 100644 --- a/lldb/source/Symbol/SymbolContext.cpp +++ b/lldb/source/Symbol/SymbolContext.cpp @@ -138,12 +138,14 @@ SymbolContext::DumpStopContext if (function != NULL) { + SymbolContext inline_parent_sc; + Address inline_parent_addr; if (function->GetMangled().GetName()) { dumped_something = true; function->GetMangled().GetName().Dump(s); } - + if (addr.IsValid()) { const addr_t function_offset = addr.GetOffset() - function->GetAddressRange().GetBaseAddress().GetOffset(); @@ -154,12 +156,34 @@ SymbolContext::DumpStopContext } } - if (block != NULL) + if (GetParentOfInlinedScope (addr, inline_parent_sc, inline_parent_addr)) { - s->IndentMore(); - block->DumpStopContext (s, this, NULL, show_fullpaths, show_inlined_frames); - s->IndentLess(); dumped_something = true; + Block *inlined_block = block->GetContainingInlinedBlock(); + const InlineFunctionInfo* inlined_block_info = inlined_block->GetInlinedFunctionInfo(); + s->Printf (" [inlined] %s", inlined_block_info->GetName().GetCString()); + + lldb_private::AddressRange block_range; + if (inlined_block->GetRangeContainingAddress(addr, block_range)) + { + const addr_t inlined_function_offset = addr.GetOffset() - block_range.GetBaseAddress().GetOffset(); + if (inlined_function_offset) + { + s->Printf(" + %llu", inlined_function_offset); + } + } + const Declaration &call_site = inlined_block_info->GetCallSite(); + if (call_site.IsValid()) + { + s->PutCString(" at "); + call_site.DumpStopContext (s, show_fullpaths); + } + if (show_inlined_frames) + { + s->EOL(); + s->Indent(); + return inline_parent_sc.DumpStopContext (s, exe_scope, inline_parent_addr, show_fullpaths, show_module, show_inlined_frames); + } } else { @@ -488,87 +512,46 @@ SymbolContext::FindTypeByName (const ConstString &name) const } bool -SymbolContext::GetParentInlinedFrameInfo (const Address &curr_frame_pc, - bool is_concrete_frame, - SymbolContext &next_frame_sc, - Address &inlined_frame_addr) const +SymbolContext::GetParentOfInlinedScope (const Address &curr_frame_pc, + SymbolContext &next_frame_sc, + Address &next_frame_pc) const { next_frame_sc.Clear(); - inlined_frame_addr.Clear(); + next_frame_pc.Clear(); if (block) { - bool concrete_has_inlines = false; - Block *curr_inlined_block = NULL; - Block *next_inlined_block = NULL; //const addr_t curr_frame_file_addr = curr_frame_pc.GetFileAddress(); - if (is_concrete_frame) - { - curr_inlined_block = block->GetContainingInlinedBlock(); - if (curr_inlined_block) - { - concrete_has_inlines = true; - next_inlined_block = curr_inlined_block->GetInlinedParent(); - } - } - else - { - curr_inlined_block = block; - next_inlined_block = block->GetInlinedParent(); - } - - if (next_inlined_block) + + // In order to get the parent of an inlined function we first need to + // see if we are in an inlined block as "this->block" could be an + // inlined block, or a parent of "block" could be. So lets check if + // this block or one of this blocks parents is an inlined function. + Block *curr_inlined_block = block->GetContainingInlinedBlock(); + if (curr_inlined_block) { - next_inlined_block->CalculateSymbolContext (&next_frame_sc); - + // "this->block" is contained in an inline function block, so to + // get the scope above the inlined block, we get the parent of the + // inlined block itself + Block *next_frame_block = curr_inlined_block->GetParent(); + // Now calculate the symbol context of the containing block + next_frame_block->CalculateSymbolContext (&next_frame_sc); + + // If we get here we weren't able to find the return line entry using the nesting of the blocks and + // the line table. So just use the call site info from our inlined block. + AddressRange range; bool got_range = curr_inlined_block->GetRangeContainingAddress (curr_frame_pc, range); assert (got_range); - const InlineFunctionInfo* inline_info = next_inlined_block->GetInlinedFunctionInfo(); - if (inline_info) - { - inlined_frame_addr = range.GetBaseAddress(); - next_frame_sc.line_entry.range.GetBaseAddress() = inlined_frame_addr; - next_frame_sc.line_entry.file = inline_info->GetCallSite().GetFile(); - next_frame_sc.line_entry.line = inline_info->GetCallSite().GetLine(); - next_frame_sc.line_entry.column = inline_info->GetCallSite().GetColumn(); - return true; - } - } - else if (is_concrete_frame && !concrete_has_inlines) - { - // This is the symbol context for the frame that was found using the - // PC value and there are no inlined blocks so there are no inlined - // parent frames. - return false; - } - else - { - // We have had inlined frames before and now we are at the function - // instance that called the inlined frames. - // The SymbolContext object should contain a previous inline symbol - // context which we need to use to get the file, line and column info - const InlineFunctionInfo* inline_info = curr_inlined_block->GetInlinedFunctionInfo(); - if (inline_info) - { - Block *parent_block = curr_inlined_block->GetParent(); - if (parent_block) - { - parent_block->CalculateSymbolContext (&next_frame_sc); - - AddressRange range; - if (curr_inlined_block->GetRangeContainingAddress (curr_frame_pc, range)) - { - inlined_frame_addr = range.GetBaseAddress(); - //const addr_t range_file_file_addr = inlined_frame_addr.GetFileAddress(); - next_frame_sc.line_entry.range.GetBaseAddress() = inlined_frame_addr; - next_frame_sc.line_entry.file = inline_info->GetCallSite().GetFile(); - next_frame_sc.line_entry.line = inline_info->GetCallSite().GetLine(); - next_frame_sc.line_entry.column = inline_info->GetCallSite().GetColumn(); - return true; - } - } - } + // To see there this new frame block it, we need to look at the + // call site information from + const InlineFunctionInfo* curr_inlined_block_inlined_info = curr_inlined_block->GetInlinedFunctionInfo(); + next_frame_pc = range.GetBaseAddress(); + next_frame_sc.line_entry.range.GetBaseAddress() = next_frame_pc; + next_frame_sc.line_entry.file = curr_inlined_block_inlined_info->GetCallSite().GetFile(); + next_frame_sc.line_entry.line = curr_inlined_block_inlined_info->GetCallSite().GetLine(); + next_frame_sc.line_entry.column = curr_inlined_block_inlined_info->GetCallSite().GetColumn(); + return true; } } diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp index 384f9e84120..15fa5d0e990 100644 --- a/lldb/source/Target/Process.cpp +++ b/lldb/source/Target/Process.cpp @@ -644,6 +644,9 @@ Process::~Process() void Process::Finalize() { + // Clear our broadcaster before we proceed with destroying + Broadcaster::Clear(); + // Do any cleanup needed prior to being destructed... Subclasses // that override this method should call this superclass method as well. diff --git a/lldb/source/Target/StackFrameList.cpp b/lldb/source/Target/StackFrameList.cpp index 3f747812240..3d8342326a3 100644 --- a/lldb/source/Target/StackFrameList.cpp +++ b/lldb/source/Target/StackFrameList.cpp @@ -112,64 +112,28 @@ StackFrameList::GetNumFrames (bool can_create) m_frames.push_back (unwind_frame_sp); } - Block *unwind_block = unwind_frame_sp->GetSymbolContext (eSymbolContextBlock).block; - + SymbolContext unwind_sc = unwind_frame_sp->GetSymbolContext (eSymbolContextBlock | eSymbolContextFunction); + Block *unwind_block = unwind_sc.block; if (unwind_block) { - Block *inlined_block = unwind_block->GetContainingInlinedBlock(); - if (inlined_block) + Address curr_frame_address = unwind_frame_sp->GetFrameCodeAddress(); + SymbolContext next_frame_sc; + Address next_frame_address; + + while (unwind_sc.GetParentOfInlinedScope(curr_frame_address, next_frame_sc, next_frame_address)) { - for (; inlined_block != NULL; inlined_block = inlined_block->GetInlinedParent ()) - { - SymbolContext inline_sc; - Block *parent_block = inlined_block->GetInlinedParent(); - - const bool is_inlined_frame = parent_block != NULL; - - if (parent_block == NULL) - parent_block = inlined_block->GetParent(); - - parent_block->CalculateSymbolContext (&inline_sc); - - Address previous_frame_lookup_addr (m_frames.back()->GetFrameCodeAddress()); - if (unwind_frame_sp->GetFrameIndex() > 0 && m_frames.back().get() == unwind_frame_sp.get()) - previous_frame_lookup_addr.Slide (-1); - - AddressRange range; - inlined_block->GetRangeContainingAddress (previous_frame_lookup_addr, range); - - const InlineFunctionInfo* inline_info = inlined_block->GetInlinedFunctionInfo(); - assert (inline_info); - inline_sc.line_entry.range.GetBaseAddress() = m_frames.back()->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 frame_sp(new StackFrame (m_frames.size(), idx, m_thread, unwind_frame_sp->GetRegisterContextSP (), cfa, - range.GetBaseAddress(), - &inline_sc)); // The symbol context for this inline frame - - if (is_inlined_frame) - { - // Use the block with the inlined function info - // as the symbol context since we want this frame - // to have only the variables for the inlined function - frame_sp->SetSymbolContextScope (parent_block); - } - else - { - // This block is not inlined with means it has no - // inlined parents either, so we want to use the top - // most function block. - frame_sp->SetSymbolContextScope (&unwind_frame_sp->GetSymbolContext (eSymbolContextFunction).function->GetBlock(false)); - } - + next_frame_address, + &next_frame_sc)); + m_frames.push_back (frame_sp); - } + unwind_sc = next_frame_sc; + curr_frame_address = next_frame_address; + } } } |