blob: 01fedd7d0950b7efec122587a63322d592f109bc [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- AddressRange.cpp ----------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/Core/AddressRange.h"
Greg Claytonc9800662010-09-10 01:30:46 +000011#include "lldb/Core/Module.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000012#include "lldb/Target/Process.h"
Greg Claytonf5e56de2010-09-14 23:36:40 +000013#include "lldb/Target/Target.h"
Zachary Turnerbf9a7732017-02-02 21:39:50 +000014#include "lldb/Utility/Stream.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000015
16using namespace lldb;
17using namespace lldb_private;
18
Kate Stoneb9c1b512016-09-06 20:57:50 +000019AddressRange::AddressRange() : m_base_addr(), m_byte_size(0) {}
Chris Lattner30fdc8d2010-06-08 16:52:24 +000020
Kate Stoneb9c1b512016-09-06 20:57:50 +000021AddressRange::AddressRange(addr_t file_addr, addr_t byte_size,
22 const SectionList *section_list)
23 : m_base_addr(file_addr, section_list), m_byte_size(byte_size) {}
Chris Lattner30fdc8d2010-06-08 16:52:24 +000024
Kate Stoneb9c1b512016-09-06 20:57:50 +000025AddressRange::AddressRange(const lldb::SectionSP &section, addr_t offset,
26 addr_t byte_size)
27 : m_base_addr(section, offset), m_byte_size(byte_size) {}
Chris Lattner30fdc8d2010-06-08 16:52:24 +000028
Kate Stoneb9c1b512016-09-06 20:57:50 +000029AddressRange::AddressRange(const Address &so_addr, addr_t byte_size)
30 : m_base_addr(so_addr), m_byte_size(byte_size) {}
Chris Lattner30fdc8d2010-06-08 16:52:24 +000031
Kate Stoneb9c1b512016-09-06 20:57:50 +000032AddressRange::~AddressRange() {}
Chris Lattner30fdc8d2010-06-08 16:52:24 +000033
Kate Stoneb9c1b512016-09-06 20:57:50 +000034// bool
35// AddressRange::Contains (const Address &addr) const
Chris Lattner30fdc8d2010-06-08 16:52:24 +000036//{
37// const addr_t byte_size = GetByteSize();
38// if (byte_size)
Kate Stoneb9c1b512016-09-06 20:57:50 +000039// return addr.GetSection() == m_base_addr.GetSection() &&
40// (addr.GetOffset() - m_base_addr.GetOffset()) < byte_size;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000041//}
42//
Kate Stoneb9c1b512016-09-06 20:57:50 +000043// bool
44// AddressRange::Contains (const Address *addr) const
Chris Lattner30fdc8d2010-06-08 16:52:24 +000045//{
46// if (addr)
47// return Contains (*addr);
48// return false;
49//}
50
Kate Stoneb9c1b512016-09-06 20:57:50 +000051bool AddressRange::ContainsFileAddress(const Address &addr) const {
52 if (addr.GetSection() == m_base_addr.GetSection())
53 return (addr.GetOffset() - m_base_addr.GetOffset()) < GetByteSize();
54 addr_t file_base_addr = GetBaseAddress().GetFileAddress();
55 if (file_base_addr == LLDB_INVALID_ADDRESS)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000056 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000057
Kate Stoneb9c1b512016-09-06 20:57:50 +000058 addr_t file_addr = addr.GetFileAddress();
59 if (file_addr == LLDB_INVALID_ADDRESS)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000060 return false;
Kate Stoneb9c1b512016-09-06 20:57:50 +000061
62 if (file_base_addr <= file_addr)
63 return (file_addr - file_base_addr) < GetByteSize();
64
65 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000066}
67
Kate Stoneb9c1b512016-09-06 20:57:50 +000068bool AddressRange::ContainsFileAddress(addr_t file_addr) const {
69 if (file_addr == LLDB_INVALID_ADDRESS)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000070 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000071
Kate Stoneb9c1b512016-09-06 20:57:50 +000072 addr_t file_base_addr = GetBaseAddress().GetFileAddress();
73 if (file_base_addr == LLDB_INVALID_ADDRESS)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000074 return false;
Kate Stoneb9c1b512016-09-06 20:57:50 +000075
76 if (file_base_addr <= file_addr)
77 return (file_addr - file_base_addr) < GetByteSize();
78
79 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000080}
81
Kate Stoneb9c1b512016-09-06 20:57:50 +000082bool AddressRange::ContainsLoadAddress(const Address &addr,
83 Target *target) const {
84 if (addr.GetSection() == m_base_addr.GetSection())
85 return (addr.GetOffset() - m_base_addr.GetOffset()) < GetByteSize();
86 addr_t load_base_addr = GetBaseAddress().GetLoadAddress(target);
87 if (load_base_addr == LLDB_INVALID_ADDRESS)
88 return false;
89
90 addr_t load_addr = addr.GetLoadAddress(target);
91 if (load_addr == LLDB_INVALID_ADDRESS)
92 return false;
93
94 if (load_base_addr <= load_addr)
95 return (load_addr - load_base_addr) < GetByteSize();
96
97 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000098}
99
Kate Stoneb9c1b512016-09-06 20:57:50 +0000100bool AddressRange::ContainsLoadAddress(addr_t load_addr, Target *target) const {
101 if (load_addr == LLDB_INVALID_ADDRESS)
102 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000103
Kate Stoneb9c1b512016-09-06 20:57:50 +0000104 addr_t load_base_addr = GetBaseAddress().GetLoadAddress(target);
105 if (load_base_addr == LLDB_INVALID_ADDRESS)
106 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000107
Kate Stoneb9c1b512016-09-06 20:57:50 +0000108 if (load_base_addr <= load_addr)
109 return (load_addr - load_base_addr) < GetByteSize();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000110
Kate Stoneb9c1b512016-09-06 20:57:50 +0000111 return false;
112}
113
114void AddressRange::Clear() {
115 m_base_addr.Clear();
116 m_byte_size = 0;
117}
118
119bool AddressRange::Dump(Stream *s, Target *target, Address::DumpStyle style,
120 Address::DumpStyle fallback_style) const {
121 addr_t vmaddr = LLDB_INVALID_ADDRESS;
122 int addr_size = sizeof(addr_t);
123 if (target)
124 addr_size = target->GetArchitecture().GetAddressByteSize();
125
126 bool show_module = false;
127 switch (style) {
128 default:
129 break;
130 case Address::DumpStyleSectionNameOffset:
131 case Address::DumpStyleSectionPointerOffset:
132 s->PutChar('[');
133 m_base_addr.Dump(s, target, style, fallback_style);
134 s->PutChar('-');
135 s->Address(m_base_addr.GetOffset() + GetByteSize(), addr_size);
136 s->PutChar(')');
137 return true;
138 break;
139
140 case Address::DumpStyleModuleWithFileAddress:
141 show_module = true;
142 LLVM_FALLTHROUGH;
143 case Address::DumpStyleFileAddress:
144 vmaddr = m_base_addr.GetFileAddress();
145 break;
146
147 case Address::DumpStyleLoadAddress:
148 vmaddr = m_base_addr.GetLoadAddress(target);
149 break;
150 }
151
152 if (vmaddr != LLDB_INVALID_ADDRESS) {
153 if (show_module) {
154 ModuleSP module_sp(GetBaseAddress().GetModule());
155 if (module_sp)
156 s->Printf("%s", module_sp->GetFileSpec().GetFilename().AsCString(
157 "<Unknown>"));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000158 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000159 s->AddressRange(vmaddr, vmaddr + GetByteSize(), addr_size);
160 return true;
161 } else if (fallback_style != Address::DumpStyleInvalid) {
162 return Dump(s, target, fallback_style, Address::DumpStyleInvalid);
163 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000164
Kate Stoneb9c1b512016-09-06 20:57:50 +0000165 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000166}
167
Kate Stoneb9c1b512016-09-06 20:57:50 +0000168void AddressRange::DumpDebug(Stream *s) const {
169 s->Printf("%p: AddressRange section = %p, offset = 0x%16.16" PRIx64
170 ", byte_size = 0x%16.16" PRIx64 "\n",
171 static_cast<const void *>(this),
172 static_cast<void *>(m_base_addr.GetSection().get()),
173 m_base_addr.GetOffset(), GetByteSize());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000174}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000175//
Kate Stoneb9c1b512016-09-06 20:57:50 +0000176// bool
177// lldb::operator== (const AddressRange& lhs, const AddressRange& rhs)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000178//{
179// if (lhs.GetBaseAddress() == rhs.GetBaseAddress())
180// return lhs.GetByteSize() == rhs.GetByteSize();
181// return false;
182//}