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{
118952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1197826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
120bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    lldb::addr_t addr = LLDB_INVALID_ADDRESS;
121334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton    TargetSP target_sp (target.GetSP());
1226837dfd894dffac06d0c02fcf10064b2012de3ddGreg Clayton    if (target_sp)
1237826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    {
1246837dfd894dffac06d0c02fcf10064b2012de3ddGreg Clayton        if (m_opaque_ap.get())
1256837dfd894dffac06d0c02fcf10064b2012de3ddGreg Clayton        {
1266837dfd894dffac06d0c02fcf10064b2012de3ddGreg Clayton            Mutex::Locker api_locker (target_sp->GetAPIMutex());
1276837dfd894dffac06d0c02fcf10064b2012de3ddGreg Clayton            addr = m_opaque_ap->GetLoadAddress (target_sp.get());
1286837dfd894dffac06d0c02fcf10064b2012de3ddGreg Clayton        }
1297826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    }
130bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton
131bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    if (log)
1327826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    {
133bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton        if (addr == LLDB_INVALID_ADDRESS)
134334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton            log->Printf ("SBAddress::GetLoadAddress (SBTarget(%p)) => LLDB_INVALID_ADDRESS", target_sp.get());
135bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton        else
1365f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea            log->Printf ("SBAddress::GetLoadAddress (SBTarget(%p)) => 0x%" PRIx64, target_sp.get(), addr);
1377826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    }
138bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton
139bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    return addr;
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
142a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Claytonvoid
143a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg ClaytonSBAddress::SetLoadAddress (lldb::addr_t load_addr, lldb::SBTarget &target)
144a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton{
145a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton    // Create the address object if we don't already have one
146a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton    ref();
147a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton    if (target.IsValid())
148a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton        *this = target.ResolveLoadAddress(load_addr);
149a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton    else
15069c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton        m_opaque_ap->Clear();
151a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton
152a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton    // Check if we weren't were able to resolve a section offset address.
153a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton    // If we weren't it is ok, the load address might be a location on the
154a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton    // stack or heap, so we should just have an address with no section and
155a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton    // a valid offset
156a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton    if (!m_opaque_ap->IsValid())
15769c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton        m_opaque_ap->SetOffset(load_addr);
158a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton}
159a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBAddress::OffsetAddress (addr_t offset)
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
16363094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ap.get())
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
16569c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton        addr_t addr_offset = m_opaque_ap->GetOffset();
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (addr_offset != LLDB_INVALID_ADDRESS)
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
16869c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton            m_opaque_ap->SetOffset(addr_offset + offset);
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1753e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Claytonlldb::SBSection
1763e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg ClaytonSBAddress::GetSection ()
1773e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton{
1783e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton    lldb::SBSection sb_section;
1793e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton    if (m_opaque_ap.get())
18069c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton        sb_section.SetSP (m_opaque_ap->GetSection());
1813e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton    return sb_section;
1823e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton}
1833e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton
1841b925206e3c4867fea9eb55a4c6460962cf32564Greg Claytonlldb::addr_t
1851b925206e3c4867fea9eb55a4c6460962cf32564Greg ClaytonSBAddress::GetOffset ()
1861b925206e3c4867fea9eb55a4c6460962cf32564Greg Clayton{
1871b925206e3c4867fea9eb55a4c6460962cf32564Greg Clayton    if (m_opaque_ap.get())
188aaf00885e53cfe26b3b89376f97096a9a3ef3b81Greg Clayton        return m_opaque_ap->GetOffset();
1891b925206e3c4867fea9eb55a4c6460962cf32564Greg Clayton    return 0;
1901b925206e3c4867fea9eb55a4c6460962cf32564Greg Clayton}
1913e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton
1923e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg ClaytonAddress *
193466f6c4c0783c6b5197059caccab94faf1e605e9Greg ClaytonSBAddress::operator->()
194466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton{
19569c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton    return m_opaque_ap.get();
196466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton}
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1983e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Claytonconst Address *
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBAddress::operator->() const
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
20169c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton    return m_opaque_ap.get();
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2043e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg ClaytonAddress &
205a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg ClaytonSBAddress::ref ()
206466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton{
207466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton    if (m_opaque_ap.get() == NULL)
20869c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton        m_opaque_ap.reset (new Address());
20969c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton    return *m_opaque_ap;
210466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton}
211466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton
2123e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Claytonconst Address &
213a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg ClaytonSBAddress::ref () const
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
21569c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton    // This object should already have checked with "IsValid()"
216a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton    // prior to calling this function. In case you didn't we will assert
217a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton    // and die to let you know.
218466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton    assert (m_opaque_ap.get());
21969c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton    return *m_opaque_ap;
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2223e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg ClaytonAddress *
22361ba7ec20f616f907473dd501341cef5b47fa3f8Caroline TiceSBAddress::get ()
22461ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice{
22569c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton    return m_opaque_ap.get();
22661ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice}
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22898f930f429160f9777f626c3ac6aa609f4e965d2Caroline Ticebool
22998f930f429160f9777f626c3ac6aa609f4e965d2Caroline TiceSBAddress::GetDescription (SBStream &description)
23098f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice{
23149ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    // Call "ref()" on the stream to make sure it creates a backing stream in
23249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    // case there isn't one already...
23396154be69fa240a662419183ed08e1cfc5418164Greg Clayton    Stream &strm = description.ref();
23498f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice    if (m_opaque_ap.get())
23569c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton    {
23669c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton        m_opaque_ap->Dump (&strm,
23769c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton                           NULL,
23869c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton                           Address::DumpStyleResolvedDescription,
23969c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton                           Address::DumpStyleModuleWithFileAddress,
24069c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton                           4);
24169c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton        StreamString sstrm;
24269c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton//        m_opaque_ap->Dump (&sstrm, NULL, Address::DumpStyleResolvedDescription, Address::DumpStyleInvalid, 4);
24369c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton//        if (sstrm.GetData())
24469c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton//            strm.Printf (" (%s)", sstrm.GetData());
24569c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton    }
24698f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice    else
24796154be69fa240a662419183ed08e1cfc5418164Greg Clayton        strm.PutCString ("No value");
24898f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice
24998f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice    return true;
25098f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice}
251b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton
252b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg ClaytonSBModule
253b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg ClaytonSBAddress::GetModule ()
254b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton{
255b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton    SBModule sb_module;
256b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton    if (m_opaque_ap.get())
25769c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton        sb_module.SetSP (m_opaque_ap->GetModule());
258b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton    return sb_module;
259b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton}
260b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton
261c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBSymbolContext
262c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBAddress::GetSymbolContext (uint32_t resolve_scope)
263c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{
264c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    SBSymbolContext sb_sc;
265c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    if (m_opaque_ap.get())
26669c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton        m_opaque_ap->CalculateSymbolContext (&sb_sc.ref(), resolve_scope);
267c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    return sb_sc;
268c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton}
269c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
270c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBCompileUnit
271c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBAddress::GetCompileUnit ()
272c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{
273c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    SBCompileUnit sb_comp_unit;
274c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    if (m_opaque_ap.get())
27569c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton        sb_comp_unit.reset(m_opaque_ap->CalculateSymbolContextCompileUnit());
276c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    return sb_comp_unit;
277c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton}
278c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
279c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBFunction
280c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBAddress::GetFunction ()
281c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{
282c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    SBFunction sb_function;
283c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    if (m_opaque_ap.get())
28469c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton        sb_function.reset(m_opaque_ap->CalculateSymbolContextFunction());
285c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    return sb_function;
286c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton}
287c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
288c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBBlock
289c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBAddress::GetBlock ()
290c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{
291c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    SBBlock sb_block;
292c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    if (m_opaque_ap.get())
29369c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton        sb_block.SetPtr(m_opaque_ap->CalculateSymbolContextBlock());
294c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    return sb_block;
295c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton}
296c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
297c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBSymbol
298c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBAddress::GetSymbol ()
299c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{
300c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    SBSymbol sb_symbol;
301c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    if (m_opaque_ap.get())
30269c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton        sb_symbol.reset(m_opaque_ap->CalculateSymbolContextSymbol());
303c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    return sb_symbol;
304c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton}
305c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
306c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBLineEntry
307c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBAddress::GetLineEntry ()
308c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{
309c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    SBLineEntry sb_line_entry;
310c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    if (m_opaque_ap.get())
311c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    {
312c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton        LineEntry line_entry;
31369c540dc5b2b498e4bb9a4cb8d7cd4e3c993bbbcGreg Clayton        if (m_opaque_ap->CalculateSymbolContextLineEntry (line_entry))
314c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton            sb_line_entry.SetLineEntry (line_entry);
315c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    }
316c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    return sb_line_entry;
317c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton}
318c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
3197fb143064009e34dbb7a602924e9807375f72a46Greg ClaytonAddressClass
3207fb143064009e34dbb7a602924e9807375f72a46Greg ClaytonSBAddress::GetAddressClass ()
3217fb143064009e34dbb7a602924e9807375f72a46Greg Clayton{
3227fb143064009e34dbb7a602924e9807375f72a46Greg Clayton    if (m_opaque_ap.get())
3237fb143064009e34dbb7a602924e9807375f72a46Greg Clayton        return m_opaque_ap->GetAddressClass();
3247fb143064009e34dbb7a602924e9807375f72a46Greg Clayton    return eAddressClassInvalid;
3257fb143064009e34dbb7a602924e9807375f72a46Greg Clayton}
326b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton
327