124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- AddressRange.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/Core/AddressRange.h" 11c67b7d13cffeb2c9454635e8a11d65350bce61adGreg Clayton#include "lldb/Core/Module.h" 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Stream.h" 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h" 14eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton#include "lldb/Target/Target.h" 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerAddressRange::AddressRange () : 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_base_addr(), 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_byte_size(0) 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerAddressRange::AddressRange (addr_t file_addr, addr_t byte_size, const SectionList *section_list) : 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_base_addr(file_addr, section_list), 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_byte_size(byte_size) 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 313508c387c3f0c9ecc439d98048fd7694d41bab1bGreg ClaytonAddressRange::AddressRange (const lldb::SectionSP §ion, addr_t offset, addr_t byte_size) : 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_base_addr(section, offset), 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_byte_size(byte_size) 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerAddressRange::AddressRange (const Address& so_addr, addr_t byte_size) : 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_base_addr(so_addr), 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_byte_size(byte_size) 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerAddressRange::~AddressRange () 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//bool 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//AddressRange::Contains (const Address &addr) const 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{ 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const addr_t byte_size = GetByteSize(); 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (byte_size) 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return addr.GetSection() == m_base_addr.GetSection() && (addr.GetOffset() - m_base_addr.GetOffset()) < byte_size; 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//} 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//bool 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//AddressRange::Contains (const Address *addr) const 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{ 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (addr) 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return Contains (*addr); 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return false; 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//} 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerAddressRange::ContainsFileAddress (const Address &addr) const 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (addr.GetSection() == m_base_addr.GetSection()) 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return (addr.GetOffset() - m_base_addr.GetOffset()) < GetByteSize(); 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner addr_t file_base_addr = GetBaseAddress().GetFileAddress(); 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (file_base_addr == LLDB_INVALID_ADDRESS) 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner addr_t file_addr = addr.GetFileAddress(); 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (file_addr == LLDB_INVALID_ADDRESS) 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (file_base_addr <= file_addr) 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return (file_addr - file_base_addr) < GetByteSize(); 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerAddressRange::ContainsFileAddress (addr_t file_addr) const 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (file_addr == LLDB_INVALID_ADDRESS) 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner addr_t file_base_addr = GetBaseAddress().GetFileAddress(); 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (file_base_addr == LLDB_INVALID_ADDRESS) 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (file_base_addr <= file_addr) 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return (file_addr - file_base_addr) < GetByteSize(); 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 100eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg ClaytonAddressRange::ContainsLoadAddress (const Address &addr, Target *target) const 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (addr.GetSection() == m_base_addr.GetSection()) 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return (addr.GetOffset() - m_base_addr.GetOffset()) < GetByteSize(); 104eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton addr_t load_base_addr = GetBaseAddress().GetLoadAddress(target); 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (load_base_addr == LLDB_INVALID_ADDRESS) 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 108eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton addr_t load_addr = addr.GetLoadAddress(target); 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (load_addr == LLDB_INVALID_ADDRESS) 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (load_base_addr <= load_addr) 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return (load_addr - load_base_addr) < GetByteSize(); 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 119eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg ClaytonAddressRange::ContainsLoadAddress (addr_t load_addr, Target *target) const 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (load_addr == LLDB_INVALID_ADDRESS) 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 124eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton addr_t load_base_addr = GetBaseAddress().GetLoadAddress(target); 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (load_base_addr == LLDB_INVALID_ADDRESS) 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (load_base_addr <= load_addr) 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return (load_addr - load_base_addr) < GetByteSize(); 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerAddressRange::Clear() 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_base_addr.Clear(); 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_byte_size = 0; 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 142eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg ClaytonAddressRange::Dump(Stream *s, Target *target, Address::DumpStyle style, Address::DumpStyle fallback_style) const 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner addr_t vmaddr = LLDB_INVALID_ADDRESS; 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int addr_size = sizeof (addr_t); 146395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton if (target) 147395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton addr_size = target->GetArchitecture().GetAddressByteSize (); 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 149c67b7d13cffeb2c9454635e8a11d65350bce61adGreg Clayton bool show_module = false; 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (style) 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 15254e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton default: 15354e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton break; 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case Address::DumpStyleSectionNameOffset: 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case Address::DumpStyleSectionPointerOffset: 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->PutChar ('['); 157eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton m_base_addr.Dump(s, target, style, fallback_style); 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->PutChar ('-'); 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Address (m_base_addr.GetOffset() + GetByteSize(), addr_size); 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->PutChar (')'); 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 164c67b7d13cffeb2c9454635e8a11d65350bce61adGreg Clayton case Address::DumpStyleModuleWithFileAddress: 165c67b7d13cffeb2c9454635e8a11d65350bce61adGreg Clayton show_module = true; 166c67b7d13cffeb2c9454635e8a11d65350bce61adGreg Clayton // fall through 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case Address::DumpStyleFileAddress: 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner vmaddr = m_base_addr.GetFileAddress(); 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case Address::DumpStyleLoadAddress: 172eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton vmaddr = m_base_addr.GetLoadAddress(target); 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (vmaddr != LLDB_INVALID_ADDRESS) 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 178c67b7d13cffeb2c9454635e8a11d65350bce61adGreg Clayton if (show_module) 179c67b7d13cffeb2c9454635e8a11d65350bce61adGreg Clayton { 1803508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton ModuleSP module_sp (GetBaseAddress().GetModule()); 1813508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton if (module_sp) 1823508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton s->Printf("%s", module_sp->GetFileSpec().GetFilename().AsCString()); 183c67b7d13cffeb2c9454635e8a11d65350bce61adGreg Clayton } 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->AddressRange(vmaddr, vmaddr + GetByteSize(), addr_size); 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 187c67b7d13cffeb2c9454635e8a11d65350bce61adGreg Clayton else if (fallback_style != Address::DumpStyleInvalid) 188c67b7d13cffeb2c9454635e8a11d65350bce61adGreg Clayton { 189eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton return Dump(s, target, fallback_style, Address::DumpStyleInvalid); 190c67b7d13cffeb2c9454635e8a11d65350bce61adGreg Clayton } 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerAddressRange::DumpDebug (Stream *s) const 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1995f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea 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()); 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//bool 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//lldb::operator== (const AddressRange& lhs, const AddressRange& rhs) 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{ 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (lhs.GetBaseAddress() == rhs.GetBaseAddress()) 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return lhs.GetByteSize() == rhs.GetByteSize(); 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return false; 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//} 209