blob: 6aec0722169f35be24706116b0e885d73758df11 [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- SBAddress.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/API/SBAddress.h"
11#include "lldb/API/SBProcess.h"
Greg Claytoncac9c5f2011-09-24 00:52:29 +000012#include "lldb/API/SBSection.h"
Caroline Ticedde9cff2010-09-20 05:20:02 +000013#include "lldb/API/SBStream.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000014#include "lldb/Core/Address.h"
Caroline Ticeceb6b132010-10-26 03:11:13 +000015#include "lldb/Core/Log.h"
Greg Clayton05d2b7f2011-03-31 01:08:07 +000016#include "lldb/Core/Module.h"
Greg Claytonaf67cec2010-12-20 20:49:23 +000017#include "lldb/Host/Mutex.h"
18#include "lldb/Target/Target.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000019
Greg Claytoncac9c5f2011-09-24 00:52:29 +000020
Chris Lattner30fdc8d2010-06-08 16:52:24 +000021using namespace lldb;
Caroline Ticeceb6b132010-10-26 03:11:13 +000022using namespace lldb_private;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000023
24
25SBAddress::SBAddress () :
Greg Clayton66111032010-06-23 01:19:29 +000026 m_opaque_ap ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +000027{
28}
29
Greg Claytoncac9c5f2011-09-24 00:52:29 +000030SBAddress::SBAddress (const Address *lldb_object_ptr) :
Greg Clayton66111032010-06-23 01:19:29 +000031 m_opaque_ap ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +000032{
33 if (lldb_object_ptr)
Greg Clayton7e8a6012012-04-04 20:36:48 +000034 ref() = *lldb_object_ptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000035}
36
37SBAddress::SBAddress (const SBAddress &rhs) :
Greg Clayton66111032010-06-23 01:19:29 +000038 m_opaque_ap ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +000039{
40 if (rhs.IsValid())
Greg Clayton7e8a6012012-04-04 20:36:48 +000041 ref() = rhs.ref();
Chris Lattner30fdc8d2010-06-08 16:52:24 +000042}
43
Greg Clayton819134a2012-02-04 02:58:17 +000044
45SBAddress::SBAddress (lldb::SBSection section, lldb::addr_t offset) :
Greg Clayton7e8a6012012-04-04 20:36:48 +000046 m_opaque_ap(new Address (section.GetSP(), offset))
Greg Clayton819134a2012-02-04 02:58:17 +000047{
48}
49
Greg Clayton00e6fbf2011-07-22 16:46:35 +000050// Create an address by resolving a load address using the supplied target
51SBAddress::SBAddress (lldb::addr_t load_addr, lldb::SBTarget &target) :
52 m_opaque_ap()
53{
54 SetLoadAddress (load_addr, target);
55}
56
57
58
Chris Lattner30fdc8d2010-06-08 16:52:24 +000059SBAddress::~SBAddress ()
60{
61}
62
63const SBAddress &
64SBAddress::operator = (const SBAddress &rhs)
65{
Greg Claytoncac9c5f2011-09-24 00:52:29 +000066 if (this != &rhs)
67 {
68 if (rhs.IsValid())
Greg Clayton7e8a6012012-04-04 20:36:48 +000069 ref() = rhs.ref();
Greg Claytoncac9c5f2011-09-24 00:52:29 +000070 else
71 m_opaque_ap.reset();
72 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +000073 return *this;
74}
75
76bool
77SBAddress::IsValid () const
78{
Greg Clayton66111032010-06-23 01:19:29 +000079 return m_opaque_ap.get() != NULL && m_opaque_ap->IsValid();
Chris Lattner30fdc8d2010-06-08 16:52:24 +000080}
81
82void
Greg Clayton09960032010-09-10 18:31:35 +000083SBAddress::Clear ()
84{
85 m_opaque_ap.reset();
86}
87
88void
Greg Clayton819134a2012-02-04 02:58:17 +000089SBAddress::SetAddress (lldb::SBSection section, lldb::addr_t offset)
90{
91 Address &addr = ref();
Greg Claytone72dfb32012-02-24 01:59:29 +000092 addr.SetSection (section.GetSP());
Greg Clayton819134a2012-02-04 02:58:17 +000093 addr.SetOffset (offset);
94}
95
96
97void
Greg Claytoncac9c5f2011-09-24 00:52:29 +000098SBAddress::SetAddress (const Address *lldb_object_ptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000099{
100 if (lldb_object_ptr)
Greg Clayton7e8a6012012-04-04 20:36:48 +0000101 ref() = *lldb_object_ptr;
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000102 else
103 m_opaque_ap.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000104}
105
106lldb::addr_t
107SBAddress::GetFileAddress () const
108{
Greg Clayton66111032010-06-23 01:19:29 +0000109 if (m_opaque_ap.get())
Greg Clayton7e8a6012012-04-04 20:36:48 +0000110 return m_opaque_ap->GetFileAddress();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000111 else
112 return LLDB_INVALID_ADDRESS;
113}
114
115lldb::addr_t
Greg Claytonf5e56de2010-09-14 23:36:40 +0000116SBAddress::GetLoadAddress (const SBTarget &target) const
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000117{
Greg Clayton5160ce52013-03-27 23:08:40 +0000118 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000119
Greg Claytonaf67cec2010-12-20 20:49:23 +0000120 lldb::addr_t addr = LLDB_INVALID_ADDRESS;
Greg Claytonb9556ac2012-01-30 07:41:31 +0000121 TargetSP target_sp (target.GetSP());
Greg Claytone4c1ef52012-10-22 20:49:35 +0000122 if (target_sp)
Caroline Ticeceb6b132010-10-26 03:11:13 +0000123 {
Greg Claytone4c1ef52012-10-22 20:49:35 +0000124 if (m_opaque_ap.get())
125 {
126 Mutex::Locker api_locker (target_sp->GetAPIMutex());
127 addr = m_opaque_ap->GetLoadAddress (target_sp.get());
128 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000129 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000130
Greg Claytonaf67cec2010-12-20 20:49:23 +0000131 if (log)
Caroline Ticeceb6b132010-10-26 03:11:13 +0000132 {
Greg Claytonaf67cec2010-12-20 20:49:23 +0000133 if (addr == LLDB_INVALID_ADDRESS)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000134 log->Printf ("SBAddress::GetLoadAddress (SBTarget(%p)) => LLDB_INVALID_ADDRESS",
135 static_cast<void*>(target_sp.get()));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000136 else
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000137 log->Printf ("SBAddress::GetLoadAddress (SBTarget(%p)) => 0x%" PRIx64,
138 static_cast<void*>(target_sp.get()), addr);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000139 }
Greg Claytonaf67cec2010-12-20 20:49:23 +0000140
141 return addr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000142}
143
Greg Clayton00e6fbf2011-07-22 16:46:35 +0000144void
145SBAddress::SetLoadAddress (lldb::addr_t load_addr, lldb::SBTarget &target)
146{
147 // Create the address object if we don't already have one
148 ref();
149 if (target.IsValid())
150 *this = target.ResolveLoadAddress(load_addr);
151 else
Greg Clayton7e8a6012012-04-04 20:36:48 +0000152 m_opaque_ap->Clear();
Greg Clayton00e6fbf2011-07-22 16:46:35 +0000153
154 // Check if we weren't were able to resolve a section offset address.
155 // If we weren't it is ok, the load address might be a location on the
156 // stack or heap, so we should just have an address with no section and
157 // a valid offset
158 if (!m_opaque_ap->IsValid())
Greg Clayton7e8a6012012-04-04 20:36:48 +0000159 m_opaque_ap->SetOffset(load_addr);
Greg Clayton00e6fbf2011-07-22 16:46:35 +0000160}
161
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000162bool
163SBAddress::OffsetAddress (addr_t offset)
164{
Greg Clayton66111032010-06-23 01:19:29 +0000165 if (m_opaque_ap.get())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000166 {
Greg Clayton7e8a6012012-04-04 20:36:48 +0000167 addr_t addr_offset = m_opaque_ap->GetOffset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000168 if (addr_offset != LLDB_INVALID_ADDRESS)
169 {
Greg Clayton7e8a6012012-04-04 20:36:48 +0000170 m_opaque_ap->SetOffset(addr_offset + offset);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000171 return true;
172 }
173 }
174 return false;
175}
176
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000177lldb::SBSection
178SBAddress::GetSection ()
179{
180 lldb::SBSection sb_section;
181 if (m_opaque_ap.get())
Greg Clayton7e8a6012012-04-04 20:36:48 +0000182 sb_section.SetSP (m_opaque_ap->GetSection());
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000183 return sb_section;
184}
185
Greg Clayton13d19502012-01-29 06:07:39 +0000186lldb::addr_t
187SBAddress::GetOffset ()
188{
189 if (m_opaque_ap.get())
Greg Claytonbbffdd72012-10-30 16:32:38 +0000190 return m_opaque_ap->GetOffset();
Greg Clayton13d19502012-01-29 06:07:39 +0000191 return 0;
192}
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000193
194Address *
Greg Clayton09960032010-09-10 18:31:35 +0000195SBAddress::operator->()
196{
Greg Clayton7e8a6012012-04-04 20:36:48 +0000197 return m_opaque_ap.get();
Greg Clayton09960032010-09-10 18:31:35 +0000198}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000199
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000200const Address *
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000201SBAddress::operator->() const
202{
Greg Clayton7e8a6012012-04-04 20:36:48 +0000203 return m_opaque_ap.get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000204}
205
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000206Address &
Greg Clayton00e6fbf2011-07-22 16:46:35 +0000207SBAddress::ref ()
Greg Clayton09960032010-09-10 18:31:35 +0000208{
209 if (m_opaque_ap.get() == NULL)
Greg Clayton7e8a6012012-04-04 20:36:48 +0000210 m_opaque_ap.reset (new Address());
211 return *m_opaque_ap;
Greg Clayton09960032010-09-10 18:31:35 +0000212}
213
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000214const Address &
Greg Clayton00e6fbf2011-07-22 16:46:35 +0000215SBAddress::ref () const
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000216{
Greg Clayton7e8a6012012-04-04 20:36:48 +0000217 // This object should already have checked with "IsValid()"
Greg Clayton00e6fbf2011-07-22 16:46:35 +0000218 // prior to calling this function. In case you didn't we will assert
219 // and die to let you know.
Greg Clayton09960032010-09-10 18:31:35 +0000220 assert (m_opaque_ap.get());
Greg Clayton7e8a6012012-04-04 20:36:48 +0000221 return *m_opaque_ap;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000222}
223
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000224Address *
Caroline Tice750cd172010-10-26 23:49:36 +0000225SBAddress::get ()
226{
Greg Clayton7e8a6012012-04-04 20:36:48 +0000227 return m_opaque_ap.get();
Caroline Tice750cd172010-10-26 23:49:36 +0000228}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000229
Caroline Ticedde9cff2010-09-20 05:20:02 +0000230bool
231SBAddress::GetDescription (SBStream &description)
232{
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000233 // Call "ref()" on the stream to make sure it creates a backing stream in
234 // case there isn't one already...
Greg Claytonda7bc7d2011-11-13 06:57:31 +0000235 Stream &strm = description.ref();
Caroline Ticedde9cff2010-09-20 05:20:02 +0000236 if (m_opaque_ap.get())
Greg Clayton7e8a6012012-04-04 20:36:48 +0000237 {
238 m_opaque_ap->Dump (&strm,
239 NULL,
240 Address::DumpStyleResolvedDescription,
241 Address::DumpStyleModuleWithFileAddress,
242 4);
243 StreamString sstrm;
244// m_opaque_ap->Dump (&sstrm, NULL, Address::DumpStyleResolvedDescription, Address::DumpStyleInvalid, 4);
245// if (sstrm.GetData())
246// strm.Printf (" (%s)", sstrm.GetData());
247 }
Caroline Ticedde9cff2010-09-20 05:20:02 +0000248 else
Greg Claytonda7bc7d2011-11-13 06:57:31 +0000249 strm.PutCString ("No value");
Caroline Ticedde9cff2010-09-20 05:20:02 +0000250
251 return true;
252}
Greg Clayton05d2b7f2011-03-31 01:08:07 +0000253
Greg Clayton05d2b7f2011-03-31 01:08:07 +0000254SBModule
255SBAddress::GetModule ()
256{
257 SBModule sb_module;
258 if (m_opaque_ap.get())
Greg Clayton7e8a6012012-04-04 20:36:48 +0000259 sb_module.SetSP (m_opaque_ap->GetModule());
Greg Clayton05d2b7f2011-03-31 01:08:07 +0000260 return sb_module;
261}
262
Greg Clayton7e9b1fd2011-08-12 21:40:01 +0000263SBSymbolContext
264SBAddress::GetSymbolContext (uint32_t resolve_scope)
265{
266 SBSymbolContext sb_sc;
267 if (m_opaque_ap.get())
Greg Clayton7e8a6012012-04-04 20:36:48 +0000268 m_opaque_ap->CalculateSymbolContext (&sb_sc.ref(), resolve_scope);
Greg Clayton7e9b1fd2011-08-12 21:40:01 +0000269 return sb_sc;
270}
271
272SBCompileUnit
273SBAddress::GetCompileUnit ()
274{
275 SBCompileUnit sb_comp_unit;
276 if (m_opaque_ap.get())
Greg Clayton7e8a6012012-04-04 20:36:48 +0000277 sb_comp_unit.reset(m_opaque_ap->CalculateSymbolContextCompileUnit());
Greg Clayton7e9b1fd2011-08-12 21:40:01 +0000278 return sb_comp_unit;
279}
280
281SBFunction
282SBAddress::GetFunction ()
283{
284 SBFunction sb_function;
285 if (m_opaque_ap.get())
Greg Clayton7e8a6012012-04-04 20:36:48 +0000286 sb_function.reset(m_opaque_ap->CalculateSymbolContextFunction());
Greg Clayton7e9b1fd2011-08-12 21:40:01 +0000287 return sb_function;
288}
289
290SBBlock
291SBAddress::GetBlock ()
292{
293 SBBlock sb_block;
294 if (m_opaque_ap.get())
Greg Clayton7e8a6012012-04-04 20:36:48 +0000295 sb_block.SetPtr(m_opaque_ap->CalculateSymbolContextBlock());
Greg Clayton7e9b1fd2011-08-12 21:40:01 +0000296 return sb_block;
297}
298
299SBSymbol
300SBAddress::GetSymbol ()
301{
302 SBSymbol sb_symbol;
303 if (m_opaque_ap.get())
Greg Clayton7e8a6012012-04-04 20:36:48 +0000304 sb_symbol.reset(m_opaque_ap->CalculateSymbolContextSymbol());
Greg Clayton7e9b1fd2011-08-12 21:40:01 +0000305 return sb_symbol;
306}
307
308SBLineEntry
309SBAddress::GetLineEntry ()
310{
311 SBLineEntry sb_line_entry;
312 if (m_opaque_ap.get())
313 {
314 LineEntry line_entry;
Greg Clayton7e8a6012012-04-04 20:36:48 +0000315 if (m_opaque_ap->CalculateSymbolContextLineEntry (line_entry))
Greg Clayton7e9b1fd2011-08-12 21:40:01 +0000316 sb_line_entry.SetLineEntry (line_entry);
317 }
318 return sb_line_entry;
319}
320
Greg Claytonc8e0c242012-04-13 00:07:34 +0000321AddressClass
322SBAddress::GetAddressClass ()
323{
324 if (m_opaque_ap.get())
325 return m_opaque_ap->GetAddressClass();
326 return eAddressClassInvalid;
327}
Greg Clayton05d2b7f2011-03-31 01:08:07 +0000328