Added to the public API to allow symbolication:
- New SBSection objects that are object file sections which can be accessed
through the SBModule classes. You can get the number of sections, get a
section at index, and find a section by name.
- SBSections can contain subsections (first find "__TEXT" on darwin, then
us the resulting SBSection to find "__text" sub section).
- Set load addresses for a SBSection in the SBTarget interface
- Set the load addresses of all SBSection in a SBModule in the SBTarget interface
- Add a new module the an existing target in the SBTarget interface
- Get a SBSection from a SBAddress object
This should get us a lot closer to being able to symbolicate using LLDB through
the public API.
git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@140437 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/API/SBAddress.cpp b/source/API/SBAddress.cpp
index e4161a2..9066bb4 100644
--- a/source/API/SBAddress.cpp
+++ b/source/API/SBAddress.cpp
@@ -9,6 +9,7 @@
#include "lldb/API/SBAddress.h"
#include "lldb/API/SBProcess.h"
+#include "lldb/API/SBSection.h"
#include "lldb/API/SBStream.h"
#include "lldb/Core/Address.h"
#include "lldb/Core/Log.h"
@@ -16,6 +17,69 @@
#include "lldb/Host/Mutex.h"
#include "lldb/Target/Target.h"
+namespace lldb_private
+{
+ // We need a address implementation to hold onto a reference to the module
+ // since if the module goes away and we have anyone still holding onto a
+ // SBAddress object, we could crash.
+ class AddressImpl
+ {
+ public:
+ AddressImpl () :
+ m_module_sp(),
+ m_address()
+ {
+ }
+
+ AddressImpl (const Address &addr) :
+ m_module_sp (addr.GetModule()),
+ m_address (addr)
+ {
+ }
+
+ AddressImpl (const AddressImpl &rhs) :
+ m_module_sp (rhs.m_module_sp),
+ m_address (rhs.m_address)
+ {
+ }
+
+ bool
+ IsValid () const
+ {
+ return m_address.IsValid();
+ }
+
+ void
+ operator = (const AddressImpl &rhs)
+ {
+ m_module_sp = rhs.m_module_sp;
+ m_address = rhs.m_address;
+ }
+
+ Address &
+ GetAddress ()
+ {
+ return m_address;
+ }
+
+ Module *
+ GetModule()
+ {
+ return m_module_sp.get();
+ }
+
+ const lldb::ModuleSP &
+ GetModuleSP() const
+ {
+ return m_module_sp;
+ }
+ protected:
+ lldb::ModuleSP m_module_sp;
+ Address m_address;
+ };
+}
+
+
using namespace lldb;
using namespace lldb_private;
@@ -25,18 +89,18 @@
{
}
-SBAddress::SBAddress (const lldb_private::Address *lldb_object_ptr) :
+SBAddress::SBAddress (const Address *lldb_object_ptr) :
m_opaque_ap ()
{
if (lldb_object_ptr)
- m_opaque_ap.reset (new lldb_private::Address(*lldb_object_ptr));
+ m_opaque_ap.reset (new AddressImpl(*lldb_object_ptr));
}
SBAddress::SBAddress (const SBAddress &rhs) :
m_opaque_ap ()
{
if (rhs.IsValid())
- m_opaque_ap.reset (new lldb_private::Address(*rhs.m_opaque_ap.get()));
+ m_opaque_ap.reset (new AddressImpl(*rhs.m_opaque_ap.get()));
}
// Create an address by resolving a load address using the supplied target
@@ -55,8 +119,13 @@
const SBAddress &
SBAddress::operator = (const SBAddress &rhs)
{
- if (this != &rhs && rhs.IsValid())
- m_opaque_ap.reset (new lldb_private::Address(*rhs.m_opaque_ap.get()));
+ if (this != &rhs)
+ {
+ if (rhs.IsValid())
+ m_opaque_ap.reset(new AddressImpl(*rhs.m_opaque_ap.get()));
+ else
+ m_opaque_ap.reset();
+ }
return *this;
}
@@ -73,25 +142,24 @@
}
void
-SBAddress::SetAddress (const lldb_private::Address *lldb_object_ptr)
+SBAddress::SetAddress (const Address *lldb_object_ptr)
{
if (lldb_object_ptr)
{
if (m_opaque_ap.get())
*m_opaque_ap = *lldb_object_ptr;
else
- m_opaque_ap.reset (new lldb_private::Address(*lldb_object_ptr));
- return;
+ m_opaque_ap.reset (new AddressImpl(*lldb_object_ptr));
}
- if (m_opaque_ap.get())
- m_opaque_ap->Clear();
+ else
+ m_opaque_ap.reset();
}
lldb::addr_t
SBAddress::GetFileAddress () const
{
if (m_opaque_ap.get())
- return m_opaque_ap->GetFileAddress();
+ return m_opaque_ap->GetAddress().GetFileAddress();
else
return LLDB_INVALID_ADDRESS;
}
@@ -99,13 +167,13 @@
lldb::addr_t
SBAddress::GetLoadAddress (const SBTarget &target) const
{
- LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
+ LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
lldb::addr_t addr = LLDB_INVALID_ADDRESS;
if (m_opaque_ap.get())
{
Mutex::Locker api_locker (target->GetAPIMutex());
- addr = m_opaque_ap->GetLoadAddress (target.get());
+ addr = m_opaque_ap->GetAddress().GetLoadAddress (target.get());
}
if (log)
@@ -127,14 +195,14 @@
if (target.IsValid())
*this = target.ResolveLoadAddress(load_addr);
else
- m_opaque_ap->Clear();
+ m_opaque_ap->GetAddress().Clear();
// Check if we weren't were able to resolve a section offset address.
// If we weren't it is ok, the load address might be a location on the
// stack or heap, so we should just have an address with no section and
// a valid offset
if (!m_opaque_ap->IsValid())
- m_opaque_ap->SetOffset(load_addr);
+ m_opaque_ap->GetAddress().SetOffset(load_addr);
}
bool
@@ -142,50 +210,66 @@
{
if (m_opaque_ap.get())
{
- addr_t addr_offset = m_opaque_ap->GetOffset();
+ addr_t addr_offset = m_opaque_ap->GetAddress().GetOffset();
if (addr_offset != LLDB_INVALID_ADDRESS)
{
- m_opaque_ap->SetOffset(addr_offset + offset);
+ m_opaque_ap->GetAddress().SetOffset(addr_offset + offset);
return true;
}
}
return false;
}
-lldb_private::Address *
+lldb::SBSection
+SBAddress::GetSection ()
+{
+ lldb::SBSection sb_section;
+ if (m_opaque_ap.get())
+ sb_section.SetSection(m_opaque_ap->GetAddress().GetSection());
+ return sb_section;
+}
+
+
+Address *
SBAddress::operator->()
{
- return m_opaque_ap.get();
+ if (m_opaque_ap.get())
+ return &m_opaque_ap->GetAddress();
+ return NULL;
}
-const lldb_private::Address *
+const Address *
SBAddress::operator->() const
{
- return m_opaque_ap.get();
+ if (m_opaque_ap.get())
+ return &m_opaque_ap->GetAddress();
+ return NULL;
}
-lldb_private::Address &
+Address &
SBAddress::ref ()
{
if (m_opaque_ap.get() == NULL)
- m_opaque_ap.reset (new lldb_private::Address);
- return *m_opaque_ap;
+ m_opaque_ap.reset (new AddressImpl());
+ return m_opaque_ap->GetAddress();
}
-const lldb_private::Address &
+const Address &
SBAddress::ref () const
{
// "const SBAddress &addr" should already have checked "addr.IsValid()"
// prior to calling this function. In case you didn't we will assert
// and die to let you know.
assert (m_opaque_ap.get());
- return *m_opaque_ap;
+ return m_opaque_ap->GetAddress();
}
-lldb_private::Address *
+Address *
SBAddress::get ()
{
- return m_opaque_ap.get();
+ if (m_opaque_ap.get())
+ return &m_opaque_ap->GetAddress();
+ return NULL;
}
bool
@@ -195,26 +279,13 @@
// case there isn't one already...
description.ref();
if (m_opaque_ap.get())
- m_opaque_ap->Dump (description.get(), NULL, Address::DumpStyleModuleWithFileAddress, Address::DumpStyleInvalid, 4);
+ m_opaque_ap->GetAddress().Dump (description.get(), NULL, Address::DumpStyleModuleWithFileAddress, Address::DumpStyleInvalid, 4);
else
description.Printf ("No value");
return true;
}
-SectionType
-SBAddress::GetSectionType ()
-{
- if (m_opaque_ap.get())
- {
- const Section *section = m_opaque_ap->GetSection();
- if (section)
- return section->GetType();
- }
- return eSectionTypeInvalid;
-}
-
-
SBModule
SBAddress::GetModule ()
{
@@ -233,7 +304,7 @@
{
SBSymbolContext sb_sc;
if (m_opaque_ap.get())
- m_opaque_ap->CalculateSymbolContext (&sb_sc.ref(), resolve_scope);
+ m_opaque_ap->GetAddress().CalculateSymbolContext (&sb_sc.ref(), resolve_scope);
return sb_sc;
}
@@ -242,7 +313,7 @@
{
SBCompileUnit sb_comp_unit;
if (m_opaque_ap.get())
- sb_comp_unit.reset(m_opaque_ap->CalculateSymbolContextCompileUnit());
+ sb_comp_unit.reset(m_opaque_ap->GetAddress().CalculateSymbolContextCompileUnit());
return sb_comp_unit;
}
@@ -251,7 +322,7 @@
{
SBFunction sb_function;
if (m_opaque_ap.get())
- sb_function.reset(m_opaque_ap->CalculateSymbolContextFunction());
+ sb_function.reset(m_opaque_ap->GetAddress().CalculateSymbolContextFunction());
return sb_function;
}
@@ -260,7 +331,7 @@
{
SBBlock sb_block;
if (m_opaque_ap.get())
- sb_block.reset(m_opaque_ap->CalculateSymbolContextBlock());
+ sb_block.reset(m_opaque_ap->GetAddress().CalculateSymbolContextBlock());
return sb_block;
}
@@ -269,7 +340,7 @@
{
SBSymbol sb_symbol;
if (m_opaque_ap.get())
- sb_symbol.reset(m_opaque_ap->CalculateSymbolContextSymbol());
+ sb_symbol.reset(m_opaque_ap->GetAddress().CalculateSymbolContextSymbol());
return sb_symbol;
}
@@ -280,7 +351,7 @@
if (m_opaque_ap.get())
{
LineEntry line_entry;
- if (m_opaque_ap->CalculateSymbolContextLineEntry (line_entry))
+ if (m_opaque_ap->GetAddress().CalculateSymbolContextLineEntry (line_entry))
sb_line_entry.SetLineEntry (line_entry);
}
return sb_line_entry;