SBAddress.cpp revision 7fb143064009e34dbb7a602924e9807375f72a46
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 Clayton
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
227826c8894803dc729f29789ebc038956a94d3e7aCaroline Ticeusing namespace lldb_private;
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBAddress::SBAddress () :
2663094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_opaque_ap ()
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
303e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg ClaytonSBAddress::SBAddress (const Address *lldb_object_ptr) :
3163094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_opaque_ap ()
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (lldb_object_ptr)
3469c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton        ref() = *lldb_object_ptr;
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBAddress::SBAddress (const SBAddress &rhs) :
3863094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_opaque_ap ()
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (rhs.IsValid())
4169c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton        ref() = rhs.ref();
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4439f54ea7c3e0f9fb3bdc0d17a8def6781159d24fGreg Clayton
4539f54ea7c3e0f9fb3bdc0d17a8def6781159d24fGreg ClaytonSBAddress::SBAddress (lldb::SBSection section, lldb::addr_t offset) :
4669c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton    m_opaque_ap(new Address (section.GetSP(), offset))
4739f54ea7c3e0f9fb3bdc0d17a8def6781159d24fGreg Clayton{
4839f54ea7c3e0f9fb3bdc0d17a8def6781159d24fGreg Clayton}
4939f54ea7c3e0f9fb3bdc0d17a8def6781159d24fGreg Clayton
50a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton// Create an address by resolving a load address using the supplied target
51a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg ClaytonSBAddress::SBAddress (lldb::addr_t load_addr, lldb::SBTarget &target) :
52a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton    m_opaque_ap()
53a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton{
54a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton    SetLoadAddress (load_addr, target);
55a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton}
56a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton
57a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton
58a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBAddress::~SBAddress ()
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst SBAddress &
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBAddress::operator = (const SBAddress &rhs)
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
663e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton    if (this != &rhs)
673e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton    {
683e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        if (rhs.IsValid())
6969c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton            ref() = rhs.ref();
703e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        else
713e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton            m_opaque_ap.reset();
723e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton    }
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return *this;
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBAddress::IsValid () const
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7963094e0bb161580564954dee512955c1c79d3476Greg Clayton    return m_opaque_ap.get() != NULL && m_opaque_ap->IsValid();
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
83466f6c4c0783c6b5197059caccab94faf1e605e9Greg ClaytonSBAddress::Clear ()
84466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton{
85466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton    m_opaque_ap.reset();
86466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton}
87466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton
88466f6c4c0783c6b5197059caccab94faf1e605e9Greg Claytonvoid
8939f54ea7c3e0f9fb3bdc0d17a8def6781159d24fGreg ClaytonSBAddress::SetAddress (lldb::SBSection section, lldb::addr_t offset)
9039f54ea7c3e0f9fb3bdc0d17a8def6781159d24fGreg Clayton{
9139f54ea7c3e0f9fb3bdc0d17a8def6781159d24fGreg Clayton    Address &addr = ref();
923508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    addr.SetSection (section.GetSP());
9339f54ea7c3e0f9fb3bdc0d17a8def6781159d24fGreg Clayton    addr.SetOffset (offset);
9439f54ea7c3e0f9fb3bdc0d17a8def6781159d24fGreg Clayton}
9539f54ea7c3e0f9fb3bdc0d17a8def6781159d24fGreg Clayton
9639f54ea7c3e0f9fb3bdc0d17a8def6781159d24fGreg Clayton
9739f54ea7c3e0f9fb3bdc0d17a8def6781159d24fGreg Claytonvoid
983e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg ClaytonSBAddress::SetAddress (const Address *lldb_object_ptr)
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (lldb_object_ptr)
10169c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton        ref() =  *lldb_object_ptr;
1023e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton    else
1033e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton        m_opaque_ap.reset();
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb::addr_t
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBAddress::GetFileAddress () const
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
10963094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ap.get())
11069c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton        return m_opaque_ap->GetFileAddress();
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return LLDB_INVALID_ADDRESS;
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb::addr_t
116eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg ClaytonSBAddress::GetLoadAddress (const SBTarget &target) const
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1183e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton    LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1197826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
120bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    lldb::addr_t addr = LLDB_INVALID_ADDRESS;
121334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton    TargetSP target_sp (target.GetSP());
12263094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ap.get())
1237826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    {
124334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton        Mutex::Locker api_locker (target_sp->GetAPIMutex());
12569c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton        addr = m_opaque_ap->GetLoadAddress (target_sp.get());
1267826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    }
127bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton
128bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    if (log)
1297826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    {
130bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton        if (addr == LLDB_INVALID_ADDRESS)
131334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton            log->Printf ("SBAddress::GetLoadAddress (SBTarget(%p)) => LLDB_INVALID_ADDRESS", target_sp.get());
132bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton        else
133334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton            log->Printf ("SBAddress::GetLoadAddress (SBTarget(%p)) => 0x%llx", target_sp.get(), addr);
1347826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    }
135bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton
136bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    return addr;
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
139a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Claytonvoid
140a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg ClaytonSBAddress::SetLoadAddress (lldb::addr_t load_addr, lldb::SBTarget &target)
141a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton{
142a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton    // Create the address object if we don't already have one
143a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton    ref();
144a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton    if (target.IsValid())
145a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton        *this = target.ResolveLoadAddress(load_addr);
146a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton    else
14769c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton        m_opaque_ap->Clear();
148a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton
149a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton    // Check if we weren't were able to resolve a section offset address.
150a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton    // If we weren't it is ok, the load address might be a location on the
151a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton    // stack or heap, so we should just have an address with no section and
152a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton    // a valid offset
153a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton    if (!m_opaque_ap->IsValid())
15469c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton        m_opaque_ap->SetOffset(load_addr);
155a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton}
156a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBAddress::OffsetAddress (addr_t offset)
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
16063094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ap.get())
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
16269c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton        addr_t addr_offset = m_opaque_ap->GetOffset();
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (addr_offset != LLDB_INVALID_ADDRESS)
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
16569c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton            m_opaque_ap->SetOffset(addr_offset + offset);
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1723e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Claytonlldb::SBSection
1733e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg ClaytonSBAddress::GetSection ()
1743e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton{
1753e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton    lldb::SBSection sb_section;
1763e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton    if (m_opaque_ap.get())
17769c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton        sb_section.SetSP (m_opaque_ap->GetSection());
1783e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton    return sb_section;
1793e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton}
1803e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton
1811b925206e3c4867fea9eb55a4c6460962cf32564Greg Claytonlldb::addr_t
1821b925206e3c4867fea9eb55a4c6460962cf32564Greg ClaytonSBAddress::GetOffset ()
1831b925206e3c4867fea9eb55a4c6460962cf32564Greg Clayton{
1841b925206e3c4867fea9eb55a4c6460962cf32564Greg Clayton    if (m_opaque_ap.get())
18569c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton        m_opaque_ap->GetOffset();
1861b925206e3c4867fea9eb55a4c6460962cf32564Greg Clayton    return 0;
1871b925206e3c4867fea9eb55a4c6460962cf32564Greg Clayton}
1883e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton
1893e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg ClaytonAddress *
190466f6c4c0783c6b5197059caccab94faf1e605e9Greg ClaytonSBAddress::operator->()
191466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton{
19269c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton    return m_opaque_ap.get();
193466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton}
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1953e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Claytonconst Address *
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBAddress::operator->() const
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
19869c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton    return m_opaque_ap.get();
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2013e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg ClaytonAddress &
202a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg ClaytonSBAddress::ref ()
203466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton{
204466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton    if (m_opaque_ap.get() == NULL)
20569c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton        m_opaque_ap.reset (new Address());
20669c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton    return *m_opaque_ap;
207466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton}
208466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton
2093e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Claytonconst Address &
210a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg ClaytonSBAddress::ref () const
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
21269c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton    // This object should already have checked with "IsValid()"
213a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton    // prior to calling this function. In case you didn't we will assert
214a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton    // and die to let you know.
215466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton    assert (m_opaque_ap.get());
21669c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton    return *m_opaque_ap;
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2193e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg ClaytonAddress *
22061ba7ec20f616f907473dd501341cef5b47fa3f8Caroline TiceSBAddress::get ()
22161ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice{
22269c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton    return m_opaque_ap.get();
22361ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice}
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22598f930f429160f9777f626c3ac6aa609f4e965d2Caroline Ticebool
22698f930f429160f9777f626c3ac6aa609f4e965d2Caroline TiceSBAddress::GetDescription (SBStream &description)
22798f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice{
22849ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    // Call "ref()" on the stream to make sure it creates a backing stream in
22949ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    // case there isn't one already...
23096154be69fa240a662419183ed08e1cfc5418164Greg Clayton    Stream &strm = description.ref();
23198f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice    if (m_opaque_ap.get())
23269c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton    {
23369c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton        m_opaque_ap->Dump (&strm,
23469c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton                           NULL,
23569c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton                           Address::DumpStyleResolvedDescription,
23669c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton                           Address::DumpStyleModuleWithFileAddress,
23769c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton                           4);
23869c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton        StreamString sstrm;
23969c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton//        m_opaque_ap->Dump (&sstrm, NULL, Address::DumpStyleResolvedDescription, Address::DumpStyleInvalid, 4);
24069c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton//        if (sstrm.GetData())
24169c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton//            strm.Printf (" (%s)", sstrm.GetData());
24269c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton    }
24398f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice    else
24496154be69fa240a662419183ed08e1cfc5418164Greg Clayton        strm.PutCString ("No value");
24598f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice
24698f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice    return true;
24798f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice}
248b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton
249b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg ClaytonSBModule
250b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg ClaytonSBAddress::GetModule ()
251b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton{
252b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton    SBModule sb_module;
253b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton    if (m_opaque_ap.get())
25469c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton        sb_module.SetSP (m_opaque_ap->GetModule());
255b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton    return sb_module;
256b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton}
257b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton
258c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBSymbolContext
259c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBAddress::GetSymbolContext (uint32_t resolve_scope)
260c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{
261c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    SBSymbolContext sb_sc;
262c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    if (m_opaque_ap.get())
26369c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton        m_opaque_ap->CalculateSymbolContext (&sb_sc.ref(), resolve_scope);
264c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    return sb_sc;
265c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton}
266c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
267c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBCompileUnit
268c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBAddress::GetCompileUnit ()
269c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{
270c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    SBCompileUnit sb_comp_unit;
271c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    if (m_opaque_ap.get())
27269c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton        sb_comp_unit.reset(m_opaque_ap->CalculateSymbolContextCompileUnit());
273c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    return sb_comp_unit;
274c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton}
275c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
276c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBFunction
277c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBAddress::GetFunction ()
278c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{
279c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    SBFunction sb_function;
280c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    if (m_opaque_ap.get())
28169c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton        sb_function.reset(m_opaque_ap->CalculateSymbolContextFunction());
282c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    return sb_function;
283c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton}
284c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
285c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBBlock
286c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBAddress::GetBlock ()
287c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{
288c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    SBBlock sb_block;
289c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    if (m_opaque_ap.get())
29069c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton        sb_block.SetPtr(m_opaque_ap->CalculateSymbolContextBlock());
291c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    return sb_block;
292c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton}
293c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
294c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBSymbol
295c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBAddress::GetSymbol ()
296c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{
297c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    SBSymbol sb_symbol;
298c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    if (m_opaque_ap.get())
29969c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton        sb_symbol.reset(m_opaque_ap->CalculateSymbolContextSymbol());
300c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    return sb_symbol;
301c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton}
302c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
303c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBLineEntry
304c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBAddress::GetLineEntry ()
305c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{
306c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    SBLineEntry sb_line_entry;
307c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    if (m_opaque_ap.get())
308c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    {
309c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton        LineEntry line_entry;
31069c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton        if (m_opaque_ap->CalculateSymbolContextLineEntry (line_entry))
311c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton            sb_line_entry.SetLineEntry (line_entry);
312c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    }
313c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    return sb_line_entry;
314c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton}
315c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
3167fb143064009e34dbb7a602924e9807375f72a46Greg ClaytonAddressClass
3177fb143064009e34dbb7a602924e9807375f72a46Greg ClaytonSBAddress::GetAddressClass ()
3187fb143064009e34dbb7a602924e9807375f72a46Greg Clayton{
3197fb143064009e34dbb7a602924e9807375f72a46Greg Clayton    if (m_opaque_ap.get())
3207fb143064009e34dbb7a602924e9807375f72a46Greg Clayton        return m_opaque_ap->GetAddressClass();
3217fb143064009e34dbb7a602924e9807375f72a46Greg Clayton    return eAddressClassInvalid;
3227fb143064009e34dbb7a602924e9807375f72a46Greg Clayton}
323b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton
324