blob: 86d7fcb752a58f26f28a0ee00bd695a74df77776 [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{
23}
24
25SBAddress::SBAddress (const lldb_private::Address *lldb_object_ptr) :
Greg Clayton63094e02010-06-23 01:19:29 +000026 m_opaque_ap ()
Chris Lattner24943d22010-06-08 16:52:24 +000027{
Caroline Tice61ba7ec2010-10-26 23:49:36 +000028 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +000029
Chris Lattner24943d22010-06-08 16:52:24 +000030 if (lldb_object_ptr)
Greg Clayton63094e02010-06-23 01:19:29 +000031 m_opaque_ap.reset (new lldb_private::Address(*lldb_object_ptr));
Caroline Tice7826c882010-10-26 03:11:13 +000032
33 if (log)
34 {
35 SBStream sstr;
36 GetDescription (sstr);
Caroline Tice61ba7ec2010-10-26 23:49:36 +000037 log->Printf ("SBAddress::SBAddress (lldb_object_ptr=%p) "
38 "=> this.ap = %p (%s)", lldb_object_ptr, m_opaque_ap.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +000039 }
Chris Lattner24943d22010-06-08 16:52:24 +000040}
41
42SBAddress::SBAddress (const SBAddress &rhs) :
Greg Clayton63094e02010-06-23 01:19:29 +000043 m_opaque_ap ()
Chris Lattner24943d22010-06-08 16:52:24 +000044{
Caroline Tice61ba7ec2010-10-26 23:49:36 +000045 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +000046
Chris Lattner24943d22010-06-08 16:52:24 +000047 if (rhs.IsValid())
Greg Clayton63094e02010-06-23 01:19:29 +000048 m_opaque_ap.reset (new lldb_private::Address(*rhs.m_opaque_ap.get()));
Caroline Tice7826c882010-10-26 03:11:13 +000049
50 if (log)
Caroline Tice61ba7ec2010-10-26 23:49:36 +000051 log->Printf ("SBAddress::SBAddress (rhs.m_opaque_ap = %p) => this.ap = %p",
52 (rhs.IsValid() ? rhs.m_opaque_ap.get() : NULL), m_opaque_ap.get());
Chris Lattner24943d22010-06-08 16:52:24 +000053}
54
55SBAddress::~SBAddress ()
56{
57}
58
59const SBAddress &
60SBAddress::operator = (const SBAddress &rhs)
61{
Caroline Tice7826c882010-10-26 03:11:13 +000062 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
63
Chris Lattner24943d22010-06-08 16:52:24 +000064 if (this != &rhs)
65 {
66 if (rhs.IsValid())
Greg Clayton63094e02010-06-23 01:19:29 +000067 m_opaque_ap.reset (new lldb_private::Address(*rhs.m_opaque_ap.get()));
Chris Lattner24943d22010-06-08 16:52:24 +000068 }
Caroline Tice7826c882010-10-26 03:11:13 +000069 if (log)
Caroline Tice61ba7ec2010-10-26 23:49:36 +000070 log->Printf ("SBAddress::operator= (rhs.ap = %p) => this.ap = %p",
71 (rhs.IsValid() ? rhs.m_opaque_ap.get() : NULL), m_opaque_ap.get());
Caroline Tice7826c882010-10-26 03:11:13 +000072
Chris Lattner24943d22010-06-08 16:52:24 +000073 return *this;
74}
75
76bool
77SBAddress::IsValid () const
78{
Greg Clayton63094e02010-06-23 01:19:29 +000079 return m_opaque_ap.get() != NULL && m_opaque_ap->IsValid();
Chris Lattner24943d22010-06-08 16:52:24 +000080}
81
82void
Greg Clayton466f6c42010-09-10 18:31:35 +000083SBAddress::Clear ()
84{
85 m_opaque_ap.reset();
86}
87
88void
Chris Lattner24943d22010-06-08 16:52:24 +000089SBAddress::SetAddress (const lldb_private::Address *lldb_object_ptr)
90{
91 if (lldb_object_ptr)
92 {
Greg Clayton63094e02010-06-23 01:19:29 +000093 if (m_opaque_ap.get())
94 *m_opaque_ap = *lldb_object_ptr;
Chris Lattner24943d22010-06-08 16:52:24 +000095 else
Greg Clayton63094e02010-06-23 01:19:29 +000096 m_opaque_ap.reset (new lldb_private::Address(*lldb_object_ptr));
Chris Lattner24943d22010-06-08 16:52:24 +000097 return;
98 }
Greg Clayton63094e02010-06-23 01:19:29 +000099 if (m_opaque_ap.get())
100 m_opaque_ap->Clear();
Chris Lattner24943d22010-06-08 16:52:24 +0000101}
102
103lldb::addr_t
104SBAddress::GetFileAddress () const
105{
Greg Clayton63094e02010-06-23 01:19:29 +0000106 if (m_opaque_ap.get())
107 return m_opaque_ap->GetFileAddress();
Chris Lattner24943d22010-06-08 16:52:24 +0000108 else
109 return LLDB_INVALID_ADDRESS;
110}
111
112lldb::addr_t
Greg Claytoneea26402010-09-14 23:36:40 +0000113SBAddress::GetLoadAddress (const SBTarget &target) const
Chris Lattner24943d22010-06-08 16:52:24 +0000114{
Caroline Tice7826c882010-10-26 03:11:13 +0000115 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
116
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000117 //if (log)
118 // log->Printf ("SBAddress::GetLoadAddress");
Caroline Tice7826c882010-10-26 03:11:13 +0000119
Greg Clayton63094e02010-06-23 01:19:29 +0000120 if (m_opaque_ap.get())
Caroline Tice7826c882010-10-26 03:11:13 +0000121 {
122 lldb::addr_t addr = m_opaque_ap->GetLoadAddress (target.get());
123 if (log)
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000124 log->Printf ("SBAddress::GetLoadAddress (target.sp=%p) => %p", target.get(), addr);
Caroline Tice7826c882010-10-26 03:11:13 +0000125 return addr;
126 }
Chris Lattner24943d22010-06-08 16:52:24 +0000127 else
Caroline Tice7826c882010-10-26 03:11:13 +0000128 {
129 if (log)
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000130 log->Printf ("SBAddress::GetLoadAddress (target.sp=%p) => LLDB_INVALID_ADDRESS", target.get());
Chris Lattner24943d22010-06-08 16:52:24 +0000131 return LLDB_INVALID_ADDRESS;
Caroline Tice7826c882010-10-26 03:11:13 +0000132 }
Chris Lattner24943d22010-06-08 16:52:24 +0000133}
134
135bool
136SBAddress::OffsetAddress (addr_t offset)
137{
Greg Clayton63094e02010-06-23 01:19:29 +0000138 if (m_opaque_ap.get())
Chris Lattner24943d22010-06-08 16:52:24 +0000139 {
Greg Clayton63094e02010-06-23 01:19:29 +0000140 addr_t addr_offset = m_opaque_ap->GetOffset();
Chris Lattner24943d22010-06-08 16:52:24 +0000141 if (addr_offset != LLDB_INVALID_ADDRESS)
142 {
Greg Clayton63094e02010-06-23 01:19:29 +0000143 m_opaque_ap->SetOffset(addr_offset + offset);
Chris Lattner24943d22010-06-08 16:52:24 +0000144 return true;
145 }
146 }
147 return false;
148}
149
Greg Clayton466f6c42010-09-10 18:31:35 +0000150lldb_private::Address *
151SBAddress::operator->()
152{
153 return m_opaque_ap.get();
154}
Chris Lattner24943d22010-06-08 16:52:24 +0000155
156const lldb_private::Address *
157SBAddress::operator->() const
158{
Greg Clayton63094e02010-06-23 01:19:29 +0000159 return m_opaque_ap.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000160}
161
Greg Clayton466f6c42010-09-10 18:31:35 +0000162lldb_private::Address &
163SBAddress::operator*()
164{
165 if (m_opaque_ap.get() == NULL)
166 m_opaque_ap.reset (new lldb_private::Address);
167 return *m_opaque_ap;
168}
169
Chris Lattner24943d22010-06-08 16:52:24 +0000170const lldb_private::Address &
171SBAddress::operator*() const
172{
Greg Clayton466f6c42010-09-10 18:31:35 +0000173 assert (m_opaque_ap.get());
Greg Clayton63094e02010-06-23 01:19:29 +0000174 return *m_opaque_ap;
Chris Lattner24943d22010-06-08 16:52:24 +0000175}
176
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000177lldb_private::Address *
178SBAddress::get ()
179{
180 return m_opaque_ap.get();
181}
Chris Lattner24943d22010-06-08 16:52:24 +0000182
Caroline Tice98f930f2010-09-20 05:20:02 +0000183bool
184SBAddress::GetDescription (SBStream &description)
185{
Caroline Ticee49ec182010-09-22 23:01:29 +0000186 description.ref();
Caroline Tice98f930f2010-09-20 05:20:02 +0000187 if (m_opaque_ap.get())
Caroline Ticee7a566e2010-09-20 16:21:41 +0000188 {
Caroline Tice98f930f2010-09-20 05:20:02 +0000189 m_opaque_ap->DumpDebug (description.get());
Caroline Ticee7a566e2010-09-20 16:21:41 +0000190 }
Caroline Tice98f930f2010-09-20 05:20:02 +0000191 else
192 description.Printf ("No value");
193
194 return true;
195}