SBAddress.cpp revision 61ba7ec20f616f907473dd501341cef5b47fa3f8
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"
1298f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice#include "lldb/API/SBStream.h"
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Address.h"
147826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice#include "lldb/Core/Log.h"
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
177826c8894803dc729f29789ebc038956a94d3e7aCaroline Ticeusing namespace lldb_private;
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBAddress::SBAddress () :
2163094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_opaque_ap ()
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBAddress::SBAddress (const lldb_private::Address *lldb_object_ptr) :
2663094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_opaque_ap ()
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2861ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
297826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (lldb_object_ptr)
3163094e0bb161580564954dee512955c1c79d3476Greg Clayton        m_opaque_ap.reset (new lldb_private::Address(*lldb_object_ptr));
327826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
337826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
347826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    {
357826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        SBStream sstr;
367826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        GetDescription (sstr);
3761ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice        log->Printf ("SBAddress::SBAddress (lldb_object_ptr=%p) "
3861ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice                     "=> this.ap = %p (%s)", lldb_object_ptr, m_opaque_ap.get(), sstr.GetData());
397826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    }
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBAddress::SBAddress (const SBAddress &rhs) :
4363094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_opaque_ap ()
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4561ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
467826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (rhs.IsValid())
4863094e0bb161580564954dee512955c1c79d3476Greg Clayton        m_opaque_ap.reset (new lldb_private::Address(*rhs.m_opaque_ap.get()));
497826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
507826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
5161ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice        log->Printf ("SBAddress::SBAddress (rhs.m_opaque_ap = %p) => this.ap = %p",
5261ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice                     (rhs.IsValid() ? rhs.m_opaque_ap.get() : NULL), m_opaque_ap.get());
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBAddress::~SBAddress ()
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst SBAddress &
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBAddress::operator = (const SBAddress &rhs)
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
627826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
637826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (this != &rhs)
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (rhs.IsValid())
6763094e0bb161580564954dee512955c1c79d3476Greg Clayton            m_opaque_ap.reset (new lldb_private::Address(*rhs.m_opaque_ap.get()));
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
697826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
7061ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice        log->Printf ("SBAddress::operator= (rhs.ap = %p) => this.ap = %p",
7161ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice                     (rhs.IsValid() ? rhs.m_opaque_ap.get() : NULL), m_opaque_ap.get());
727826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
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
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBAddress::SetAddress (const lldb_private::Address *lldb_object_ptr)
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (lldb_object_ptr)
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
9363094e0bb161580564954dee512955c1c79d3476Greg Clayton        if (m_opaque_ap.get())
9463094e0bb161580564954dee512955c1c79d3476Greg Clayton            *m_opaque_ap = *lldb_object_ptr;
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
9663094e0bb161580564954dee512955c1c79d3476Greg Clayton            m_opaque_ap.reset (new lldb_private::Address(*lldb_object_ptr));
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
9963094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ap.get())
10063094e0bb161580564954dee512955c1c79d3476Greg Clayton        m_opaque_ap->Clear();
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb::addr_t
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBAddress::GetFileAddress () const
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
10663094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ap.get())
10763094e0bb161580564954dee512955c1c79d3476Greg Clayton        return m_opaque_ap->GetFileAddress();
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return LLDB_INVALID_ADDRESS;
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb::addr_t
113eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg ClaytonSBAddress::GetLoadAddress (const SBTarget &target) const
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1157826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
1167826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
11761ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice    //if (log)
11861ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice    //    log->Printf ("SBAddress::GetLoadAddress");
1197826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
12063094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ap.get())
1217826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    {
1227826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        lldb::addr_t addr = m_opaque_ap->GetLoadAddress (target.get());
1237826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        if (log)
12461ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice            log->Printf ("SBAddress::GetLoadAddress (target.sp=%p) => %p", target.get(), addr);
1257826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        return addr;
1267826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    }
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
1287826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    {
1297826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        if (log)
13061ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice            log->Printf ("SBAddress::GetLoadAddress (target.sp=%p) => LLDB_INVALID_ADDRESS", target.get());
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return LLDB_INVALID_ADDRESS;
1327826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    }
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBAddress::OffsetAddress (addr_t offset)
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
13863094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ap.get())
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
14063094e0bb161580564954dee512955c1c79d3476Greg Clayton        addr_t addr_offset = m_opaque_ap->GetOffset();
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (addr_offset != LLDB_INVALID_ADDRESS)
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
14363094e0bb161580564954dee512955c1c79d3476Greg Clayton            m_opaque_ap->SetOffset(addr_offset + offset);
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
150466f6c4c0783c6b5197059caccab94faf1e605e9Greg Claytonlldb_private::Address *
151466f6c4c0783c6b5197059caccab94faf1e605e9Greg ClaytonSBAddress::operator->()
152466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton{
153466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton    return m_opaque_ap.get();
154466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton}
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst lldb_private::Address *
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBAddress::operator->() const
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
15963094e0bb161580564954dee512955c1c79d3476Greg Clayton    return m_opaque_ap.get();
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
162466f6c4c0783c6b5197059caccab94faf1e605e9Greg Claytonlldb_private::Address &
163466f6c4c0783c6b5197059caccab94faf1e605e9Greg ClaytonSBAddress::operator*()
164466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton{
165466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton    if (m_opaque_ap.get() == NULL)
166466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton        m_opaque_ap.reset (new lldb_private::Address);
167466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton    return *m_opaque_ap;
168466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton}
169466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst lldb_private::Address &
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBAddress::operator*() const
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
173466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton    assert (m_opaque_ap.get());
17463094e0bb161580564954dee512955c1c79d3476Greg Clayton    return *m_opaque_ap;
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17761ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Ticelldb_private::Address *
17861ba7ec20f616f907473dd501341cef5b47fa3f8Caroline TiceSBAddress::get ()
17961ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice{
18061ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice    return m_opaque_ap.get();
18161ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice}
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18398f930f429160f9777f626c3ac6aa609f4e965d2Caroline Ticebool
18498f930f429160f9777f626c3ac6aa609f4e965d2Caroline TiceSBAddress::GetDescription (SBStream &description)
18598f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice{
186e49ec18f1868168c8927ae30a379db176ca8cce3Caroline Tice    description.ref();
18798f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice    if (m_opaque_ap.get())
188e7a566e3301b272d18a5f752f99c8cb8b63b28a4Caroline Tice    {
18998f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice        m_opaque_ap->DumpDebug (description.get());
190e7a566e3301b272d18a5f752f99c8cb8b63b28a4Caroline Tice    }
19198f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice    else
19298f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice        description.Printf ("No value");
19398f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice
19498f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice    return true;
19598f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice}
196