SBAddress.cpp revision 334d33a19fd28cf41cba74cc61cf149e7101a603
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- SBAddress.cpp -------------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/API/SBAddress.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/API/SBProcess.h"
123e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton#include "lldb/API/SBSection.h"
1398f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice#include "lldb/API/SBStream.h"
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Address.h"
157826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice#include "lldb/Core/Log.h"
16b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton#include "lldb/Core/Module.h"
17bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton#include "lldb/Host/Mutex.h"
18bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton#include "lldb/Target/Target.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
203e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Claytonnamespace lldb_private
213e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton{
223e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton    // We need a address implementation to hold onto a reference to the module
233e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton    // since if the module goes away and we have anyone still holding onto a
243e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton    // SBAddress object, we could crash.
253e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton    class AddressImpl
263e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton    {
273e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton    public:
283e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        AddressImpl () :
293e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton            m_module_sp(),
303e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton            m_address()
313e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        {
323e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        }
333e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton
343e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        AddressImpl (const Address &addr) :
3513d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton            m_module_sp (addr.GetModuleSP()),
363e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton            m_address (addr)
373e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        {
383e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        }
393e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton
403e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        AddressImpl (const AddressImpl &rhs) :
413e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton            m_module_sp (rhs.m_module_sp),
423e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton            m_address   (rhs.m_address)
433e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        {
443e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        }
453e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton
463e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        bool
473e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        IsValid () const
483e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        {
493e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton            return m_address.IsValid();
503e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        }
513e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton
523e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        void
533e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        operator = (const AddressImpl &rhs)
543e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        {
553e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton            m_module_sp = rhs.m_module_sp;
563e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton            m_address = rhs.m_address;
573e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        }
583e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton
593e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        Address &
603e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        GetAddress ()
613e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        {
623e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton            return m_address;
633e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        }
643e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton
653e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        Module *
663e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        GetModule()
673e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        {
683e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton            return m_module_sp.get();
693e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        }
703e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton
713e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        const lldb::ModuleSP &
723e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        GetModuleSP() const
733e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        {
743e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton            return m_module_sp;
753e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        }
763e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton    protected:
773e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        lldb::ModuleSP m_module_sp;
783e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        Address m_address;
793e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton    };
803e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton}
813e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton
823e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
847826c8894803dc729f29789ebc038956a94d3e7aCaroline Ticeusing namespace lldb_private;
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBAddress::SBAddress () :
8863094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_opaque_ap ()
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
923e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg ClaytonSBAddress::SBAddress (const Address *lldb_object_ptr) :
9363094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_opaque_ap ()
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (lldb_object_ptr)
963e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        m_opaque_ap.reset (new AddressImpl(*lldb_object_ptr));
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBAddress::SBAddress (const SBAddress &rhs) :
10063094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_opaque_ap ()
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (rhs.IsValid())
1033e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        m_opaque_ap.reset (new AddressImpl(*rhs.m_opaque_ap.get()));
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
106a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton// Create an address by resolving a load address using the supplied target
107a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg ClaytonSBAddress::SBAddress (lldb::addr_t load_addr, lldb::SBTarget &target) :
108a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton    m_opaque_ap()
109a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton{
110a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton    SetLoadAddress (load_addr, target);
111a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton}
112a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton
113a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton
114a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBAddress::~SBAddress ()
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst SBAddress &
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBAddress::operator = (const SBAddress &rhs)
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1223e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton    if (this != &rhs)
1233e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton    {
1243e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        if (rhs.IsValid())
1253e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton            m_opaque_ap.reset(new AddressImpl(*rhs.m_opaque_ap.get()));
1263e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        else
1273e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton            m_opaque_ap.reset();
1283e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton    }
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return *this;
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBAddress::IsValid () const
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
13563094e0bb161580564954dee512955c1c79d3476Greg Clayton    return m_opaque_ap.get() != NULL && m_opaque_ap->IsValid();
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
139466f6c4c0783c6b5197059caccab94faf1e605e9Greg ClaytonSBAddress::Clear ()
140466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton{
141466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton    m_opaque_ap.reset();
142466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton}
143466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton
144466f6c4c0783c6b5197059caccab94faf1e605e9Greg Claytonvoid
1453e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg ClaytonSBAddress::SetAddress (const Address *lldb_object_ptr)
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (lldb_object_ptr)
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
14963094e0bb161580564954dee512955c1c79d3476Greg Clayton        if (m_opaque_ap.get())
15063094e0bb161580564954dee512955c1c79d3476Greg Clayton            *m_opaque_ap = *lldb_object_ptr;
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
1523e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton            m_opaque_ap.reset (new AddressImpl(*lldb_object_ptr));
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
1543e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton    else
1553e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        m_opaque_ap.reset();
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb::addr_t
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBAddress::GetFileAddress () const
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
16163094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ap.get())
1623e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        return m_opaque_ap->GetAddress().GetFileAddress();
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return LLDB_INVALID_ADDRESS;
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb::addr_t
168eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg ClaytonSBAddress::GetLoadAddress (const SBTarget &target) const
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1703e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton    LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1717826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
172bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    lldb::addr_t addr = LLDB_INVALID_ADDRESS;
173334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton    TargetSP target_sp (target.GetSP());
17463094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ap.get())
1757826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    {
176334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton        Mutex::Locker api_locker (target_sp->GetAPIMutex());
177334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton        addr = m_opaque_ap->GetAddress().GetLoadAddress (target_sp.get());
1787826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    }
179bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton
180bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    if (log)
1817826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    {
182bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton        if (addr == LLDB_INVALID_ADDRESS)
183334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton            log->Printf ("SBAddress::GetLoadAddress (SBTarget(%p)) => LLDB_INVALID_ADDRESS", target_sp.get());
184bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton        else
185334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton            log->Printf ("SBAddress::GetLoadAddress (SBTarget(%p)) => 0x%llx", target_sp.get(), addr);
1867826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    }
187bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton
188bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    return addr;
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
191a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Claytonvoid
192a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg ClaytonSBAddress::SetLoadAddress (lldb::addr_t load_addr, lldb::SBTarget &target)
193a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton{
194a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton    // Create the address object if we don't already have one
195a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton    ref();
196a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton    if (target.IsValid())
197a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton        *this = target.ResolveLoadAddress(load_addr);
198a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton    else
1993e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        m_opaque_ap->GetAddress().Clear();
200a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton
201a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton    // Check if we weren't were able to resolve a section offset address.
202a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton    // If we weren't it is ok, the load address might be a location on the
203a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton    // stack or heap, so we should just have an address with no section and
204a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton    // a valid offset
205a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton    if (!m_opaque_ap->IsValid())
2063e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        m_opaque_ap->GetAddress().SetOffset(load_addr);
207a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton}
208a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBAddress::OffsetAddress (addr_t offset)
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
21263094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ap.get())
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2143e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        addr_t addr_offset = m_opaque_ap->GetAddress().GetOffset();
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (addr_offset != LLDB_INVALID_ADDRESS)
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
2173e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton            m_opaque_ap->GetAddress().SetOffset(addr_offset + offset);
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2243e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Claytonlldb::SBSection
2253e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg ClaytonSBAddress::GetSection ()
2263e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton{
2273e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton    lldb::SBSection sb_section;
2283e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton    if (m_opaque_ap.get())
2293e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        sb_section.SetSection(m_opaque_ap->GetAddress().GetSection());
2303e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton    return sb_section;
2313e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton}
2323e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton
2331b925206e3c4867fea9eb55a4c6460962cf32564Greg Claytonlldb::addr_t
2341b925206e3c4867fea9eb55a4c6460962cf32564Greg ClaytonSBAddress::GetOffset ()
2351b925206e3c4867fea9eb55a4c6460962cf32564Greg Clayton{
2361b925206e3c4867fea9eb55a4c6460962cf32564Greg Clayton    if (m_opaque_ap.get())
2371b925206e3c4867fea9eb55a4c6460962cf32564Greg Clayton        m_opaque_ap->GetAddress().GetOffset();
2381b925206e3c4867fea9eb55a4c6460962cf32564Greg Clayton    return 0;
2391b925206e3c4867fea9eb55a4c6460962cf32564Greg Clayton}
2403e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton
2413e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg ClaytonAddress *
242466f6c4c0783c6b5197059caccab94faf1e605e9Greg ClaytonSBAddress::operator->()
243466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton{
2443e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton    if (m_opaque_ap.get())
2453e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        return &m_opaque_ap->GetAddress();
2463e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton    return NULL;
247466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton}
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2493e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Claytonconst Address *
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBAddress::operator->() const
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2523e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton    if (m_opaque_ap.get())
2533e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        return &m_opaque_ap->GetAddress();
2543e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton    return NULL;
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2573e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg ClaytonAddress &
258a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg ClaytonSBAddress::ref ()
259466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton{
260466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton    if (m_opaque_ap.get() == NULL)
2613e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        m_opaque_ap.reset (new AddressImpl());
2623e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton    return m_opaque_ap->GetAddress();
263466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton}
264466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton
2653e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Claytonconst Address &
266a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg ClaytonSBAddress::ref () const
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
268a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton    // "const SBAddress &addr" should already have checked "addr.IsValid()"
269a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton    // prior to calling this function. In case you didn't we will assert
270a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton    // and die to let you know.
271466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton    assert (m_opaque_ap.get());
2723e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton    return m_opaque_ap->GetAddress();
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2753e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg ClaytonAddress *
27661ba7ec20f616f907473dd501341cef5b47fa3f8Caroline TiceSBAddress::get ()
27761ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice{
2783e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton    if (m_opaque_ap.get())
2793e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        return &m_opaque_ap->GetAddress();
2803e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton    return NULL;
28161ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice}
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28398f930f429160f9777f626c3ac6aa609f4e965d2Caroline Ticebool
28498f930f429160f9777f626c3ac6aa609f4e965d2Caroline TiceSBAddress::GetDescription (SBStream &description)
28598f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice{
28649ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    // Call "ref()" on the stream to make sure it creates a backing stream in
28749ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    // case there isn't one already...
28896154be69fa240a662419183ed08e1cfc5418164Greg Clayton    Stream &strm = description.ref();
28998f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice    if (m_opaque_ap.get())
29096154be69fa240a662419183ed08e1cfc5418164Greg Clayton        m_opaque_ap->GetAddress().Dump (&strm, NULL, Address::DumpStyleModuleWithFileAddress, Address::DumpStyleInvalid, 4);
29198f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice    else
29296154be69fa240a662419183ed08e1cfc5418164Greg Clayton        strm.PutCString ("No value");
29398f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice
29498f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice    return true;
29598f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice}
296b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton
297b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg ClaytonSBModule
298b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg ClaytonSBAddress::GetModule ()
299b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton{
300b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton    SBModule sb_module;
301b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton    if (m_opaque_ap.get())
302b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton    {
30302e210cad27e36108bef493b798c2c1eb3b04cb8Greg Clayton        Module *module = m_opaque_ap->GetModule();
304b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton        if (module)
30513d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton            *sb_module = module->shared_from_this();
306b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton    }
307b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton    return sb_module;
308b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton}
309b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton
310c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBSymbolContext
311c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBAddress::GetSymbolContext (uint32_t resolve_scope)
312c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{
313c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    SBSymbolContext sb_sc;
314c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    if (m_opaque_ap.get())
3153e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        m_opaque_ap->GetAddress().CalculateSymbolContext (&sb_sc.ref(), resolve_scope);
316c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    return sb_sc;
317c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton}
318c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
319c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBCompileUnit
320c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBAddress::GetCompileUnit ()
321c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{
322c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    SBCompileUnit sb_comp_unit;
323c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    if (m_opaque_ap.get())
3243e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        sb_comp_unit.reset(m_opaque_ap->GetAddress().CalculateSymbolContextCompileUnit());
325c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    return sb_comp_unit;
326c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton}
327c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
328c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBFunction
329c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBAddress::GetFunction ()
330c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{
331c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    SBFunction sb_function;
332c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    if (m_opaque_ap.get())
3333e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        sb_function.reset(m_opaque_ap->GetAddress().CalculateSymbolContextFunction());
334c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    return sb_function;
335c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton}
336c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
337c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBBlock
338c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBAddress::GetBlock ()
339c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{
340c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    SBBlock sb_block;
341c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    if (m_opaque_ap.get())
3423e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        sb_block.reset(m_opaque_ap->GetAddress().CalculateSymbolContextBlock());
343c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    return sb_block;
344c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton}
345c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
346c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBSymbol
347c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBAddress::GetSymbol ()
348c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{
349c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    SBSymbol sb_symbol;
350c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    if (m_opaque_ap.get())
3513e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        sb_symbol.reset(m_opaque_ap->GetAddress().CalculateSymbolContextSymbol());
352c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    return sb_symbol;
353c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton}
354c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
355c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBLineEntry
356c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBAddress::GetLineEntry ()
357c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{
358c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    SBLineEntry sb_line_entry;
359c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    if (m_opaque_ap.get())
360c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    {
361c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton        LineEntry line_entry;
3623e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        if (m_opaque_ap->GetAddress().CalculateSymbolContextLineEntry (line_entry))
363c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton            sb_line_entry.SetLineEntry (line_entry);
364c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    }
365c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    return sb_line_entry;
366c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton}
367c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
368b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton
369