diff options
-rw-r--r-- | lldb/include/lldb/API/SBAddress.h | 18 | ||||
-rw-r--r-- | lldb/include/lldb/API/SBTarget.h | 6 | ||||
-rw-r--r-- | lldb/scripts/Python/interface/SBAddress.i | 7 | ||||
-rw-r--r-- | lldb/scripts/Python/interface/SBTarget.i | 5 | ||||
-rw-r--r-- | lldb/source/API/SBAddress.cpp | 34 | ||||
-rw-r--r-- | lldb/source/API/SBModule.cpp | 4 | ||||
-rw-r--r-- | lldb/source/API/SBTarget.cpp | 22 | ||||
-rw-r--r-- | lldb/test/python_api/default-constructor/sb_target.py | 3 |
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) |