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