1254721Semaste//===-- AddressRange.cpp ----------------------------------------*- C++ -*-===// 2254721Semaste// 3254721Semaste// The LLVM Compiler Infrastructure 4254721Semaste// 5254721Semaste// This file is distributed under the University of Illinois Open Source 6254721Semaste// License. See LICENSE.TXT for details. 7254721Semaste// 8254721Semaste//===----------------------------------------------------------------------===// 9254721Semaste 10254721Semaste#include "lldb/Core/AddressRange.h" 11254721Semaste#include "lldb/Core/Module.h" 12254721Semaste#include "lldb/Core/Stream.h" 13254721Semaste#include "lldb/Target/Process.h" 14254721Semaste#include "lldb/Target/Target.h" 15254721Semaste 16254721Semasteusing namespace lldb; 17254721Semasteusing namespace lldb_private; 18254721Semaste 19254721SemasteAddressRange::AddressRange () : 20254721Semaste m_base_addr(), 21254721Semaste m_byte_size(0) 22254721Semaste{ 23254721Semaste} 24254721Semaste 25254721SemasteAddressRange::AddressRange (addr_t file_addr, addr_t byte_size, const SectionList *section_list) : 26254721Semaste m_base_addr(file_addr, section_list), 27254721Semaste m_byte_size(byte_size) 28254721Semaste{ 29254721Semaste} 30254721Semaste 31254721SemasteAddressRange::AddressRange (const lldb::SectionSP §ion, addr_t offset, addr_t byte_size) : 32254721Semaste m_base_addr(section, offset), 33254721Semaste m_byte_size(byte_size) 34254721Semaste{ 35254721Semaste} 36254721Semaste 37254721SemasteAddressRange::AddressRange (const Address& so_addr, addr_t byte_size) : 38254721Semaste m_base_addr(so_addr), 39254721Semaste m_byte_size(byte_size) 40254721Semaste{ 41254721Semaste} 42254721Semaste 43254721SemasteAddressRange::~AddressRange () 44254721Semaste{ 45254721Semaste} 46254721Semaste 47254721Semaste//bool 48254721Semaste//AddressRange::Contains (const Address &addr) const 49254721Semaste//{ 50254721Semaste// const addr_t byte_size = GetByteSize(); 51254721Semaste// if (byte_size) 52254721Semaste// return addr.GetSection() == m_base_addr.GetSection() && (addr.GetOffset() - m_base_addr.GetOffset()) < byte_size; 53254721Semaste//} 54254721Semaste// 55254721Semaste//bool 56254721Semaste//AddressRange::Contains (const Address *addr) const 57254721Semaste//{ 58254721Semaste// if (addr) 59254721Semaste// return Contains (*addr); 60254721Semaste// return false; 61254721Semaste//} 62254721Semaste 63254721Semastebool 64254721SemasteAddressRange::ContainsFileAddress (const Address &addr) const 65254721Semaste{ 66254721Semaste if (addr.GetSection() == m_base_addr.GetSection()) 67254721Semaste return (addr.GetOffset() - m_base_addr.GetOffset()) < GetByteSize(); 68254721Semaste addr_t file_base_addr = GetBaseAddress().GetFileAddress(); 69254721Semaste if (file_base_addr == LLDB_INVALID_ADDRESS) 70254721Semaste return false; 71254721Semaste 72254721Semaste addr_t file_addr = addr.GetFileAddress(); 73254721Semaste if (file_addr == LLDB_INVALID_ADDRESS) 74254721Semaste return false; 75254721Semaste 76254721Semaste if (file_base_addr <= file_addr) 77254721Semaste return (file_addr - file_base_addr) < GetByteSize(); 78254721Semaste 79254721Semaste return false; 80254721Semaste} 81254721Semaste 82254721Semastebool 83254721SemasteAddressRange::ContainsFileAddress (addr_t file_addr) const 84254721Semaste{ 85254721Semaste if (file_addr == LLDB_INVALID_ADDRESS) 86254721Semaste return false; 87254721Semaste 88254721Semaste addr_t file_base_addr = GetBaseAddress().GetFileAddress(); 89254721Semaste if (file_base_addr == LLDB_INVALID_ADDRESS) 90254721Semaste return false; 91254721Semaste 92254721Semaste if (file_base_addr <= file_addr) 93254721Semaste return (file_addr - file_base_addr) < GetByteSize(); 94254721Semaste 95254721Semaste return false; 96254721Semaste} 97254721Semaste 98254721Semaste 99254721Semastebool 100254721SemasteAddressRange::ContainsLoadAddress (const Address &addr, Target *target) const 101254721Semaste{ 102254721Semaste if (addr.GetSection() == m_base_addr.GetSection()) 103254721Semaste return (addr.GetOffset() - m_base_addr.GetOffset()) < GetByteSize(); 104254721Semaste addr_t load_base_addr = GetBaseAddress().GetLoadAddress(target); 105254721Semaste if (load_base_addr == LLDB_INVALID_ADDRESS) 106254721Semaste return false; 107254721Semaste 108254721Semaste addr_t load_addr = addr.GetLoadAddress(target); 109254721Semaste if (load_addr == LLDB_INVALID_ADDRESS) 110254721Semaste return false; 111254721Semaste 112254721Semaste if (load_base_addr <= load_addr) 113254721Semaste return (load_addr - load_base_addr) < GetByteSize(); 114254721Semaste 115254721Semaste return false; 116254721Semaste} 117254721Semaste 118254721Semastebool 119254721SemasteAddressRange::ContainsLoadAddress (addr_t load_addr, Target *target) const 120254721Semaste{ 121254721Semaste if (load_addr == LLDB_INVALID_ADDRESS) 122254721Semaste return false; 123254721Semaste 124254721Semaste addr_t load_base_addr = GetBaseAddress().GetLoadAddress(target); 125254721Semaste if (load_base_addr == LLDB_INVALID_ADDRESS) 126254721Semaste return false; 127254721Semaste 128254721Semaste if (load_base_addr <= load_addr) 129254721Semaste return (load_addr - load_base_addr) < GetByteSize(); 130254721Semaste 131254721Semaste return false; 132254721Semaste} 133254721Semaste 134254721Semastevoid 135254721SemasteAddressRange::Clear() 136254721Semaste{ 137254721Semaste m_base_addr.Clear(); 138254721Semaste m_byte_size = 0; 139254721Semaste} 140254721Semaste 141254721Semastebool 142254721SemasteAddressRange::Dump(Stream *s, Target *target, Address::DumpStyle style, Address::DumpStyle fallback_style) const 143254721Semaste{ 144254721Semaste addr_t vmaddr = LLDB_INVALID_ADDRESS; 145254721Semaste int addr_size = sizeof (addr_t); 146254721Semaste if (target) 147254721Semaste addr_size = target->GetArchitecture().GetAddressByteSize (); 148254721Semaste 149254721Semaste bool show_module = false; 150254721Semaste switch (style) 151254721Semaste { 152254721Semaste default: 153254721Semaste break; 154254721Semaste case Address::DumpStyleSectionNameOffset: 155254721Semaste case Address::DumpStyleSectionPointerOffset: 156254721Semaste s->PutChar ('['); 157254721Semaste m_base_addr.Dump(s, target, style, fallback_style); 158254721Semaste s->PutChar ('-'); 159254721Semaste s->Address (m_base_addr.GetOffset() + GetByteSize(), addr_size); 160254721Semaste s->PutChar (')'); 161254721Semaste return true; 162254721Semaste break; 163254721Semaste 164254721Semaste case Address::DumpStyleModuleWithFileAddress: 165254721Semaste show_module = true; 166254721Semaste // fall through 167254721Semaste case Address::DumpStyleFileAddress: 168254721Semaste vmaddr = m_base_addr.GetFileAddress(); 169254721Semaste break; 170254721Semaste 171254721Semaste case Address::DumpStyleLoadAddress: 172254721Semaste vmaddr = m_base_addr.GetLoadAddress(target); 173254721Semaste break; 174254721Semaste } 175254721Semaste 176254721Semaste if (vmaddr != LLDB_INVALID_ADDRESS) 177254721Semaste { 178254721Semaste if (show_module) 179254721Semaste { 180254721Semaste ModuleSP module_sp (GetBaseAddress().GetModule()); 181254721Semaste if (module_sp) 182254721Semaste s->Printf("%s", module_sp->GetFileSpec().GetFilename().AsCString()); 183254721Semaste } 184254721Semaste s->AddressRange(vmaddr, vmaddr + GetByteSize(), addr_size); 185254721Semaste return true; 186254721Semaste } 187254721Semaste else if (fallback_style != Address::DumpStyleInvalid) 188254721Semaste { 189254721Semaste return Dump(s, target, fallback_style, Address::DumpStyleInvalid); 190254721Semaste } 191254721Semaste 192254721Semaste return false; 193254721Semaste} 194254721Semaste 195254721Semaste 196254721Semastevoid 197254721SemasteAddressRange::DumpDebug (Stream *s) const 198254721Semaste{ 199254721Semaste s->Printf("%p: AddressRange section = %p, offset = 0x%16.16" PRIx64 ", byte_size = 0x%16.16" PRIx64 "\n", this, m_base_addr.GetSection().get(), m_base_addr.GetOffset(), GetByteSize()); 200254721Semaste} 201254721Semaste// 202254721Semaste//bool 203254721Semaste//lldb::operator== (const AddressRange& lhs, const AddressRange& rhs) 204254721Semaste//{ 205254721Semaste// if (lhs.GetBaseAddress() == rhs.GetBaseAddress()) 206254721Semaste// return lhs.GetByteSize() == rhs.GetByteSize(); 207254721Semaste// return false; 208254721Semaste//} 209