SBAddress.cpp revision 96154be69fa240a662419183ed08e1cfc5418164
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) : 353e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton m_module_sp (addr.GetModule()), 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; 17363094e0bb161580564954dee512955c1c79d3476Greg Clayton if (m_opaque_ap.get()) 1747826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice { 175bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 1763e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton addr = m_opaque_ap->GetAddress().GetLoadAddress (target.get()); 1777826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice } 178bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton 179bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton if (log) 1807826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice { 181bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton if (addr == LLDB_INVALID_ADDRESS) 18249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton log->Printf ("SBAddress::GetLoadAddress (SBTarget(%p)) => LLDB_INVALID_ADDRESS", target.get()); 183bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton else 184bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton log->Printf ("SBAddress::GetLoadAddress (SBTarget(%p)) => 0x%llx", target.get(), addr); 1857826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice } 186bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton 187bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton return addr; 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 190a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Claytonvoid 191a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg ClaytonSBAddress::SetLoadAddress (lldb::addr_t load_addr, lldb::SBTarget &target) 192a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton{ 193a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton // Create the address object if we don't already have one 194a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton ref(); 195a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton if (target.IsValid()) 196a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton *this = target.ResolveLoadAddress(load_addr); 197a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton else 1983e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton m_opaque_ap->GetAddress().Clear(); 199a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton 200a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton // Check if we weren't were able to resolve a section offset address. 201a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton // If we weren't it is ok, the load address might be a location on the 202a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton // stack or heap, so we should just have an address with no section and 203a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton // a valid offset 204a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton if (!m_opaque_ap->IsValid()) 2053e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton m_opaque_ap->GetAddress().SetOffset(load_addr); 206a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton} 207a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBAddress::OffsetAddress (addr_t offset) 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 21163094e0bb161580564954dee512955c1c79d3476Greg Clayton if (m_opaque_ap.get()) 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2133e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton addr_t addr_offset = m_opaque_ap->GetAddress().GetOffset(); 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (addr_offset != LLDB_INVALID_ADDRESS) 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2163e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton m_opaque_ap->GetAddress().SetOffset(addr_offset + offset); 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2233e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Claytonlldb::SBSection 2243e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg ClaytonSBAddress::GetSection () 2253e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton{ 2263e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton lldb::SBSection sb_section; 2273e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton if (m_opaque_ap.get()) 2283e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton sb_section.SetSection(m_opaque_ap->GetAddress().GetSection()); 2293e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton return sb_section; 2303e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton} 2313e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton 2323e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton 2333e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg ClaytonAddress * 234466f6c4c0783c6b5197059caccab94faf1e605e9Greg ClaytonSBAddress::operator->() 235466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton{ 2363e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton if (m_opaque_ap.get()) 2373e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton return &m_opaque_ap->GetAddress(); 2383e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton return NULL; 239466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton} 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2413e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Claytonconst Address * 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBAddress::operator->() const 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2443e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton if (m_opaque_ap.get()) 2453e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton return &m_opaque_ap->GetAddress(); 2463e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton return NULL; 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2493e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg ClaytonAddress & 250a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg ClaytonSBAddress::ref () 251466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton{ 252466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton if (m_opaque_ap.get() == NULL) 2533e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton m_opaque_ap.reset (new AddressImpl()); 2543e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton return m_opaque_ap->GetAddress(); 255466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton} 256466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton 2573e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Claytonconst Address & 258a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg ClaytonSBAddress::ref () const 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 260a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton // "const SBAddress &addr" should already have checked "addr.IsValid()" 261a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton // prior to calling this function. In case you didn't we will assert 262a395506fb374f1f589d0d860f5e6c9fa7b1e0b9aGreg Clayton // and die to let you know. 263466f6c4c0783c6b5197059caccab94faf1e605e9Greg Clayton assert (m_opaque_ap.get()); 2643e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton return m_opaque_ap->GetAddress(); 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2673e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg ClaytonAddress * 26861ba7ec20f616f907473dd501341cef5b47fa3f8Caroline TiceSBAddress::get () 26961ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice{ 2703e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton if (m_opaque_ap.get()) 2713e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton return &m_opaque_ap->GetAddress(); 2723e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton return NULL; 27361ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice} 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27598f930f429160f9777f626c3ac6aa609f4e965d2Caroline Ticebool 27698f930f429160f9777f626c3ac6aa609f4e965d2Caroline TiceSBAddress::GetDescription (SBStream &description) 27798f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice{ 27849ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton // Call "ref()" on the stream to make sure it creates a backing stream in 27949ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton // case there isn't one already... 28096154be69fa240a662419183ed08e1cfc5418164Greg Clayton Stream &strm = description.ref(); 28198f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice if (m_opaque_ap.get()) 28296154be69fa240a662419183ed08e1cfc5418164Greg Clayton m_opaque_ap->GetAddress().Dump (&strm, NULL, Address::DumpStyleModuleWithFileAddress, Address::DumpStyleInvalid, 4); 28398f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice else 28496154be69fa240a662419183ed08e1cfc5418164Greg Clayton strm.PutCString ("No value"); 28598f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice 28698f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice return true; 28798f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice} 288b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton 289b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg ClaytonSBModule 290b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg ClaytonSBAddress::GetModule () 291b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton{ 292b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton SBModule sb_module; 293b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton if (m_opaque_ap.get()) 294b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton { 29502e210cad27e36108bef493b798c2c1eb3b04cb8Greg Clayton Module *module = m_opaque_ap->GetModule(); 296b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton if (module) 29702e210cad27e36108bef493b798c2c1eb3b04cb8Greg Clayton *sb_module = module; 298b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton } 299b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton return sb_module; 300b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton} 301b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton 302c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBSymbolContext 303c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBAddress::GetSymbolContext (uint32_t resolve_scope) 304c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{ 305c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton SBSymbolContext sb_sc; 306c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton if (m_opaque_ap.get()) 3073e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton m_opaque_ap->GetAddress().CalculateSymbolContext (&sb_sc.ref(), resolve_scope); 308c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton return sb_sc; 309c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton} 310c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton 311c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBCompileUnit 312c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBAddress::GetCompileUnit () 313c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{ 314c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton SBCompileUnit sb_comp_unit; 315c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton if (m_opaque_ap.get()) 3163e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton sb_comp_unit.reset(m_opaque_ap->GetAddress().CalculateSymbolContextCompileUnit()); 317c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton return sb_comp_unit; 318c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton} 319c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton 320c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBFunction 321c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBAddress::GetFunction () 322c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{ 323c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton SBFunction sb_function; 324c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton if (m_opaque_ap.get()) 3253e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton sb_function.reset(m_opaque_ap->GetAddress().CalculateSymbolContextFunction()); 326c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton return sb_function; 327c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton} 328c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton 329c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBBlock 330c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBAddress::GetBlock () 331c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{ 332c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton SBBlock sb_block; 333c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton if (m_opaque_ap.get()) 3343e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton sb_block.reset(m_opaque_ap->GetAddress().CalculateSymbolContextBlock()); 335c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton return sb_block; 336c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton} 337c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton 338c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBSymbol 339c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBAddress::GetSymbol () 340c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{ 341c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton SBSymbol sb_symbol; 342c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton if (m_opaque_ap.get()) 3433e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton sb_symbol.reset(m_opaque_ap->GetAddress().CalculateSymbolContextSymbol()); 344c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton return sb_symbol; 345c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton} 346c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton 347c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBLineEntry 348c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonSBAddress::GetLineEntry () 349c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{ 350c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton SBLineEntry sb_line_entry; 351c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton if (m_opaque_ap.get()) 352c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton { 353c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton LineEntry line_entry; 3543e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton if (m_opaque_ap->GetAddress().CalculateSymbolContextLineEntry (line_entry)) 355c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton sb_line_entry.SetLineEntry (line_entry); 356c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton } 357c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton return sb_line_entry; 358c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton} 359c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton 360b0e68d996b28cf81a28aeceefd69f7ed8d4aba99Greg Clayton 361