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