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 &section, 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