blob: 618a2f5490582b629f73e5ae25e549aebc376ac2 [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{
28 if (lldb_object_ptr)
Greg Clayton63094e02010-06-23 01:19:29 +000029 m_opaque_ap.reset (new lldb_private::Address(*lldb_object_ptr));
Chris Lattner24943d22010-06-08 16:52:24 +000030}
31
32SBAddress::SBAddress (const SBAddress &rhs) :
Greg Clayton63094e02010-06-23 01:19:29 +000033 m_opaque_ap ()
Chris Lattner24943d22010-06-08 16:52:24 +000034{
35 if (rhs.IsValid())
Greg Clayton63094e02010-06-23 01:19:29 +000036 m_opaque_ap.reset (new lldb_private::Address(*rhs.m_opaque_ap.get()));
Chris Lattner24943d22010-06-08 16:52:24 +000037}
38
39SBAddress::~SBAddress ()
40{
41}
42
43const SBAddress &
44SBAddress::operator = (const SBAddress &rhs)
45{
Greg Clayton49ce6822010-10-31 03:01:06 +000046 if (this != &rhs && rhs.IsValid())
47 m_opaque_ap.reset (new lldb_private::Address(*rhs.m_opaque_ap.get()));
Chris Lattner24943d22010-06-08 16:52:24 +000048 return *this;
49}
50
51bool
52SBAddress::IsValid () const
53{
Greg Clayton63094e02010-06-23 01:19:29 +000054 return m_opaque_ap.get() != NULL && m_opaque_ap->IsValid();
Chris Lattner24943d22010-06-08 16:52:24 +000055}
56
57void
Greg Clayton466f6c42010-09-10 18:31:35 +000058SBAddress::Clear ()
59{
60 m_opaque_ap.reset();
61}
62
63void
Chris Lattner24943d22010-06-08 16:52:24 +000064SBAddress::SetAddress (const lldb_private::Address *lldb_object_ptr)
65{
66 if (lldb_object_ptr)
67 {
Greg Clayton63094e02010-06-23 01:19:29 +000068 if (m_opaque_ap.get())
69 *m_opaque_ap = *lldb_object_ptr;
Chris Lattner24943d22010-06-08 16:52:24 +000070 else
Greg Clayton63094e02010-06-23 01:19:29 +000071 m_opaque_ap.reset (new lldb_private::Address(*lldb_object_ptr));
Chris Lattner24943d22010-06-08 16:52:24 +000072 return;
73 }
Greg Clayton63094e02010-06-23 01:19:29 +000074 if (m_opaque_ap.get())
75 m_opaque_ap->Clear();
Chris Lattner24943d22010-06-08 16:52:24 +000076}
77
78lldb::addr_t
79SBAddress::GetFileAddress () const
80{
Greg Clayton63094e02010-06-23 01:19:29 +000081 if (m_opaque_ap.get())
82 return m_opaque_ap->GetFileAddress();
Chris Lattner24943d22010-06-08 16:52:24 +000083 else
84 return LLDB_INVALID_ADDRESS;
85}
86
87lldb::addr_t
Greg Claytoneea26402010-09-14 23:36:40 +000088SBAddress::GetLoadAddress (const SBTarget &target) const
Chris Lattner24943d22010-06-08 16:52:24 +000089{
Caroline Tice7826c882010-10-26 03:11:13 +000090 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +000091
Greg Clayton63094e02010-06-23 01:19:29 +000092 if (m_opaque_ap.get())
Caroline Tice7826c882010-10-26 03:11:13 +000093 {
94 lldb::addr_t addr = m_opaque_ap->GetLoadAddress (target.get());
95 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +000096 log->Printf ("SBAddress::GetLoadAddress (SBTarget(%p)) => 0x%llx", target.get(), addr);
Caroline Tice7826c882010-10-26 03:11:13 +000097 return addr;
98 }
Chris Lattner24943d22010-06-08 16:52:24 +000099 else
Caroline Tice7826c882010-10-26 03:11:13 +0000100 {
101 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000102 log->Printf ("SBAddress::GetLoadAddress (SBTarget(%p)) => LLDB_INVALID_ADDRESS", target.get());
Chris Lattner24943d22010-06-08 16:52:24 +0000103 return LLDB_INVALID_ADDRESS;
Caroline Tice7826c882010-10-26 03:11:13 +0000104 }
Chris Lattner24943d22010-06-08 16:52:24 +0000105}
106
107bool
108SBAddress::OffsetAddress (addr_t offset)
109{
Greg Clayton63094e02010-06-23 01:19:29 +0000110 if (m_opaque_ap.get())
Chris Lattner24943d22010-06-08 16:52:24 +0000111 {
Greg Clayton63094e02010-06-23 01:19:29 +0000112 addr_t addr_offset = m_opaque_ap->GetOffset();
Chris Lattner24943d22010-06-08 16:52:24 +0000113 if (addr_offset != LLDB_INVALID_ADDRESS)
114 {
Greg Clayton63094e02010-06-23 01:19:29 +0000115 m_opaque_ap->SetOffset(addr_offset + offset);
Chris Lattner24943d22010-06-08 16:52:24 +0000116 return true;
117 }
118 }
119 return false;
120}
121
Greg Clayton466f6c42010-09-10 18:31:35 +0000122lldb_private::Address *
123SBAddress::operator->()
124{
125 return m_opaque_ap.get();
126}
Chris Lattner24943d22010-06-08 16:52:24 +0000127
128const lldb_private::Address *
129SBAddress::operator->() const
130{
Greg Clayton63094e02010-06-23 01:19:29 +0000131 return m_opaque_ap.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000132}
133
Greg Clayton466f6c42010-09-10 18:31:35 +0000134lldb_private::Address &
135SBAddress::operator*()
136{
137 if (m_opaque_ap.get() == NULL)
138 m_opaque_ap.reset (new lldb_private::Address);
139 return *m_opaque_ap;
140}
141
Chris Lattner24943d22010-06-08 16:52:24 +0000142const lldb_private::Address &
143SBAddress::operator*() const
144{
Greg Clayton466f6c42010-09-10 18:31:35 +0000145 assert (m_opaque_ap.get());
Greg Clayton63094e02010-06-23 01:19:29 +0000146 return *m_opaque_ap;
Chris Lattner24943d22010-06-08 16:52:24 +0000147}
148
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000149lldb_private::Address *
150SBAddress::get ()
151{
152 return m_opaque_ap.get();
153}
Chris Lattner24943d22010-06-08 16:52:24 +0000154
Caroline Tice98f930f2010-09-20 05:20:02 +0000155bool
156SBAddress::GetDescription (SBStream &description)
157{
Greg Clayton49ce6822010-10-31 03:01:06 +0000158 // Call "ref()" on the stream to make sure it creates a backing stream in
159 // case there isn't one already...
Caroline Ticee49ec182010-09-22 23:01:29 +0000160 description.ref();
Caroline Tice98f930f2010-09-20 05:20:02 +0000161 if (m_opaque_ap.get())
Greg Clayton49ce6822010-10-31 03:01:06 +0000162 m_opaque_ap->Dump (description.get(), NULL, Address::DumpStyleModuleWithFileAddress, Address::DumpStyleInvalid, 4);
Caroline Tice98f930f2010-09-20 05:20:02 +0000163 else
164 description.Printf ("No value");
165
166 return true;
167}