blob: 61ad71b633ccc3c85f21638b345a80e42d4a43e4 [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 Claytonbdcda462010-12-20 20:49:23 +000015#include "lldb/Host/Mutex.h"
16#include "lldb/Target/Target.h"
Chris Lattner24943d22010-06-08 16:52:24 +000017
18using namespace lldb;
Caroline Tice7826c882010-10-26 03:11:13 +000019using namespace lldb_private;
Chris Lattner24943d22010-06-08 16:52:24 +000020
21
22SBAddress::SBAddress () :
Greg Clayton63094e02010-06-23 01:19:29 +000023 m_opaque_ap ()
Chris Lattner24943d22010-06-08 16:52:24 +000024{
25}
26
27SBAddress::SBAddress (const lldb_private::Address *lldb_object_ptr) :
Greg Clayton63094e02010-06-23 01:19:29 +000028 m_opaque_ap ()
Chris Lattner24943d22010-06-08 16:52:24 +000029{
30 if (lldb_object_ptr)
Greg Clayton63094e02010-06-23 01:19:29 +000031 m_opaque_ap.reset (new lldb_private::Address(*lldb_object_ptr));
Chris Lattner24943d22010-06-08 16:52:24 +000032}
33
34SBAddress::SBAddress (const SBAddress &rhs) :
Greg Clayton63094e02010-06-23 01:19:29 +000035 m_opaque_ap ()
Chris Lattner24943d22010-06-08 16:52:24 +000036{
37 if (rhs.IsValid())
Greg Clayton63094e02010-06-23 01:19:29 +000038 m_opaque_ap.reset (new lldb_private::Address(*rhs.m_opaque_ap.get()));
Chris Lattner24943d22010-06-08 16:52:24 +000039}
40
41SBAddress::~SBAddress ()
42{
43}
44
45const SBAddress &
46SBAddress::operator = (const SBAddress &rhs)
47{
Greg Clayton49ce6822010-10-31 03:01:06 +000048 if (this != &rhs && rhs.IsValid())
49 m_opaque_ap.reset (new lldb_private::Address(*rhs.m_opaque_ap.get()));
Chris Lattner24943d22010-06-08 16:52:24 +000050 return *this;
51}
52
53bool
54SBAddress::IsValid () const
55{
Greg Clayton63094e02010-06-23 01:19:29 +000056 return m_opaque_ap.get() != NULL && m_opaque_ap->IsValid();
Chris Lattner24943d22010-06-08 16:52:24 +000057}
58
59void
Greg Clayton466f6c42010-09-10 18:31:35 +000060SBAddress::Clear ()
61{
62 m_opaque_ap.reset();
63}
64
65void
Chris Lattner24943d22010-06-08 16:52:24 +000066SBAddress::SetAddress (const lldb_private::Address *lldb_object_ptr)
67{
68 if (lldb_object_ptr)
69 {
Greg Clayton63094e02010-06-23 01:19:29 +000070 if (m_opaque_ap.get())
71 *m_opaque_ap = *lldb_object_ptr;
Chris Lattner24943d22010-06-08 16:52:24 +000072 else
Greg Clayton63094e02010-06-23 01:19:29 +000073 m_opaque_ap.reset (new lldb_private::Address(*lldb_object_ptr));
Chris Lattner24943d22010-06-08 16:52:24 +000074 return;
75 }
Greg Clayton63094e02010-06-23 01:19:29 +000076 if (m_opaque_ap.get())
77 m_opaque_ap->Clear();
Chris Lattner24943d22010-06-08 16:52:24 +000078}
79
80lldb::addr_t
81SBAddress::GetFileAddress () const
82{
Greg Clayton63094e02010-06-23 01:19:29 +000083 if (m_opaque_ap.get())
84 return m_opaque_ap->GetFileAddress();
Chris Lattner24943d22010-06-08 16:52:24 +000085 else
86 return LLDB_INVALID_ADDRESS;
87}
88
89lldb::addr_t
Greg Claytoneea26402010-09-14 23:36:40 +000090SBAddress::GetLoadAddress (const SBTarget &target) const
Chris Lattner24943d22010-06-08 16:52:24 +000091{
Greg Claytone005f2c2010-11-06 01:53:30 +000092 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +000093
Greg Claytonbdcda462010-12-20 20:49:23 +000094 lldb::addr_t addr = LLDB_INVALID_ADDRESS;
Greg Clayton63094e02010-06-23 01:19:29 +000095 if (m_opaque_ap.get())
Caroline Tice7826c882010-10-26 03:11:13 +000096 {
Greg Claytonbdcda462010-12-20 20:49:23 +000097 Mutex::Locker api_locker (target->GetAPIMutex());
98 addr = m_opaque_ap->GetLoadAddress (target.get());
Caroline Tice7826c882010-10-26 03:11:13 +000099 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000100
101 if (log)
Caroline Tice7826c882010-10-26 03:11:13 +0000102 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000103 if (addr == LLDB_INVALID_ADDRESS)
Greg Clayton49ce6822010-10-31 03:01:06 +0000104 log->Printf ("SBAddress::GetLoadAddress (SBTarget(%p)) => LLDB_INVALID_ADDRESS", target.get());
Greg Claytonbdcda462010-12-20 20:49:23 +0000105 else
106 log->Printf ("SBAddress::GetLoadAddress (SBTarget(%p)) => 0x%llx", target.get(), addr);
Caroline Tice7826c882010-10-26 03:11:13 +0000107 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000108
109 return addr;
Chris Lattner24943d22010-06-08 16:52:24 +0000110}
111
112bool
113SBAddress::OffsetAddress (addr_t offset)
114{
Greg Clayton63094e02010-06-23 01:19:29 +0000115 if (m_opaque_ap.get())
Chris Lattner24943d22010-06-08 16:52:24 +0000116 {
Greg Clayton63094e02010-06-23 01:19:29 +0000117 addr_t addr_offset = m_opaque_ap->GetOffset();
Chris Lattner24943d22010-06-08 16:52:24 +0000118 if (addr_offset != LLDB_INVALID_ADDRESS)
119 {
Greg Clayton63094e02010-06-23 01:19:29 +0000120 m_opaque_ap->SetOffset(addr_offset + offset);
Chris Lattner24943d22010-06-08 16:52:24 +0000121 return true;
122 }
123 }
124 return false;
125}
126
Greg Clayton466f6c42010-09-10 18:31:35 +0000127lldb_private::Address *
128SBAddress::operator->()
129{
130 return m_opaque_ap.get();
131}
Chris Lattner24943d22010-06-08 16:52:24 +0000132
133const lldb_private::Address *
134SBAddress::operator->() const
135{
Greg Clayton63094e02010-06-23 01:19:29 +0000136 return m_opaque_ap.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000137}
138
Greg Clayton466f6c42010-09-10 18:31:35 +0000139lldb_private::Address &
140SBAddress::operator*()
141{
142 if (m_opaque_ap.get() == NULL)
143 m_opaque_ap.reset (new lldb_private::Address);
144 return *m_opaque_ap;
145}
146
Chris Lattner24943d22010-06-08 16:52:24 +0000147const lldb_private::Address &
148SBAddress::operator*() const
149{
Greg Clayton466f6c42010-09-10 18:31:35 +0000150 assert (m_opaque_ap.get());
Greg Clayton63094e02010-06-23 01:19:29 +0000151 return *m_opaque_ap;
Chris Lattner24943d22010-06-08 16:52:24 +0000152}
153
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000154lldb_private::Address *
155SBAddress::get ()
156{
157 return m_opaque_ap.get();
158}
Chris Lattner24943d22010-06-08 16:52:24 +0000159
Caroline Tice98f930f2010-09-20 05:20:02 +0000160bool
161SBAddress::GetDescription (SBStream &description)
162{
Greg Clayton49ce6822010-10-31 03:01:06 +0000163 // Call "ref()" on the stream to make sure it creates a backing stream in
164 // case there isn't one already...
Caroline Ticee49ec182010-09-22 23:01:29 +0000165 description.ref();
Caroline Tice98f930f2010-09-20 05:20:02 +0000166 if (m_opaque_ap.get())
Greg Clayton49ce6822010-10-31 03:01:06 +0000167 m_opaque_ap->Dump (description.get(), NULL, Address::DumpStyleModuleWithFileAddress, Address::DumpStyleInvalid, 4);
Caroline Tice98f930f2010-09-20 05:20:02 +0000168 else
169 description.Printf ("No value");
170
171 return true;
172}