summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/include/lldb/API/SBAddress.h18
-rw-r--r--lldb/include/lldb/API/SBTarget.h6
-rw-r--r--lldb/scripts/Python/interface/SBAddress.i7
-rw-r--r--lldb/scripts/Python/interface/SBTarget.i5
-rw-r--r--lldb/source/API/SBAddress.cpp34
-rw-r--r--lldb/source/API/SBModule.cpp4
-rw-r--r--lldb/source/API/SBTarget.cpp22
-rw-r--r--lldb/test/python_api/default-constructor/sb_target.py3
8 files changed, 72 insertions, 27 deletions
diff --git a/lldb/include/lldb/API/SBAddress.h b/lldb/include/lldb/API/SBAddress.h
index 3b45a154e37..6c06cdd8907 100644
--- a/lldb/include/lldb/API/SBAddress.h
+++ b/lldb/include/lldb/API/SBAddress.h
@@ -23,6 +23,9 @@ public:
SBAddress (const lldb::SBAddress &rhs);
+ // Create an address by resolving a load address using the supplied target
+ SBAddress (lldb::addr_t load_addr, lldb::SBTarget &target);
+
~SBAddress ();
#ifndef SWIG
@@ -42,6 +45,9 @@ public:
addr_t
GetLoadAddress (const lldb::SBTarget &target) const;
+ void
+ SetLoadAddress (lldb::addr_t load_addr,
+ lldb::SBTarget &target);
bool
OffsetAddress (addr_t offset);
@@ -74,15 +80,15 @@ protected:
const lldb_private::Address *
operator->() const;
- const lldb_private::Address &
- operator*() const;
+ lldb_private::Address *
+ get ();
lldb_private::Address &
- operator*();
+ ref();
+
+ const lldb_private::Address &
+ ref() const;
- lldb_private::Address *
- get ();
-
#endif
diff --git a/lldb/include/lldb/API/SBTarget.h b/lldb/include/lldb/API/SBTarget.h
index e34e679c6cf..574211595e3 100644
--- a/lldb/include/lldb/API/SBTarget.h
+++ b/lldb/include/lldb/API/SBTarget.h
@@ -11,6 +11,7 @@
#define LLDB_SBTarget_h_
#include "lldb/API/SBDefines.h"
+#include "lldb/API/SBAddress.h"
#include "lldb/API/SBBroadcaster.h"
#include "lldb/API/SBFileSpec.h"
@@ -296,9 +297,8 @@ public:
void
Clear ();
- bool
- ResolveLoadAddress (lldb::addr_t vm_addr,
- lldb::SBAddress& addr);
+ lldb::SBAddress
+ ResolveLoadAddress (lldb::addr_t vm_addr);
SBSymbolContext
ResolveSymbolContextForAddress (const SBAddress& addr,
diff --git a/lldb/scripts/Python/interface/SBAddress.i b/lldb/scripts/Python/interface/SBAddress.i
index 83d624fb927..91b483b48df 100644
--- a/lldb/scripts/Python/interface/SBAddress.i
+++ b/lldb/scripts/Python/interface/SBAddress.i
@@ -50,6 +50,9 @@ public:
SBAddress (const lldb::SBAddress &rhs);
+ // Create an address by resolving a load address using the supplied target
+ SBAddress (lldb::addr_t load_addr, lldb::SBTarget &target);
+
~SBAddress ();
bool
@@ -64,6 +67,10 @@ public:
addr_t
GetLoadAddress (const lldb::SBTarget &target) const;
+ void
+ SetLoadAddress (lldb::addr_t load_addr,
+ lldb::SBTarget &target);
+
bool
OffsetAddress (addr_t offset);
diff --git a/lldb/scripts/Python/interface/SBTarget.i b/lldb/scripts/Python/interface/SBTarget.i
index 30626566f52..3ad6bed704a 100644
--- a/lldb/scripts/Python/interface/SBTarget.i
+++ b/lldb/scripts/Python/interface/SBTarget.i
@@ -343,9 +343,8 @@ public:
void
Clear ();
- bool
- ResolveLoadAddress (lldb::addr_t vm_addr,
- lldb::SBAddress& addr);
+ lldb::SBAddress
+ ResolveLoadAddress (lldb::addr_t vm_addr);
SBSymbolContext
ResolveSymbolContextForAddress (const SBAddress& addr,
diff --git a/lldb/source/API/SBAddress.cpp b/lldb/source/API/SBAddress.cpp
index 6c357f9ef53..57b58bf6d0a 100644
--- a/lldb/source/API/SBAddress.cpp
+++ b/lldb/source/API/SBAddress.cpp
@@ -39,6 +39,15 @@ SBAddress::SBAddress (const SBAddress &rhs) :
m_opaque_ap.reset (new lldb_private::Address(*rhs.m_opaque_ap.get()));
}
+// Create an address by resolving a load address using the supplied target
+SBAddress::SBAddress (lldb::addr_t load_addr, lldb::SBTarget &target) :
+ m_opaque_ap()
+{
+ SetLoadAddress (load_addr, target);
+}
+
+
+
SBAddress::~SBAddress ()
{
}
@@ -110,6 +119,24 @@ SBAddress::GetLoadAddress (const SBTarget &target) const
return addr;
}
+void
+SBAddress::SetLoadAddress (lldb::addr_t load_addr, lldb::SBTarget &target)
+{
+ // Create the address object if we don't already have one
+ ref();
+ if (target.IsValid())
+ *this = target.ResolveLoadAddress(load_addr);
+ else
+ m_opaque_ap->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);
+}
+
bool
SBAddress::OffsetAddress (addr_t offset)
{
@@ -138,7 +165,7 @@ SBAddress::operator->() const
}
lldb_private::Address &
-SBAddress::operator*()
+SBAddress::ref ()
{
if (m_opaque_ap.get() == NULL)
m_opaque_ap.reset (new lldb_private::Address);
@@ -146,8 +173,11 @@ SBAddress::operator*()
}
const lldb_private::Address &
-SBAddress::operator*() const
+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;
}
diff --git a/lldb/source/API/SBModule.cpp b/lldb/source/API/SBModule.cpp
index 53172f349ca..852952af303 100644
--- a/lldb/source/API/SBModule.cpp
+++ b/lldb/source/API/SBModule.cpp
@@ -228,7 +228,7 @@ bool
SBModule::ResolveFileAddress (lldb::addr_t vm_addr, SBAddress& addr)
{
if (m_opaque_sp && addr.IsValid())
- return m_opaque_sp->ResolveFileAddress (vm_addr, *addr);
+ return m_opaque_sp->ResolveFileAddress (vm_addr, addr.ref());
if (addr.IsValid())
addr->Clear();
@@ -240,7 +240,7 @@ SBModule::ResolveSymbolContextForAddress (const SBAddress& addr, uint32_t resolv
{
SBSymbolContext sb_sc;
if (m_opaque_sp && addr.IsValid())
- m_opaque_sp->ResolveSymbolContextForAddress (*addr, resolve_scope, *sb_sc);
+ m_opaque_sp->ResolveSymbolContextForAddress (addr.ref(), resolve_scope, *sb_sc);
return sb_sc;
}
diff --git a/lldb/source/API/SBTarget.cpp b/lldb/source/API/SBTarget.cpp
index 6a17bb4cc69..22504402115 100644
--- a/lldb/source/API/SBTarget.cpp
+++ b/lldb/source/API/SBTarget.cpp
@@ -503,19 +503,23 @@ SBTarget::reset (const lldb::TargetSP& target_sp)
m_opaque_sp = target_sp;
}
-bool
-SBTarget::ResolveLoadAddress (lldb::addr_t vm_addr,
- lldb::SBAddress& addr)
+lldb::SBAddress
+SBTarget::ResolveLoadAddress (lldb::addr_t vm_addr)
{
- if (m_opaque_sp && addr.IsValid())
+ lldb::SBAddress sb_addr;
+ Address &addr = sb_addr.ref();
+ if (m_opaque_sp)
{
Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
- return m_opaque_sp->GetSectionLoadList().ResolveLoadAddress (vm_addr, *addr);
+ if (m_opaque_sp->GetSectionLoadList().ResolveLoadAddress (vm_addr, addr))
+ return sb_addr;
}
- if (addr.IsValid())
- addr->Clear();
- return false;
+ // We have a load address that isn't in a section, just return an address
+ // with the offset filled in (the address) and the section set to NULL
+ addr.SetSection(NULL);
+ addr.SetOffset(vm_addr);
+ return sb_addr;
}
SBSymbolContext
@@ -523,7 +527,7 @@ SBTarget::ResolveSymbolContextForAddress (const SBAddress& addr, uint32_t resolv
{
SBSymbolContext sc;
if (m_opaque_sp && addr.IsValid())
- m_opaque_sp->GetImages().ResolveSymbolContextForAddress (*addr, resolve_scope, sc.ref());
+ m_opaque_sp->GetImages().ResolveSymbolContextForAddress (addr.ref(), resolve_scope, sc.ref());
return sc;
}
diff --git a/lldb/test/python_api/default-constructor/sb_target.py b/lldb/test/python_api/default-constructor/sb_target.py
index df55149bbad..f4b4dd45bc0 100644
--- a/lldb/test/python_api/default-constructor/sb_target.py
+++ b/lldb/test/python_api/default-constructor/sb_target.py
@@ -23,8 +23,7 @@ def fuzz_obj(obj):
contextlist = lldb.SBSymbolContextList()
obj.FindFunctions("the_func", 0xff, True, contextlist)
obj.FindGlobalVariables("my_global_var", 1)
- address = lldb.SBAddress()
- obj.ResolveLoadAddress(0xffff, address)
+ address = obj.ResolveLoadAddress(0xffff)
obj.ResolveSymbolContextForAddress(address, 0)
obj.BreakpointCreateByLocation("filename", 20)
obj.BreakpointCreateByLocation(filespec, 20)
OpenPOWER on IntegriCloud