blob: 6c357f9ef53f4e301ef194066032a9d76cfff496 [file] [log] [blame]
Chris Lattner24943d22010-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"
Caroline Tice98f930f2010-09-20 05:20:02 +000012#include "lldb/API/SBStream.h"
Chris Lattner24943d22010-06-08 16:52:24 +000013#include "lldb/Core/Address.h"
Caroline Tice7826c882010-10-26 03:11:13 +000014#include "lldb/Core/Log.h"
Greg Claytonb0e68d92011-03-31 01:08:07 +000015#include "lldb/Core/Module.h"
Greg Claytonbdcda462010-12-20 20:49:23 +000016#include "lldb/Host/Mutex.h"
17#include "lldb/Target/Target.h"
Chris Lattner24943d22010-06-08 16:52:24 +000018
19using namespace lldb;
Caroline Tice7826c882010-10-26 03:11:13 +000020using namespace lldb_private;
Chris Lattner24943d22010-06-08 16:52:24 +000021
22
23SBAddress::SBAddress () :
Greg Clayton63094e02010-06-23 01:19:29 +000024 m_opaque_ap ()
Chris Lattner24943d22010-06-08 16:52:24 +000025{
26}
27
28SBAddress::SBAddress (const lldb_private::Address *lldb_object_ptr) :
Greg Clayton63094e02010-06-23 01:19:29 +000029 m_opaque_ap ()
Chris Lattner24943d22010-06-08 16:52:24 +000030{
31 if (lldb_object_ptr)
Greg Clayton63094e02010-06-23 01:19:29 +000032 m_opaque_ap.reset (new lldb_private::Address(*lldb_object_ptr));
Chris Lattner24943d22010-06-08 16:52:24 +000033}
34
35SBAddress::SBAddress (const SBAddress &rhs) :
Greg Clayton63094e02010-06-23 01:19:29 +000036 m_opaque_ap ()
Chris Lattner24943d22010-06-08 16:52:24 +000037{
38 if (rhs.IsValid())
Greg Clayton63094e02010-06-23 01:19:29 +000039 m_opaque_ap.reset (new lldb_private::Address(*rhs.m_opaque_ap.get()));
Chris Lattner24943d22010-06-08 16:52:24 +000040}
41
42SBAddress::~SBAddress ()
43{
44}
45
46const SBAddress &
47SBAddress::operator = (const SBAddress &rhs)
48{
Greg Clayton49ce6822010-10-31 03:01:06 +000049 if (this != &rhs && rhs.IsValid())
50 m_opaque_ap.reset (new lldb_private::Address(*rhs.m_opaque_ap.get()));
Chris Lattner24943d22010-06-08 16:52:24 +000051 return *this;
52}
53
54bool
55SBAddress::IsValid () const
56{
Greg Clayton63094e02010-06-23 01:19:29 +000057 return m_opaque_ap.get() != NULL && m_opaque_ap->IsValid();
Chris Lattner24943d22010-06-08 16:52:24 +000058}
59
60void
Greg Clayton466f6c42010-09-10 18:31:35 +000061SBAddress::Clear ()
62{
63 m_opaque_ap.reset();
64}
65
66void
Chris Lattner24943d22010-06-08 16:52:24 +000067SBAddress::SetAddress (const lldb_private::Address *lldb_object_ptr)
68{
69 if (lldb_object_ptr)
70 {
Greg Clayton63094e02010-06-23 01:19:29 +000071 if (m_opaque_ap.get())
72 *m_opaque_ap = *lldb_object_ptr;
Chris Lattner24943d22010-06-08 16:52:24 +000073 else
Greg Clayton63094e02010-06-23 01:19:29 +000074 m_opaque_ap.reset (new lldb_private::Address(*lldb_object_ptr));
Chris Lattner24943d22010-06-08 16:52:24 +000075 return;
76 }
Greg Clayton63094e02010-06-23 01:19:29 +000077 if (m_opaque_ap.get())
78 m_opaque_ap->Clear();
Chris Lattner24943d22010-06-08 16:52:24 +000079}
80
81lldb::addr_t
82SBAddress::GetFileAddress () const
83{
Greg Clayton63094e02010-06-23 01:19:29 +000084 if (m_opaque_ap.get())
85 return m_opaque_ap->GetFileAddress();
Chris Lattner24943d22010-06-08 16:52:24 +000086 else
87 return LLDB_INVALID_ADDRESS;
88}
89
90lldb::addr_t
Greg Claytoneea26402010-09-14 23:36:40 +000091SBAddress::GetLoadAddress (const SBTarget &target) const
Chris Lattner24943d22010-06-08 16:52:24 +000092{
Greg Claytone005f2c2010-11-06 01:53:30 +000093 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +000094
Greg Claytonbdcda462010-12-20 20:49:23 +000095 lldb::addr_t addr = LLDB_INVALID_ADDRESS;
Greg Clayton63094e02010-06-23 01:19:29 +000096 if (m_opaque_ap.get())
Caroline Tice7826c882010-10-26 03:11:13 +000097 {
Greg Claytonbdcda462010-12-20 20:49:23 +000098 Mutex::Locker api_locker (target->GetAPIMutex());
99 addr = m_opaque_ap->GetLoadAddress (target.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000100 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000101
102 if (log)
Caroline Tice7826c882010-10-26 03:11:13 +0000103 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000104 if (addr == LLDB_INVALID_ADDRESS)
Greg Clayton49ce6822010-10-31 03:01:06 +0000105 log->Printf ("SBAddress::GetLoadAddress (SBTarget(%p)) => LLDB_INVALID_ADDRESS", target.get());
Greg Claytonbdcda462010-12-20 20:49:23 +0000106 else
107 log->Printf ("SBAddress::GetLoadAddress (SBTarget(%p)) => 0x%llx", target.get(), addr);
Caroline Tice7826c882010-10-26 03:11:13 +0000108 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000109
110 return addr;
Chris Lattner24943d22010-06-08 16:52:24 +0000111}
112
113bool
114SBAddress::OffsetAddress (addr_t offset)
115{
Greg Clayton63094e02010-06-23 01:19:29 +0000116 if (m_opaque_ap.get())
Chris Lattner24943d22010-06-08 16:52:24 +0000117 {
Greg Clayton63094e02010-06-23 01:19:29 +0000118 addr_t addr_offset = m_opaque_ap->GetOffset();
Chris Lattner24943d22010-06-08 16:52:24 +0000119 if (addr_offset != LLDB_INVALID_ADDRESS)
120 {
Greg Clayton63094e02010-06-23 01:19:29 +0000121 m_opaque_ap->SetOffset(addr_offset + offset);
Chris Lattner24943d22010-06-08 16:52:24 +0000122 return true;
123 }
124 }
125 return false;
126}
127
Greg Clayton466f6c42010-09-10 18:31:35 +0000128lldb_private::Address *
129SBAddress::operator->()
130{
131 return m_opaque_ap.get();
132}
Chris Lattner24943d22010-06-08 16:52:24 +0000133
134const lldb_private::Address *
135SBAddress::operator->() const
136{
Greg Clayton63094e02010-06-23 01:19:29 +0000137 return m_opaque_ap.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000138}
139
Greg Clayton466f6c42010-09-10 18:31:35 +0000140lldb_private::Address &
141SBAddress::operator*()
142{
143 if (m_opaque_ap.get() == NULL)
144 m_opaque_ap.reset (new lldb_private::Address);
145 return *m_opaque_ap;
146}
147
Chris Lattner24943d22010-06-08 16:52:24 +0000148const lldb_private::Address &
149SBAddress::operator*() const
150{
Greg Clayton466f6c42010-09-10 18:31:35 +0000151 assert (m_opaque_ap.get());
Greg Clayton63094e02010-06-23 01:19:29 +0000152 return *m_opaque_ap;
Chris Lattner24943d22010-06-08 16:52:24 +0000153}
154
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000155lldb_private::Address *
156SBAddress::get ()
157{
158 return m_opaque_ap.get();
159}
Chris Lattner24943d22010-06-08 16:52:24 +0000160
Caroline Tice98f930f2010-09-20 05:20:02 +0000161bool
162SBAddress::GetDescription (SBStream &description)
163{
Greg Clayton49ce6822010-10-31 03:01:06 +0000164 // Call "ref()" on the stream to make sure it creates a backing stream in
165 // case there isn't one already...
Caroline Ticee49ec182010-09-22 23:01:29 +0000166 description.ref();
Caroline Tice98f930f2010-09-20 05:20:02 +0000167 if (m_opaque_ap.get())
Greg Clayton49ce6822010-10-31 03:01:06 +0000168 m_opaque_ap->Dump (description.get(), NULL, Address::DumpStyleModuleWithFileAddress, Address::DumpStyleInvalid, 4);
Caroline Tice98f930f2010-09-20 05:20:02 +0000169 else
170 description.Printf ("No value");
171
172 return true;
173}
Greg Claytonb0e68d92011-03-31 01:08:07 +0000174
175SectionType
176SBAddress::GetSectionType ()
177{
178 if (m_opaque_ap.get())
179 {
180 const Section *section = m_opaque_ap->GetSection();
181 if (section)
182 return section->GetType();
183 }
184 return eSectionTypeInvalid;
185}
186
187
188SBModule
189SBAddress::GetModule ()
190{
191 SBModule sb_module;
192 if (m_opaque_ap.get())
193 {
194 const Module *module = m_opaque_ap->GetModule();
195 if (module)
196 *sb_module = module->GetSP();
197 }
198 return sb_module;
199}
200
201