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:
Greg Clayton 2011-07-22 16:46:35 +00:00
parent c567ba26e9
commit 00e6fbfee9
8 changed files with 73 additions and 28 deletions

View File

@ -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

View File

@ -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,

View File

@ -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);

View File

@ -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,

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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)