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