summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/include/lldb/Core/ModuleList.h4
-rw-r--r--lldb/include/lldb/Core/VMRange.h21
-rw-r--r--lldb/include/lldb/Expression/DWARFExpression.h3
-rw-r--r--lldb/include/lldb/Symbol/Block.h55
-rw-r--r--lldb/include/lldb/Target/StackFrame.h2
-rw-r--r--lldb/source/API/SBFrame.cpp5
-rw-r--r--lldb/source/Commands/CommandObjectArgs.cpp2
-rw-r--r--lldb/source/Commands/CommandObjectDisassemble.cpp2
-rw-r--r--lldb/source/Core/Disassembler.cpp2
-rw-r--r--lldb/source/Core/ModuleList.cpp4
-rw-r--r--lldb/source/Expression/DWARFExpression.cpp16
-rw-r--r--lldb/source/Plugins/Process/MacOSX-User/source/MacOSX/MachThreadContext_i386.cpp2
-rw-r--r--lldb/source/Plugins/Process/MacOSX-User/source/MacOSX/MachThreadContext_x86_64.cpp2
-rw-r--r--lldb/source/Plugins/Process/Utility/UnwindMacOSXFrameBackchain.cpp4
-rw-r--r--lldb/source/Symbol/Block.cpp71
-rw-r--r--lldb/source/Symbol/SymbolContext.cpp4
-rw-r--r--lldb/source/Symbol/Variable.cpp3
-rw-r--r--lldb/source/Target/StackFrame.cpp113
-rw-r--r--lldb/source/Target/Thread.cpp12
-rw-r--r--lldb/source/Target/ThreadPlanStepInstruction.cpp4
-rw-r--r--lldb/source/Target/ThreadPlanStepOut.cpp3
-rw-r--r--lldb/source/Target/ThreadPlanStepUntil.cpp3
22 files changed, 185 insertions, 152 deletions
diff --git a/lldb/include/lldb/Core/ModuleList.h b/lldb/include/lldb/Core/ModuleList.h
index ef3ddd80669..35f9851fadf 100644
--- a/lldb/include/lldb/Core/ModuleList.h
+++ b/lldb/include/lldb/Core/ModuleList.h
@@ -259,7 +259,7 @@ public:
ModuleList& matching_module_list) const;
lldb::ModuleSP
- FindModule (lldb_private::Module *module_ptr);
+ FindModule (const Module *module_ptr);
lldb::ModuleSP
FindFirstModuleForFileSpec (const FileSpec &file_spec,
@@ -355,7 +355,7 @@ public:
GetSize () const;
static const lldb::ModuleSP
- GetModuleSP (lldb_private::Module *module_ptr);
+ GetModuleSP (const Module *module_ptr);
static Error
GetSharedModule (const FileSpec& file_spec,
diff --git a/lldb/include/lldb/Core/VMRange.h b/lldb/include/lldb/Core/VMRange.h
index c6ce3029de6..9a6b465e1aa 100644
--- a/lldb/include/lldb/Core/VMRange.h
+++ b/lldb/include/lldb/Core/VMRange.h
@@ -43,20 +43,30 @@ public:
{
}
+ void
+ Clear ()
+ {
+ m_base_addr = 0;
+ m_byte_size = 0;
+ }
+
// Set the start and end values
- void Reset (lldb::addr_t start_addr, lldb::addr_t end_addr)
+ void
+ Reset (lldb::addr_t start_addr, lldb::addr_t end_addr)
{
SetBaseAddress (start_addr);
SetEndAddress (end_addr);
}
// Set the start value for the range, and keep the same size
- void SetBaseAddress (lldb::addr_t base_addr)
+ void
+ SetBaseAddress (lldb::addr_t base_addr)
{
m_base_addr = base_addr;
}
- void SetEndAddress (lldb::addr_t end_addr)
+ void
+ SetEndAddress (lldb::addr_t end_addr)
{
const lldb::addr_t base_addr = GetBaseAddress();
if (end_addr > base_addr)
@@ -92,7 +102,7 @@ public:
bool
IsValid() const
{
- return GetByteSize() > 0;
+ return m_byte_size > 0;
}
bool
@@ -101,7 +111,8 @@ public:
return (GetBaseAddress() <= addr) && (addr < GetEndAddress());
}
- bool Contains (const VMRange& range) const
+ bool
+ Contains (const VMRange& range) const
{
if (Contains(range.GetBaseAddress()))
{
diff --git a/lldb/include/lldb/Expression/DWARFExpression.h b/lldb/include/lldb/Expression/DWARFExpression.h
index fb1f3b5ae7b..170bec51d7b 100644
--- a/lldb/include/lldb/Expression/DWARFExpression.h
+++ b/lldb/include/lldb/Expression/DWARFExpression.h
@@ -118,6 +118,9 @@ public:
bool
LocationListContainsLoadAddress (Process* process, const Address &addr) const;
+ bool
+ LocationListContainsLoadAddress (Process* process, lldb::addr_t load_addr) const;
+
//------------------------------------------------------------------
/// Make the expression parser read its location information from a
/// given data source. Does not change the offset and length
diff --git a/lldb/include/lldb/Symbol/Block.h b/lldb/include/lldb/Symbol/Block.h
index c55b1a2c208..3ac934968cb 100644
--- a/lldb/include/lldb/Symbol/Block.h
+++ b/lldb/include/lldb/Symbol/Block.h
@@ -182,8 +182,28 @@ public:
Block *
GetParent () const;
+
+ //------------------------------------------------------------------
+ /// Get the inlined block that contains this block.
+ ///
+ /// @return
+ /// If this block contains inlined function info, it will return
+ /// this block, else parent blocks will be searched to see if
+ /// any contain this block. NULL will be returned if this block
+ /// nor any parent blocks are inlined function blocks.
+ //------------------------------------------------------------------
+ Block *
+ GetContainingInlinedBlock ();
+
+ //------------------------------------------------------------------
+ /// Get the inlined parent block for this block.
+ ///
+ /// @return
+ /// The parent block pointer, or NULL if this block has no
+ /// parent.
+ //------------------------------------------------------------------
Block *
- GetInlinedParent () const;
+ GetInlinedParent ();
//------------------------------------------------------------------
/// Get the sibling block for this block.
@@ -206,7 +226,12 @@ public:
/// children.
//------------------------------------------------------------------
Block *
- GetFirstChild () const;
+ GetFirstChild () const
+ {
+ if (m_children.empty())
+ return NULL;
+ return m_children.front().get();
+ }
//------------------------------------------------------------------
/// Get the variable list for this block and optionally all child
@@ -266,16 +291,6 @@ public:
VariableList *variable_list);
//------------------------------------------------------------------
- /// Get accessor for any inlined function information.
- ///
- /// @return
- /// A pointer to any inlined function information, or NULL if
- /// this is a regular block.
- //------------------------------------------------------------------
- InlineFunctionInfo*
- InlinedFunctionInfo ();
-
- //------------------------------------------------------------------
/// Get const accessor for any inlined function information.
///
/// @return
@@ -283,7 +298,10 @@ public:
/// if this is a regular block.
//------------------------------------------------------------------
const InlineFunctionInfo*
- InlinedFunctionInfo () const;
+ InlinedFunctionInfo () const
+ {
+ return m_inlineInfoSP.get();
+ }
//------------------------------------------------------------------
/// Get the memory cost of this object.
@@ -348,7 +366,11 @@ public:
/// A shared pointer to a VariableList.
//------------------------------------------------------------------
void
- SetVariableList (lldb::VariableListSP& variable_list_sp);
+ SetVariableList (lldb::VariableListSP& variable_list_sp)
+ {
+ m_variable_list_sp = variable_list_sp;
+ }
+
bool
@@ -364,6 +386,9 @@ public:
FindBlockByID (lldb::user_id_t block_id);
bool
+ GetRangeContainingOffset (const lldb::addr_t offset, VMRange &range);
+
+ bool
GetRangeContainingAddress (const Address& addr, AddressRange &range);
@@ -377,7 +402,7 @@ protected:
collection m_children;
VMRange::collection m_ranges; ///< A list of address offset ranges relative to the function's section/offset address.
lldb::InlineFunctionInfoSP m_inlineInfoSP; ///< Inlined function information.
- lldb::VariableListSP m_variables; ///< The variable list for all local, static and paramter variables scoped to this block.
+ lldb::VariableListSP m_variable_list_sp; ///< The variable list for all local, static and paramter variables scoped to this block.
bool m_parsed_block_info:1, ///< Set to true if this block and it's children have all been parsed
m_parsed_block_variables:1,
m_parsed_child_blocks:1;
diff --git a/lldb/include/lldb/Target/StackFrame.h b/lldb/include/lldb/Target/StackFrame.h
index a030080aa75..54c96c68915 100644
--- a/lldb/include/lldb/Target/StackFrame.h
+++ b/lldb/include/lldb/Target/StackFrame.h
@@ -50,7 +50,7 @@ public:
GetStackID();
Address&
- GetPC();
+ GetFrameCodeAddress();
void
ChangePC (lldb::addr_t pc);
diff --git a/lldb/source/API/SBFrame.cpp b/lldb/source/API/SBFrame.cpp
index 53307718143..b2d591d8507 100644
--- a/lldb/source/API/SBFrame.cpp
+++ b/lldb/source/API/SBFrame.cpp
@@ -121,12 +121,11 @@ SBFrame::GetFrameID () const
return UINT32_MAX;
}
-
lldb::addr_t
SBFrame::GetPC () const
{
if (m_opaque_sp)
- return m_opaque_sp->GetPC().GetLoadAddress (&m_opaque_sp->GetThread().GetProcess());
+ return m_opaque_sp->GetFrameCodeAddress().GetLoadAddress (&m_opaque_sp->GetThread().GetProcess());
return LLDB_INVALID_ADDRESS;
}
@@ -161,7 +160,7 @@ SBFrame::GetPCAddress () const
{
SBAddress sb_addr;
if (m_opaque_sp)
- sb_addr.SetAddress (&m_opaque_sp->GetPC());
+ sb_addr.SetAddress (&m_opaque_sp->GetFrameCodeAddress());
return sb_addr;
}
diff --git a/lldb/source/Commands/CommandObjectArgs.cpp b/lldb/source/Commands/CommandObjectArgs.cpp
index a7169c5c8cf..604489804c6 100644
--- a/lldb/source/Commands/CommandObjectArgs.cpp
+++ b/lldb/source/Commands/CommandObjectArgs.cpp
@@ -148,7 +148,7 @@ CommandObjectArgs::Execute
return false;
}
- Module *thread_module = thread_cur_frame->GetPC ().GetModule ();
+ Module *thread_module = thread_cur_frame->GetFrameCodeAddress ().GetModule ();
if (!thread_module)
{
result.AppendError ("The PC has no associated module.");
diff --git a/lldb/source/Commands/CommandObjectDisassemble.cpp b/lldb/source/Commands/CommandObjectDisassemble.cpp
index 4bf392c094f..0bc4bf3b73b 100644
--- a/lldb/source/Commands/CommandObjectDisassemble.cpp
+++ b/lldb/source/Commands/CommandObjectDisassemble.cpp
@@ -248,7 +248,7 @@ CommandObjectDisassemble::Execute
else if (sc.symbol && sc.symbol->GetAddressRangePtr())
range = *sc.symbol->GetAddressRangePtr();
else
- range.GetBaseAddress() = exe_ctx.frame->GetPC();
+ range.GetBaseAddress() = exe_ctx.frame->GetFrameCodeAddress();
}
else
{
diff --git a/lldb/source/Core/Disassembler.cpp b/lldb/source/Core/Disassembler.cpp
index 49c131a1361..22f6c06510d 100644
--- a/lldb/source/Core/Disassembler.cpp
+++ b/lldb/source/Core/Disassembler.cpp
@@ -311,7 +311,7 @@ Disassembler::Disassemble
}
else
{
- range.GetBaseAddress() = exe_ctx.frame->GetPC();
+ range.GetBaseAddress() = exe_ctx.frame->GetFrameCodeAddress();
}
if (range.GetBaseAddress().IsValid() && range.GetByteSize() == 0)
diff --git a/lldb/source/Core/ModuleList.cpp b/lldb/source/Core/ModuleList.cpp
index 37357c373ca..1d7e75537b3 100644
--- a/lldb/source/Core/ModuleList.cpp
+++ b/lldb/source/Core/ModuleList.cpp
@@ -267,7 +267,7 @@ ModuleList::FindModules
}
ModuleSP
-ModuleList::FindModule (lldb_private::Module *module_ptr)
+ModuleList::FindModule (const Module *module_ptr)
{
ModuleSP module_sp;
@@ -450,7 +450,7 @@ GetSharedModuleList ()
}
const lldb::ModuleSP
-ModuleList::GetModuleSP (lldb_private::Module *module_ptr)
+ModuleList::GetModuleSP (const Module *module_ptr)
{
lldb::ModuleSP module_sp;
if (module_ptr)
diff --git a/lldb/source/Expression/DWARFExpression.cpp b/lldb/source/Expression/DWARFExpression.cpp
index 1f63b95d259..77e1581ceaf 100644
--- a/lldb/source/Expression/DWARFExpression.cpp
+++ b/lldb/source/Expression/DWARFExpression.cpp
@@ -688,13 +688,18 @@ ReadRegisterValueAsScalar
bool
DWARFExpression::LocationListContainsLoadAddress (Process* process, const Address &addr) const
{
+ return LocationListContainsLoadAddress(process, addr.GetLoadAddress(process));
+}
+
+bool
+DWARFExpression::LocationListContainsLoadAddress (Process* process, addr_t load_addr) const
+{
+ if (load_addr == LLDB_INVALID_ADDRESS)
+ return false;
+
if (IsLocationList())
{
uint32_t offset = 0;
- const addr_t load_addr = addr.GetLoadAddress(process);
-
- if (load_addr == LLDB_INVALID_ADDRESS)
- return false;
addr_t loc_list_base_addr = m_loclist_base_addr.GetLoadAddress(process);
@@ -722,6 +727,7 @@ DWARFExpression::LocationListContainsLoadAddress (Process* process, const Addres
}
return false;
}
+
bool
DWARFExpression::Evaluate
(
@@ -749,7 +755,7 @@ DWARFExpression::Evaluate
if (IsLocationList())
{
uint32_t offset = 0;
- addr_t pc = exe_ctx->frame->GetPC().GetLoadAddress(exe_ctx->process);
+ addr_t pc = exe_ctx->frame->GetRegisterContext()->GetPC();
if (pc == LLDB_INVALID_ADDRESS)
{
diff --git a/lldb/source/Plugins/Process/MacOSX-User/source/MacOSX/MachThreadContext_i386.cpp b/lldb/source/Plugins/Process/MacOSX-User/source/MacOSX/MachThreadContext_i386.cpp
index d3ba88b45bd..0e78cdc4d6d 100644
--- a/lldb/source/Plugins/Process/MacOSX-User/source/MacOSX/MachThreadContext_i386.cpp
+++ b/lldb/source/Plugins/Process/MacOSX-User/source/MacOSX/MachThreadContext_i386.cpp
@@ -210,7 +210,7 @@ MachThreadContext_i386::GetStackFrameData(StackFrame *first_frame, std::vector<s
if (addr_range_ptr)
{
- if (first_frame->GetPC() == addr_range_ptr->GetBaseAddress())
+ if (first_frame->GetFrameCodeAddress() == addr_range_ptr->GetBaseAddress())
{
// We are at the first instruction, so we can recover the
// previous PC by dereferencing the SP
diff --git a/lldb/source/Plugins/Process/MacOSX-User/source/MacOSX/MachThreadContext_x86_64.cpp b/lldb/source/Plugins/Process/MacOSX-User/source/MacOSX/MachThreadContext_x86_64.cpp
index 2d11d5bd14a..0dcbe746de4 100644
--- a/lldb/source/Plugins/Process/MacOSX-User/source/MacOSX/MachThreadContext_x86_64.cpp
+++ b/lldb/source/Plugins/Process/MacOSX-User/source/MacOSX/MachThreadContext_x86_64.cpp
@@ -221,7 +221,7 @@ MachThreadContext_x86_64::GetStackFrameData(StackFrame *first_frame, std::vector
if (addr_range_ptr)
{
- if (first_frame->GetPC() == addr_range_ptr->GetBaseAddress())
+ if (first_frame->GetFrameCodeAddress() == addr_range_ptr->GetBaseAddress())
{
// We are at the first instruction, so we can recover the
// previous PC by dereferencing the SP
diff --git a/lldb/source/Plugins/Process/Utility/UnwindMacOSXFrameBackchain.cpp b/lldb/source/Plugins/Process/Utility/UnwindMacOSXFrameBackchain.cpp
index 29bc89e63fa..4ef6338bb37 100644
--- a/lldb/source/Plugins/Process/Utility/UnwindMacOSXFrameBackchain.cpp
+++ b/lldb/source/Plugins/Process/Utility/UnwindMacOSXFrameBackchain.cpp
@@ -130,7 +130,7 @@ UnwindMacOSXFrameBackchain::GetStackFrameData_i386 (StackFrame *first_frame)
if (addr_range_ptr)
{
- if (first_frame->GetPC() == addr_range_ptr->GetBaseAddress())
+ if (first_frame->GetFrameCodeAddress() == addr_range_ptr->GetBaseAddress())
{
// We are at the first instruction, so we can recover the
// previous PC by dereferencing the SP
@@ -218,7 +218,7 @@ UnwindMacOSXFrameBackchain::GetStackFrameData_x86_64 (StackFrame *first_frame)
if (addr_range_ptr)
{
- if (first_frame->GetPC() == addr_range_ptr->GetBaseAddress())
+ if (first_frame->GetFrameCodeAddress() == addr_range_ptr->GetBaseAddress())
{
// We are at the first instruction, so we can recover the
// previous PC by dereferencing the SP
diff --git a/lldb/source/Symbol/Block.cpp b/lldb/source/Symbol/Block.cpp
index 8256aa7e199..c0b9ac667e0 100644
--- a/lldb/source/Symbol/Block.cpp
+++ b/lldb/source/Symbol/Block.cpp
@@ -24,7 +24,7 @@ Block::Block(lldb::user_id_t uid) :
m_children (),
m_ranges (),
m_inlineInfoSP (),
- m_variables (),
+ m_variable_list_sp (),
m_parsed_block_info (false),
m_parsed_block_variables (false),
m_parsed_child_blocks (false)
@@ -104,9 +104,9 @@ Block::Dump(Stream *s, addr_t base_addr, int32_t depth, bool show_context) const
{
s->IndentMore();
- if (m_variables.get())
+ if (m_variable_list_sp.get())
{
- m_variables->Dump(s, show_context);
+ m_variable_list_sp->Dump(s, show_context);
}
for (Block *child_block = GetFirstChild(); child_block != NULL; child_block = child_block->GetSibling())
@@ -137,7 +137,7 @@ Block::FindBlockByID (user_id_t block_id)
}
void
-Block::CalculateSymbolContext(SymbolContext* sc)
+Block::CalculateSymbolContext (SymbolContext* sc)
{
if (m_parent_scope)
m_parent_scope->CalculateSymbolContext(sc);
@@ -149,7 +149,7 @@ Block::DumpStopContext (Stream *s, const SymbolContext *sc)
{
Block* parent_block = GetParent();
- InlineFunctionInfo* inline_info = InlinedFunctionInfo ();
+ const InlineFunctionInfo* inline_info = InlinedFunctionInfo ();
if (inline_info)
{
const Declaration &call_site = inline_info->GetCallSite();
@@ -226,7 +226,15 @@ Block::GetParent () const
}
Block *
-Block::GetInlinedParent () const
+Block::GetContainingInlinedBlock ()
+{
+ if (InlinedFunctionInfo())
+ return this;
+ return GetInlinedParent ();
+}
+
+Block *
+Block::GetInlinedParent ()
{
Block *parent_block = GetParent ();
if (parent_block)
@@ -241,6 +249,20 @@ Block::GetInlinedParent () const
bool
+Block::GetRangeContainingOffset (const addr_t offset, VMRange &range)
+{
+ uint32_t range_idx = VMRange::FindRangeIndexThatContainsValue (m_ranges, offset);
+ if (range_idx < m_ranges.size())
+ {
+ range = m_ranges[range_idx];
+ return true;
+ }
+ range.Clear();
+ return false;
+}
+
+
+bool
Block::GetRangeContainingAddress (const Address& addr, AddressRange &range)
{
SymbolContext sc;
@@ -278,18 +300,6 @@ Block::AddRange(addr_t start_offset, addr_t end_offset)
m_ranges.back().Reset(start_offset, end_offset);
}
-InlineFunctionInfo*
-Block::InlinedFunctionInfo ()
-{
- return m_inlineInfoSP.get();
-}
-
-const InlineFunctionInfo*
-Block::InlinedFunctionInfo () const
-{
- return m_inlineInfoSP.get();
-}
-
// Return the current number of bytes that this object occupies in memory
size_t
Block::MemorySize() const
@@ -297,20 +307,12 @@ Block::MemorySize() const
size_t mem_size = sizeof(Block) + m_ranges.size() * sizeof(VMRange);
if (m_inlineInfoSP.get())
mem_size += m_inlineInfoSP->MemorySize();
- if (m_variables.get())
- mem_size += m_variables->MemorySize();
+ if (m_variable_list_sp.get())
+ mem_size += m_variable_list_sp->MemorySize();
return mem_size;
}
-Block *
-Block::GetFirstChild () const
-{
- if (m_children.empty())
- return NULL;
- return m_children.front().get();
-}
-
void
Block::AddChild(const BlockSP &child_block_sp)
{
@@ -343,7 +345,7 @@ Block::GetVariableList (bool get_child_variables, bool can_create)
VariableListSP variable_list_sp;
if (m_parsed_block_variables == false)
{
- if (m_variables.get() == NULL && can_create)
+ if (m_variable_list_sp.get() == NULL && can_create)
{
m_parsed_block_variables = true;
SymbolContext sc;
@@ -353,11 +355,11 @@ Block::GetVariableList (bool get_child_variables, bool can_create)
}
}
- if (m_variables.get())
+ if (m_variable_list_sp.get())
{
variable_list_sp.reset(new VariableList());
if (variable_list_sp.get())
- variable_list_sp->AddVariables(m_variables.get());
+ variable_list_sp->AddVariables(m_variable_list_sp.get());
if (get_child_variables)
{
@@ -406,13 +408,6 @@ Block::AppendVariables
return num_variables_added;
}
-
-void
-Block::SetVariableList(VariableListSP& variables)
-{
- m_variables = variables;
-}
-
void
Block::SetBlockInfoHasBeenParsed (bool b, bool set_children)
{
diff --git a/lldb/source/Symbol/SymbolContext.cpp b/lldb/source/Symbol/SymbolContext.cpp
index db0bccb726e..ce65b91ad4f 100644
--- a/lldb/source/Symbol/SymbolContext.cpp
+++ b/lldb/source/Symbol/SymbolContext.cpp
@@ -131,10 +131,10 @@ SymbolContext::DumpStopContext
if (show_inlined_frames && block)
{
- InlineFunctionInfo *inline_info = block->InlinedFunctionInfo();
+ const InlineFunctionInfo *inline_info = block->InlinedFunctionInfo();
if (inline_info == NULL)
{
- Block *parent_inline_block = block->GetInlinedParent();
+ const Block *parent_inline_block = block->GetInlinedParent();
if (parent_inline_block)
inline_info = parent_inline_block->InlinedFunctionInfo();
}
diff --git a/lldb/source/Symbol/Variable.cpp b/lldb/source/Symbol/Variable.cpp
index dfd436e53c3..cb3d1c6cf15 100644
--- a/lldb/source/Symbol/Variable.cpp
+++ b/lldb/source/Symbol/Variable.cpp
@@ -14,6 +14,7 @@
#include "lldb/Symbol/Function.h"
#include "lldb/Symbol/SymbolContext.h"
#include "lldb/Symbol/Type.h"
+#include "lldb/Target/RegisterContext.h"
#include "lldb/Target/StackFrame.h"
#include "lldb/Target/Thread.h"
@@ -142,7 +143,7 @@ Variable::IsInScope (StackFrame *frame)
// It is a location list. We just need to tell if the location
// list contains the current address when converted to a load
// address
- return m_location.LocationListContainsLoadAddress (&frame->GetThread().GetProcess(), frame->GetPC());
+ return m_location.LocationListContainsLoadAddress (&frame->GetThread().GetProcess(), frame->GetRegisterContext()->GetPC());
}
else
{
diff --git a/lldb/source/Target/StackFrame.cpp b/lldb/source/Target/StackFrame.cpp
index 1f72c318f9c..178144ad84b 100644
--- a/lldb/source/Target/StackFrame.cpp
+++ b/lldb/source/Target/StackFrame.cpp
@@ -29,8 +29,8 @@ using namespace lldb_private;
// The first bits in the flags are reserved for the SymbolContext::Scope bits
// so we know if we have tried to look up information in our internal symbol
// context (m_sc) already.
-#define RESOLVED_PC_SO_ADDR (uint32_t(eSymbolContextEverything + 1))
-#define RESOLVED_FRAME_ID (RESOLVED_PC_SO_ADDR << 1)
+#define RESOLVED_FRAME_ADDR (uint32_t(eSymbolContextEverything + 1))
+#define RESOLVED_FRAME_ID (RESOLVED_FRAME_ADDR << 1)
#define GOT_FRAME_BASE (RESOLVED_FRAME_ID << 1)
#define FRAME_IS_OBSOLETE (GOT_FRAME_BASE << 1)
#define RESOLVED_VARIABLES (FRAME_IS_OBSOLETE << 1)
@@ -169,53 +169,29 @@ StackFrame::GetStackID()
// Resolve our PC to section offset if we haven't alreday done so
// and if we don't have a module. The resolved address section will
// contain the module to which it belongs.
- if (!m_sc.module_sp && m_flags.IsClear(RESOLVED_PC_SO_ADDR))
- GetPC();
+ if (!m_sc.module_sp && m_flags.IsClear(RESOLVED_FRAME_ADDR))
+ GetFrameCodeAddress();
- const uint32_t resolve_scope = eSymbolContextModule |
- eSymbolContextCompUnit |
- eSymbolContextFunction;
-
- if (m_sc.module_sp)
+ if (GetSymbolContext (eSymbolContextFunction).function)
{
- if (m_sc.module_sp->ResolveSymbolContextForAddress (GetPC(), resolve_scope, m_sc) & eSymbolContextFunction)
- {
- assert (m_sc.function);
- m_id.SetStartAddress(m_sc.function->GetAddressRange().GetBaseAddress());
- }
- else if (m_sc.module_sp->ResolveSymbolContextForAddress (GetPC(), resolve_scope, m_sc) & eSymbolContextSymbol)
- {
- assert (m_sc.symbol);
- AddressRange *symbol_range_ptr = m_sc.symbol->GetAddressRangePtr();
- if (symbol_range_ptr)
- m_id.SetStartAddress(symbol_range_ptr->GetBaseAddress());
- }
+ m_id.SetStartAddress (m_sc.function->GetAddressRange().GetBaseAddress());
+ }
+ else if (GetSymbolContext (eSymbolContextSymbol).symbol)
+ {
+ AddressRange *symbol_range_ptr = m_sc.symbol->GetAddressRangePtr();
+ if (symbol_range_ptr)
+ m_id.SetStartAddress(symbol_range_ptr->GetBaseAddress());
}
-// else if (m_sc.target != NULL)
-// {
-// if (m_sc.target->GetImages().ResolveSymbolContextForAddress (GetPC(), resolve_scope, m_sc) & eSymbolContextFunction)
-// {
-// assert (m_sc.function);
-// m_id.GetAddressRange() = m_sc.function->GetAddressRange();
-// }
-// else if (m_sc.target->GetImages().ResolveSymbolContextForAddress (GetPC(), resolve_scope, m_sc) & eSymbolContextSymbol)
-// {
-// assert (m_sc.symbol);
-// AddressRange *symbol_range_ptr = m_sc.symbol->GetAddressRange();
-// if (symbol_range_ptr)
-// m_id.GetAddressRange() = *symbol_range_ptr;
-// }
-// }
}
return m_id;
}
Address&
-StackFrame::GetPC()
+StackFrame::GetFrameCodeAddress()
{
- if (m_flags.IsClear(RESOLVED_PC_SO_ADDR) && !m_pc.IsSectionOffset())
+ if (m_flags.IsClear(RESOLVED_FRAME_ADDR) && !m_pc.IsSectionOffset())
{
- m_flags.Set (RESOLVED_PC_SO_ADDR);
+ m_flags.Set (RESOLVED_FRAME_ADDR);
// Resolve the PC into a temporary address because if ResolveLoadAddress
// fails to resolve the address, it will clear the address object...
@@ -279,20 +255,19 @@ const SymbolContext&
StackFrame::GetSymbolContext (uint32_t resolve_scope)
{
// Copy our internal symbol context into "sc".
-
if ((m_flags.GetAllFlagBits() & resolve_scope) != resolve_scope)
{
// Resolve our PC to section offset if we haven't alreday done so
// and if we don't have a module. The resolved address section will
// contain the module to which it belongs
- if (!m_sc.module_sp && m_flags.IsClear(RESOLVED_PC_SO_ADDR))
- GetPC();
+ if (!m_sc.module_sp && m_flags.IsClear(RESOLVED_FRAME_ADDR))
+ GetFrameCodeAddress();
// If this is not frame zero, then we need to subtract 1 from the PC
// value when doing address lookups since the PC will be on the
// instruction following the function call instruction...
- Address lookup_addr(GetPC());
+ Address lookup_addr(GetFrameCodeAddress());
if (m_frame_index > 0 && lookup_addr.IsValid())
{
addr_t offset = lookup_addr.GetOffset();
@@ -300,6 +275,8 @@ StackFrame::GetSymbolContext (uint32_t resolve_scope)
lookup_addr.SetOffset(offset - 1);
}
+
+ uint32_t resolved = 0;
if (m_sc.module_sp)
{
// We have something in our stack frame symbol context, lets check
@@ -313,7 +290,7 @@ StackFrame::GetSymbolContext (uint32_t resolve_scope)
if (m_flags.IsClear (eSymbolContextCompUnit))
{
if (m_sc.comp_unit)
- m_flags.Set (eSymbolContextCompUnit);
+ resolved |= eSymbolContextCompUnit;
else
actual_resolve_scope |= eSymbolContextCompUnit;
}
@@ -324,7 +301,7 @@ StackFrame::GetSymbolContext (uint32_t resolve_scope)
if (m_flags.IsClear (eSymbolContextFunction))
{
if (m_sc.function)
- m_flags.Set (eSymbolContextFunction);
+ resolved |= eSymbolContextFunction;
else
actual_resolve_scope |= eSymbolContextFunction;
}
@@ -335,7 +312,7 @@ StackFrame::GetSymbolContext (uint32_t resolve_scope)
if (m_flags.IsClear (eSymbolContextBlock))
{
if (m_sc.block)
- m_flags.Set (eSymbolContextBlock);
+ resolved |= eSymbolContextBlock;
else
actual_resolve_scope |= eSymbolContextBlock;
}
@@ -346,7 +323,7 @@ StackFrame::GetSymbolContext (uint32_t resolve_scope)
if (m_flags.IsClear (eSymbolContextSymbol))
{
if (m_sc.symbol)
- m_flags.Set (eSymbolContextSymbol);
+ resolved |= eSymbolContextSymbol;
else
actual_resolve_scope |= eSymbolContextSymbol;
}
@@ -357,7 +334,7 @@ StackFrame::GetSymbolContext (uint32_t resolve_scope)
if (m_flags.IsClear (eSymbolContextLineEntry))
{
if (m_sc.line_entry.IsValid())
- m_flags.Set (eSymbolContextLineEntry);
+ resolved |= eSymbolContextLineEntry;
else
actual_resolve_scope |= eSymbolContextLineEntry;
}
@@ -371,15 +348,21 @@ StackFrame::GetSymbolContext (uint32_t resolve_scope)
// already found in "m_sc"
SymbolContext sc;
// Set flags that indicate what we have tried to resolve
- const uint32_t resolved = m_sc.module_sp->ResolveSymbolContextForAddress (lookup_addr, actual_resolve_scope, sc);
+ resolved |= m_sc.module_sp->ResolveSymbolContextForAddress (lookup_addr, actual_resolve_scope, sc);
// Only replace what we didn't already have as we may have
// information for an inlined function scope that won't match
// what a standard lookup by address would match
- if (resolved & eSymbolContextCompUnit) m_sc.comp_unit = sc.comp_unit;
- if (resolved & eSymbolContextFunction) m_sc.function = sc.function;
- if (resolved & eSymbolContextBlock) m_sc.block = sc.block;
- if (resolved & eSymbolContextSymbol) m_sc.symbol = sc.symbol;
- if (resolved & eSymbolContextLineEntry) m_sc.line_entry = sc.line_entry;
+ if ((resolved & eSymbolContextCompUnit) && m_sc.comp_unit == NULL)
+ m_sc.comp_unit = sc.comp_unit;
+ if ((resolved & eSymbolContextFunction) && m_sc.function == NULL)
+ m_sc.function = sc.function;
+ if ((resolved & eSymbolContextBlock) && m_sc.block == NULL)
+ m_sc.block = sc.block;
+ if ((resolved & eSymbolContextSymbol) && m_sc.symbol == NULL)
+ m_sc.symbol = sc.symbol;
+ if ((resolved & eSymbolContextLineEntry) && !m_sc.line_entry.IsValid())
+ m_sc.line_entry = sc.line_entry;
+
}
}
else
@@ -387,16 +370,23 @@ StackFrame::GetSymbolContext (uint32_t resolve_scope)
// If we don't have a module, then we can't have the compile unit,
// function, block, line entry or symbol, so we can safely call
// ResolveSymbolContextForAddress with our symbol context member m_sc.
- m_thread.GetProcess().GetTarget().GetImages().ResolveSymbolContextForAddress (lookup_addr, resolve_scope, m_sc);
+ resolved |= m_thread.GetProcess().GetTarget().GetImages().ResolveSymbolContextForAddress (lookup_addr, resolve_scope, m_sc);
}
// If the target was requested add that:
if (m_sc.target_sp.get() == NULL)
+ {
m_sc.target_sp = CalculateProcess()->GetTarget().GetSP();
+ if (m_sc.target_sp)
+ resolved |= eSymbolContextTarget;
+ }
// Update our internal flags so we remember what we have tried to locate so
// we don't have to keep trying when more calls to this function are made.
- m_flags.Set(resolve_scope);
+ // We might have dug up more information that was requested (for example
+ // if we were asked to only get the block, we will have gotten the
+ // compile unit, and function) so set any additional bits that we resolved
+ m_flags.Set (resolve_scope | resolved);
}
// Return the symbol context with everything that was possible to resolve
@@ -412,8 +402,7 @@ StackFrame::GetVariableList ()
{
m_flags.Set(RESOLVED_VARIABLES);
- GetSymbolContext(eSymbolContextFunction);
- if (m_sc.function)
+ if (GetSymbolContext (eSymbolContextFunction).function)
{
bool get_child_variables = true;
bool can_create = true;
@@ -474,7 +463,7 @@ StackFrame::GetRegisterContext ()
bool
StackFrame::HasDebugInformation ()
{
- GetSymbolContext(eSymbolContextLineEntry);
+ GetSymbolContext (eSymbolContextLineEntry);
return m_sc.line_entry.IsValid();
}
@@ -525,12 +514,12 @@ StackFrame::Dump (Stream *strm, bool show_frame_index)
if (show_frame_index)
strm->Printf("frame #%u: ", m_frame_index);
- strm->Printf("pc = 0x%0*llx", m_thread.GetProcess().GetAddressByteSize() * 2, GetRegisterContext()->GetPC());
- SymbolContext sc (GetSymbolContext(eSymbolContextEverything));
+ strm->Printf("0x%0*llx", m_thread.GetProcess().GetAddressByteSize() * 2, GetFrameCodeAddress().GetLoadAddress(&m_thread.GetProcess()));
+ GetSymbolContext(eSymbolContextEverything);
strm->PutCString(", where = ");
// TODO: need to get the
const bool show_module = true;
const bool show_inline = true;
- sc.DumpStopContext(strm, &m_thread.GetProcess(), GetPC(), show_module, show_inline);
+ m_sc.DumpStopContext(strm, &m_thread.GetProcess(), GetFrameCodeAddress(), show_module, show_inline);
}
diff --git a/lldb/source/Target/Thread.cpp b/lldb/source/Target/Thread.cpp
index 0a6cc828329..3ab789fa00a 100644
--- a/lldb/source/Target/Thread.cpp
+++ b/lldb/source/Target/Thread.cpp
@@ -926,18 +926,21 @@ Thread::GetStackFrameAtIndex (uint32_t idx)
Block *parent_block = m_inlined_frame_info[idx].block->GetParent();
parent_block->CalculateSymbolContext(&inline_sc);
}
+
+ Address backed_up_pc (previous_frame_sp->GetFrameCodeAddress());
+ backed_up_pc.SetOffset(backed_up_pc.GetOffset()-1);
+ AddressRange range;
+ m_inlined_frame_info[idx].block->GetRangeContainingAddress (backed_up_pc, range);
- InlineFunctionInfo* inline_info = m_inlined_frame_info[idx].block->InlinedFunctionInfo();
+ const InlineFunctionInfo* inline_info = m_inlined_frame_info[idx].block->InlinedFunctionInfo();
assert (inline_info);
- inline_sc.line_entry.range.GetBaseAddress() = previous_frame_sp->GetPC();
+ 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());
- AddressRange range;
- m_inlined_frame_info[idx].block->GetRangeContainingAddress (previous_frame_sp->GetPC(), range);
frame_sp.reset (new StackFrame (idx,
m_inlined_frame_info[idx].concrete_frame_index,
@@ -949,7 +952,6 @@ Thread::GetStackFrameAtIndex (uint32_t idx)
&inline_sc)); // The symbol context for this inline frame
}
-
}
else
{
diff --git a/lldb/source/Target/ThreadPlanStepInstruction.cpp b/lldb/source/Target/ThreadPlanStepInstruction.cpp
index b469566b2c2..cef481ef0fd 100644
--- a/lldb/source/Target/ThreadPlanStepInstruction.cpp
+++ b/lldb/source/Target/ThreadPlanStepInstruction.cpp
@@ -122,10 +122,10 @@ ThreadPlanStepInstruction::ShouldStop (Event *event_ptr)
{
StreamString s;
s.PutCString ("Stepped in to: ");
- addr_t stop_addr = m_thread.GetStackFrameAtIndex(0)->GetPC().GetLoadAddress(&m_thread.GetProcess());
+ addr_t stop_addr = m_thread.GetStackFrameAtIndex(0)->GetRegisterContext()->GetPC();
s.Address (stop_addr, m_thread.GetProcess().GetAddressByteSize());
s.PutCString (" stepping out to: ");
- addr_t return_addr = return_frame->GetPC().GetLoadAddress(&m_thread.GetProcess());
+ addr_t return_addr = return_frame->GetRegisterContext()->GetPC();
s.Address (return_addr, m_thread.GetProcess().GetAddressByteSize());
log->Printf("%s.", s.GetData());
}
diff --git a/lldb/source/Target/ThreadPlanStepOut.cpp b/lldb/source/Target/ThreadPlanStepOut.cpp
index fd9f8faf99d..5d29134b859 100644
--- a/lldb/source/Target/ThreadPlanStepOut.cpp
+++ b/lldb/source/Target/ThreadPlanStepOut.cpp
@@ -53,7 +53,8 @@ ThreadPlanStepOut::ThreadPlanStepOut
StackFrame *return_frame = m_thread.GetStackFrameAtIndex(1).get();
if (return_frame)
{
- m_return_addr = return_frame->GetPC().GetLoadAddress(&m_thread.GetProcess());
+ // TODO: check for inlined frames and do the right thing...
+ m_return_addr = return_frame->GetRegisterContext()->GetPC();
Breakpoint *return_bp = m_thread.GetProcess().GetTarget().CreateBreakpoint (m_return_addr, true).get();
if (return_bp != NULL)
{
diff --git a/lldb/source/Target/ThreadPlanStepUntil.cpp b/lldb/source/Target/ThreadPlanStepUntil.cpp
index 8c0748bce33..f528cb0aae1 100644
--- a/lldb/source/Target/ThreadPlanStepUntil.cpp
+++ b/lldb/source/Target/ThreadPlanStepUntil.cpp
@@ -63,7 +63,8 @@ ThreadPlanStepUntil::ThreadPlanStepUntil
// FIXME - can we do this more securely if we know first_insn?
StackFrame *return_frame = m_thread.GetStackFrameAtIndex(1).get();
- m_return_addr = return_frame->GetPC().GetLoadAddress(&m_thread.GetProcess());
+ // TODO: add inline functionality
+ m_return_addr = return_frame->GetRegisterContext()->GetPC();
Breakpoint *return_bp = target.CreateBreakpoint (m_return_addr, true).get();
if (return_bp != NULL)
{
OpenPOWER on IntegriCloud