forked from OSchip/llvm-project
Make the SBAddress class easier to use when using the public
API. SBTarget changes include changing: bool SBTarget::ResolveLoadAddress (lldb::addr_t vm_addr, lldb::SBAddress& addr); to be: lldb::SBAddress SBTarget::ResolveLoadAddress (lldb::addr_t vm_addr); SBAddress can how contruct itself using a load address and a target which can be used to resolve the address: SBAddress (lldb::addr_t load_addr, lldb::SBTarget &target); This will actually just call the new SetLoadAddress accessor: void SetLoadAddress (lldb::addr_t load_addr, lldb::SBTarget &target); This function will always succeed in making a SBAddress object that can be used in API calls (even if "target" isn't valid). If "target" is valid and there are sections currently loaded, then it will resolve the address to a section offset address if it can. Else an address with a NULL section and an offset that is the "load_addr" that was passed in. We do this because a load address might be from the heap or stack. llvm-svn: 135770
This commit is contained in:
parent
c567ba26e9
commit
00e6fbfee9
|
@ -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 &
|
||||
operator*();
|
||||
|
||||
lldb_private::Address *
|
||||
get ();
|
||||
|
||||
|
||||
lldb_private::Address &
|
||||
ref();
|
||||
|
||||
const lldb_private::Address &
|
||||
ref() const;
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue