Added more functionality to the public API to allow for better
symbolication. Also improved the SBInstruction API to allow
access to the instruction opcode name, mnemonics, comment and
instruction data.
Added the ability to edit SBLineEntry objects (change the file,
line and column), and also allow SBSymbolContext objects to be
modified (set module, comp unit, function, block, line entry
or symbol).
The SymbolContext and SBSymbolContext can now generate inlined
call stack infomration for symbolication much easier using the
SymbolContext::GetParentInlinedFrameInfo(...) and
SBSymbolContext::GetParentInlinedFrameInfo(...) methods.
git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@140518 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/API/SBBlock.cpp b/source/API/SBBlock.cpp
index 860f9b9..bc7392c 100644
--- a/source/API/SBBlock.cpp
+++ b/source/API/SBBlock.cpp
@@ -8,8 +8,10 @@
//===----------------------------------------------------------------------===//
#include "lldb/API/SBBlock.h"
+#include "lldb/API/SBAddress.h"
#include "lldb/API/SBFileSpec.h"
#include "lldb/API/SBStream.h"
+#include "lldb/Core/AddressRange.h"
#include "lldb/Symbol/Block.h"
#include "lldb/Symbol/Function.h"
#include "lldb/Symbol/SymbolContext.h"
@@ -127,6 +129,15 @@
return sb_block;
}
+lldb::SBBlock
+SBBlock::GetContainingInlinedBlock ()
+{
+ SBBlock sb_block;
+ if (m_opaque_ptr)
+ sb_block.m_opaque_ptr = m_opaque_ptr->GetContainingInlinedBlock ();
+ return sb_block;
+}
+
SBBlock
SBBlock::GetSibling ()
{
@@ -145,8 +156,8 @@
return sb_block;
}
-const lldb_private::Block *
-SBBlock::get () const
+lldb_private::Block *
+SBBlock::get ()
{
return m_opaque_ptr;
}
@@ -181,3 +192,59 @@
return true;
}
+
+uint32_t
+SBBlock::GetNumRanges ()
+{
+ if (m_opaque_ptr)
+ return m_opaque_ptr->GetNumRanges();
+ return 0;
+}
+
+lldb::SBAddress
+SBBlock::GetRangeStartAddress (uint32_t idx)
+{
+ lldb::SBAddress sb_addr;
+ if (m_opaque_ptr)
+ {
+ AddressRange range;
+ if (m_opaque_ptr->GetRangeAtIndex(idx, range))
+ {
+ sb_addr.ref() = range.GetBaseAddress();
+ }
+ }
+ return sb_addr;
+}
+
+lldb::SBAddress
+SBBlock::GetRangeEndAddress (uint32_t idx)
+{
+ lldb::SBAddress sb_addr;
+ if (m_opaque_ptr)
+ {
+ AddressRange range;
+ if (m_opaque_ptr->GetRangeAtIndex(idx, range))
+ {
+ sb_addr.ref() = range.GetBaseAddress();
+ sb_addr.ref().Slide(range.GetByteSize());
+ }
+ }
+ return sb_addr;
+}
+
+uint32_t
+SBBlock::GetRangeIndexForBlockAddress (lldb::SBAddress block_addr)
+{
+ if (m_opaque_ptr && block_addr.IsValid())
+ {
+ uint32_t range_idx = UINT32_MAX;
+ AddressRange range;
+ if (m_opaque_ptr->GetRangeContainingAddress (block_addr.ref(), range, &range_idx))
+ {
+ return range_idx;
+ }
+ }
+
+ return UINT32_MAX;
+}
+
diff --git a/source/API/SBCompileUnit.cpp b/source/API/SBCompileUnit.cpp
index 58723e5..1590362 100644
--- a/source/API/SBCompileUnit.cpp
+++ b/source/API/SBCompileUnit.cpp
@@ -173,8 +173,8 @@
return *m_opaque_ptr;
}
-const lldb_private::CompileUnit *
-SBCompileUnit::get () const
+lldb_private::CompileUnit *
+SBCompileUnit::get ()
{
return m_opaque_ptr;
}
diff --git a/source/API/SBInstruction.cpp b/source/API/SBInstruction.cpp
index 0be59af..d708aa0 100644
--- a/source/API/SBInstruction.cpp
+++ b/source/API/SBInstruction.cpp
@@ -16,6 +16,7 @@
#include "lldb/API/SBTarget.h"
#include "lldb/Core/ArchSpec.h"
+#include "lldb/Core/DataBufferHeap.h"
#include "lldb/Core/Disassembler.h"
#include "lldb/Core/EmulateInstruction.h"
#include "lldb/Core/StreamFile.h"
@@ -67,6 +68,60 @@
return sb_addr;
}
+const char *
+SBInstruction::GetOpcodeName(SBTarget target)
+{
+ if (m_opaque_sp)
+ {
+ Mutex::Locker api_locker;
+ ExecutionContext exe_ctx;
+ if (target.IsValid())
+ {
+ api_locker.Reset (target->GetAPIMutex().GetMutex());
+ target->CalculateExecutionContext (exe_ctx);
+ exe_ctx.SetProcessSP(target->GetProcessSP());
+ }
+ return m_opaque_sp->GetOpcodeName(exe_ctx.GetBestExecutionContextScope());
+ }
+ return NULL;
+}
+
+const char *
+SBInstruction::GetMnemonics(SBTarget target)
+{
+ if (m_opaque_sp)
+ {
+ Mutex::Locker api_locker;
+ ExecutionContext exe_ctx;
+ if (target.IsValid())
+ {
+ api_locker.Reset (target->GetAPIMutex().GetMutex());
+ target->CalculateExecutionContext (exe_ctx);
+ exe_ctx.SetProcessSP(target->GetProcessSP());
+ }
+ return m_opaque_sp->GetMnemonics(exe_ctx.GetBestExecutionContextScope());
+ }
+ return NULL;
+}
+
+const char *
+SBInstruction::GetComment(SBTarget target)
+{
+ if (m_opaque_sp)
+ {
+ Mutex::Locker api_locker;
+ ExecutionContext exe_ctx;
+ if (target.IsValid())
+ {
+ api_locker.Reset (target->GetAPIMutex().GetMutex());
+ target->CalculateExecutionContext (exe_ctx);
+ exe_ctx.SetProcessSP(target->GetProcessSP());
+ }
+ return m_opaque_sp->GetComment(exe_ctx.GetBestExecutionContextScope());
+ }
+ return NULL;
+}
+
size_t
SBInstruction::GetByteSize ()
{
@@ -75,6 +130,32 @@
return 0;
}
+SBData
+SBInstruction::GetData (SBTarget target)
+{
+ lldb::SBData sb_data;
+ if (m_opaque_sp)
+ {
+ const Opcode &opcode = m_opaque_sp->GetOpcode();
+ const void *opcode_data = opcode.GetOpcodeBytes();
+ const uint32_t opcode_data_size = opcode.GetByteSize();
+ if (opcode_data && opcode_data_size > 0)
+ {
+ ByteOrder data_byte_order = opcode.GetDataByteOrder();
+ if (data_byte_order == eByteOrderInvalid)
+ data_byte_order = target->GetArchitecture().GetByteOrder();
+ DataBufferSP data_buffer_sp (new DataBufferHeap (opcode_data, opcode_data_size));
+ DataExtractorSP data_extractor_sp (new DataExtractor (data_buffer_sp,
+ data_byte_order,
+ target.IsValid() ? target->GetArchitecture().GetAddressByteSize() : sizeof(void*)));
+ sb_data.SetOpaque (data_extractor_sp);
+ }
+ }
+ return sb_data;
+}
+
+
+
bool
SBInstruction::DoesBranch ()
{
diff --git a/source/API/SBLineEntry.cpp b/source/API/SBLineEntry.cpp
index 3567a38..6915f58 100644
--- a/source/API/SBLineEntry.cpp
+++ b/source/API/SBLineEntry.cpp
@@ -28,33 +28,33 @@
m_opaque_ap ()
{
if (rhs.IsValid())
- m_opaque_ap.reset (new lldb_private::LineEntry (*rhs));
+ ref() = rhs.ref();
}
-
-
SBLineEntry::SBLineEntry (const lldb_private::LineEntry *lldb_object_ptr) :
m_opaque_ap ()
{
if (lldb_object_ptr)
- m_opaque_ap.reset (new lldb_private::LineEntry(*lldb_object_ptr));
+ ref() = *lldb_object_ptr;
}
const SBLineEntry &
SBLineEntry::operator = (const SBLineEntry &rhs)
{
- if (this != &rhs && rhs.IsValid())
- m_opaque_ap.reset (new lldb_private::LineEntry(*rhs));
+ if (this != &rhs)
+ {
+ if (rhs.IsValid())
+ ref() = rhs.ref();
+ else
+ m_opaque_ap.reset();
+ }
return *this;
}
void
SBLineEntry::SetLineEntry (const lldb_private::LineEntry &lldb_object_ref)
{
- if (m_opaque_ap.get())
- (*m_opaque_ap.get()) = lldb_object_ref;
- else
- m_opaque_ap.reset (new lldb_private::LineEntry (lldb_object_ref));
+ ref() = lldb_object_ref;
}
@@ -156,6 +156,28 @@
return 0;
}
+void
+SBLineEntry::SetFileSpec (lldb::SBFileSpec filespec)
+{
+ if (filespec.IsValid())
+ ref().file = filespec.ref();
+ else
+ ref().file.Clear();
+}
+void
+SBLineEntry::SetLine (uint32_t line)
+{
+ ref().line = line;
+}
+
+void
+SBLineEntry::SetColumn (uint32_t column)
+{
+ ref().line = column;
+}
+
+
+
bool
SBLineEntry::operator == (const SBLineEntry &rhs) const
{
@@ -186,8 +208,16 @@
return m_opaque_ap.get();
}
+lldb_private::LineEntry &
+SBLineEntry::ref()
+{
+ if (m_opaque_ap.get() == NULL)
+ m_opaque_ap.reset (new lldb_private::LineEntry ());
+ return *m_opaque_ap;
+}
+
const lldb_private::LineEntry &
-SBLineEntry::operator*() const
+SBLineEntry::ref() const
{
return *m_opaque_ap;
}
diff --git a/source/API/SBSymbolContext.cpp b/source/API/SBSymbolContext.cpp
index 76c607f..c2b70fb 100644
--- a/source/API/SBSymbolContext.cpp
+++ b/source/API/SBSymbolContext.cpp
@@ -10,6 +10,7 @@
#include "lldb/API/SBSymbolContext.h"
#include "lldb/API/SBStream.h"
#include "lldb/Core/Log.h"
+#include "lldb/Core/Module.h"
#include "lldb/Symbol/Function.h"
#include "lldb/Symbol/Symbol.h"
#include "lldb/Symbol/SymbolContext.h"
@@ -173,6 +174,46 @@
return sb_symbol;
}
+void
+SBSymbolContext::SetModule (lldb::SBModule module)
+{
+ ref().module_sp = module.get_sp();
+}
+
+void
+SBSymbolContext::SetCompileUnit (lldb::SBCompileUnit compile_unit)
+{
+ ref().comp_unit = compile_unit.get();
+}
+
+void
+SBSymbolContext::SetFunction (lldb::SBFunction function)
+{
+ ref().function = function.get();
+}
+
+void
+SBSymbolContext::SetBlock (lldb::SBBlock block)
+{
+ ref().block = block.get();
+}
+
+void
+SBSymbolContext::SetLineEntry (lldb::SBLineEntry line_entry)
+{
+ if (line_entry.IsValid())
+ ref().line_entry = line_entry.ref();
+ else
+ ref().line_entry.Clear();
+}
+
+void
+SBSymbolContext::SetSymbol (lldb::SBSymbol symbol)
+{
+ ref().symbol = symbol.get();
+}
+
+
lldb_private::SymbolContext*
SBSymbolContext::operator->() const
{
@@ -223,3 +264,18 @@
return true;
}
+
+SBSymbolContext
+SBSymbolContext::GetParentInlinedFrameInfo (const SBAddress &curr_frame_pc,
+ bool is_concrete_frame,
+ 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()))
+ return sb_sc;
+ }
+ return SBSymbolContext();
+}
+