blob: 913847a893e9bb4c2f0b7063a1c623d3409e1f11 [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"
Chris Lattner24943d22010-06-08 16:52:24 +000015
16using namespace lldb;
Caroline Tice7826c882010-10-26 03:11:13 +000017using namespace lldb_private;
Chris Lattner24943d22010-06-08 16:52:24 +000018
19
20SBAddress::SBAddress () :
Greg Clayton63094e02010-06-23 01:19:29 +000021 m_opaque_ap ()
Chris Lattner24943d22010-06-08 16:52:24 +000022{
Caroline Tice7826c882010-10-26 03:11:13 +000023 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE);
24
25 if (log)
26 log->Printf ("SBAddress::SBAddress () ==> this = %p (%s)", this);
Chris Lattner24943d22010-06-08 16:52:24 +000027}
28
29SBAddress::SBAddress (const lldb_private::Address *lldb_object_ptr) :
Greg Clayton63094e02010-06-23 01:19:29 +000030 m_opaque_ap ()
Chris Lattner24943d22010-06-08 16:52:24 +000031{
Caroline Tice7826c882010-10-26 03:11:13 +000032 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE);
33
Chris Lattner24943d22010-06-08 16:52:24 +000034 if (lldb_object_ptr)
Greg Clayton63094e02010-06-23 01:19:29 +000035 m_opaque_ap.reset (new lldb_private::Address(*lldb_object_ptr));
Caroline Tice7826c882010-10-26 03:11:13 +000036
37 if (log)
38 {
39 SBStream sstr;
40 GetDescription (sstr);
41 log->Printf ("SBAddress::SBAddress (const lldb_private::Address *lldb_object_ptr) lldb_object_ptr = %p "
42 "==> this = %p (%s)", lldb_object_ptr, this, sstr.GetData());
43 }
Chris Lattner24943d22010-06-08 16:52:24 +000044}
45
46SBAddress::SBAddress (const SBAddress &rhs) :
Greg Clayton63094e02010-06-23 01:19:29 +000047 m_opaque_ap ()
Chris Lattner24943d22010-06-08 16:52:24 +000048{
Caroline Tice7826c882010-10-26 03:11:13 +000049 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE);
50
Chris Lattner24943d22010-06-08 16:52:24 +000051 if (rhs.IsValid())
Greg Clayton63094e02010-06-23 01:19:29 +000052 m_opaque_ap.reset (new lldb_private::Address(*rhs.m_opaque_ap.get()));
Caroline Tice7826c882010-10-26 03:11:13 +000053
54 if (log)
55 log->Printf ("SBAddress::SBAddress (const SBAddress &rhs) rhs.m_opaque_ap.get() = %p ==> this = %p",
56 (rhs.IsValid() ? rhs.m_opaque_ap.get() : NULL), this);
Chris Lattner24943d22010-06-08 16:52:24 +000057}
58
59SBAddress::~SBAddress ()
60{
61}
62
63const SBAddress &
64SBAddress::operator = (const SBAddress &rhs)
65{
Caroline Tice7826c882010-10-26 03:11:13 +000066 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
67
Chris Lattner24943d22010-06-08 16:52:24 +000068 if (this != &rhs)
69 {
70 if (rhs.IsValid())
Greg Clayton63094e02010-06-23 01:19:29 +000071 m_opaque_ap.reset (new lldb_private::Address(*rhs.m_opaque_ap.get()));
Chris Lattner24943d22010-06-08 16:52:24 +000072 }
Caroline Tice7826c882010-10-26 03:11:13 +000073 if (log)
74 log->Printf ("SBAddress::operator= (const SBAddress rhs) rhs = %p ==> this = %p",
75 (rhs.IsValid() ? rhs.m_opaque_ap.get() : NULL), this);
76
Chris Lattner24943d22010-06-08 16:52:24 +000077 return *this;
78}
79
80bool
81SBAddress::IsValid () const
82{
Greg Clayton63094e02010-06-23 01:19:29 +000083 return m_opaque_ap.get() != NULL && m_opaque_ap->IsValid();
Chris Lattner24943d22010-06-08 16:52:24 +000084}
85
86void
Greg Clayton466f6c42010-09-10 18:31:35 +000087SBAddress::Clear ()
88{
89 m_opaque_ap.reset();
90}
91
92void
Chris Lattner24943d22010-06-08 16:52:24 +000093SBAddress::SetAddress (const lldb_private::Address *lldb_object_ptr)
94{
95 if (lldb_object_ptr)
96 {
Greg Clayton63094e02010-06-23 01:19:29 +000097 if (m_opaque_ap.get())
98 *m_opaque_ap = *lldb_object_ptr;
Chris Lattner24943d22010-06-08 16:52:24 +000099 else
Greg Clayton63094e02010-06-23 01:19:29 +0000100 m_opaque_ap.reset (new lldb_private::Address(*lldb_object_ptr));
Chris Lattner24943d22010-06-08 16:52:24 +0000101 return;
102 }
Greg Clayton63094e02010-06-23 01:19:29 +0000103 if (m_opaque_ap.get())
104 m_opaque_ap->Clear();
Chris Lattner24943d22010-06-08 16:52:24 +0000105}
106
107lldb::addr_t
108SBAddress::GetFileAddress () const
109{
Greg Clayton63094e02010-06-23 01:19:29 +0000110 if (m_opaque_ap.get())
111 return m_opaque_ap->GetFileAddress();
Chris Lattner24943d22010-06-08 16:52:24 +0000112 else
113 return LLDB_INVALID_ADDRESS;
114}
115
116lldb::addr_t
Greg Claytoneea26402010-09-14 23:36:40 +0000117SBAddress::GetLoadAddress (const SBTarget &target) const
Chris Lattner24943d22010-06-08 16:52:24 +0000118{
Caroline Tice7826c882010-10-26 03:11:13 +0000119 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
120
121 if (log)
122 log->Printf ("SBAddress::GetLoadAddress");
123
Greg Clayton63094e02010-06-23 01:19:29 +0000124 if (m_opaque_ap.get())
Caroline Tice7826c882010-10-26 03:11:13 +0000125 {
126 lldb::addr_t addr = m_opaque_ap->GetLoadAddress (target.get());
127 if (log)
128 log->Printf ("SBAddress::GetLoadAddress ==> %p", addr);
129 return addr;
130 }
Chris Lattner24943d22010-06-08 16:52:24 +0000131 else
Caroline Tice7826c882010-10-26 03:11:13 +0000132 {
133 if (log)
134 log->Printf ("SBAddress::GetLoadAddress ==> LLDB_INVALID_ADDRESS");
Chris Lattner24943d22010-06-08 16:52:24 +0000135 return LLDB_INVALID_ADDRESS;
Caroline Tice7826c882010-10-26 03:11:13 +0000136 }
Chris Lattner24943d22010-06-08 16:52:24 +0000137}
138
139bool
140SBAddress::OffsetAddress (addr_t offset)
141{
Greg Clayton63094e02010-06-23 01:19:29 +0000142 if (m_opaque_ap.get())
Chris Lattner24943d22010-06-08 16:52:24 +0000143 {
Greg Clayton63094e02010-06-23 01:19:29 +0000144 addr_t addr_offset = m_opaque_ap->GetOffset();
Chris Lattner24943d22010-06-08 16:52:24 +0000145 if (addr_offset != LLDB_INVALID_ADDRESS)
146 {
Greg Clayton63094e02010-06-23 01:19:29 +0000147 m_opaque_ap->SetOffset(addr_offset + offset);
Chris Lattner24943d22010-06-08 16:52:24 +0000148 return true;
149 }
150 }
151 return false;
152}
153
Greg Clayton466f6c42010-09-10 18:31:35 +0000154lldb_private::Address *
155SBAddress::operator->()
156{
157 return m_opaque_ap.get();
158}
Chris Lattner24943d22010-06-08 16:52:24 +0000159
160const lldb_private::Address *
161SBAddress::operator->() const
162{
Greg Clayton63094e02010-06-23 01:19:29 +0000163 return m_opaque_ap.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000164}
165
Greg Clayton466f6c42010-09-10 18:31:35 +0000166lldb_private::Address &
167SBAddress::operator*()
168{
169 if (m_opaque_ap.get() == NULL)
170 m_opaque_ap.reset (new lldb_private::Address);
171 return *m_opaque_ap;
172}
173
Chris Lattner24943d22010-06-08 16:52:24 +0000174const lldb_private::Address &
175SBAddress::operator*() const
176{
Greg Clayton466f6c42010-09-10 18:31:35 +0000177 assert (m_opaque_ap.get());
Greg Clayton63094e02010-06-23 01:19:29 +0000178 return *m_opaque_ap;
Chris Lattner24943d22010-06-08 16:52:24 +0000179}
180
181
Caroline Tice98f930f2010-09-20 05:20:02 +0000182bool
183SBAddress::GetDescription (SBStream &description)
184{
Caroline Ticee49ec182010-09-22 23:01:29 +0000185 description.ref();
Caroline Tice98f930f2010-09-20 05:20:02 +0000186 if (m_opaque_ap.get())
Caroline Ticee7a566e2010-09-20 16:21:41 +0000187 {
Caroline Tice98f930f2010-09-20 05:20:02 +0000188 m_opaque_ap->DumpDebug (description.get());
Caroline Ticee7a566e2010-09-20 16:21:41 +0000189 }
Caroline Tice98f930f2010-09-20 05:20:02 +0000190 else
191 description.Printf ("No value");
192
193 return true;
194}