blob: 7f21cf79fcad9e92fb469ed66318f9c20fd2f346 [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"
14
15using namespace lldb;
16
17
18SBAddress::SBAddress () :
Greg Clayton63094e02010-06-23 01:19:29 +000019 m_opaque_ap ()
Chris Lattner24943d22010-06-08 16:52:24 +000020{
21}
22
23SBAddress::SBAddress (const lldb_private::Address *lldb_object_ptr) :
Greg Clayton63094e02010-06-23 01:19:29 +000024 m_opaque_ap ()
Chris Lattner24943d22010-06-08 16:52:24 +000025{
26 if (lldb_object_ptr)
Greg Clayton63094e02010-06-23 01:19:29 +000027 m_opaque_ap.reset (new lldb_private::Address(*lldb_object_ptr));
Chris Lattner24943d22010-06-08 16:52:24 +000028}
29
30SBAddress::SBAddress (const SBAddress &rhs) :
Greg Clayton63094e02010-06-23 01:19:29 +000031 m_opaque_ap ()
Chris Lattner24943d22010-06-08 16:52:24 +000032{
33 if (rhs.IsValid())
Greg Clayton63094e02010-06-23 01:19:29 +000034 m_opaque_ap.reset (new lldb_private::Address(*rhs.m_opaque_ap.get()));
Chris Lattner24943d22010-06-08 16:52:24 +000035}
36
37SBAddress::~SBAddress ()
38{
39}
40
41const SBAddress &
42SBAddress::operator = (const SBAddress &rhs)
43{
44 if (this != &rhs)
45 {
46 if (rhs.IsValid())
Greg Clayton63094e02010-06-23 01:19:29 +000047 m_opaque_ap.reset (new lldb_private::Address(*rhs.m_opaque_ap.get()));
Chris Lattner24943d22010-06-08 16:52:24 +000048 }
49 return *this;
50}
51
52bool
53SBAddress::IsValid () const
54{
Greg Clayton63094e02010-06-23 01:19:29 +000055 return m_opaque_ap.get() != NULL && m_opaque_ap->IsValid();
Chris Lattner24943d22010-06-08 16:52:24 +000056}
57
58void
Greg Clayton466f6c42010-09-10 18:31:35 +000059SBAddress::Clear ()
60{
61 m_opaque_ap.reset();
62}
63
64void
Chris Lattner24943d22010-06-08 16:52:24 +000065SBAddress::SetAddress (const lldb_private::Address *lldb_object_ptr)
66{
67 if (lldb_object_ptr)
68 {
Greg Clayton63094e02010-06-23 01:19:29 +000069 if (m_opaque_ap.get())
70 *m_opaque_ap = *lldb_object_ptr;
Chris Lattner24943d22010-06-08 16:52:24 +000071 else
Greg Clayton63094e02010-06-23 01:19:29 +000072 m_opaque_ap.reset (new lldb_private::Address(*lldb_object_ptr));
Chris Lattner24943d22010-06-08 16:52:24 +000073 return;
74 }
Greg Clayton63094e02010-06-23 01:19:29 +000075 if (m_opaque_ap.get())
76 m_opaque_ap->Clear();
Chris Lattner24943d22010-06-08 16:52:24 +000077}
78
79lldb::addr_t
80SBAddress::GetFileAddress () const
81{
Greg Clayton63094e02010-06-23 01:19:29 +000082 if (m_opaque_ap.get())
83 return m_opaque_ap->GetFileAddress();
Chris Lattner24943d22010-06-08 16:52:24 +000084 else
85 return LLDB_INVALID_ADDRESS;
86}
87
88lldb::addr_t
Greg Claytoneea26402010-09-14 23:36:40 +000089SBAddress::GetLoadAddress (const SBTarget &target) const
Chris Lattner24943d22010-06-08 16:52:24 +000090{
Greg Clayton63094e02010-06-23 01:19:29 +000091 if (m_opaque_ap.get())
Greg Claytoneea26402010-09-14 23:36:40 +000092 return m_opaque_ap->GetLoadAddress(target.get());
Chris Lattner24943d22010-06-08 16:52:24 +000093 else
94 return LLDB_INVALID_ADDRESS;
95}
96
97bool
98SBAddress::OffsetAddress (addr_t offset)
99{
Greg Clayton63094e02010-06-23 01:19:29 +0000100 if (m_opaque_ap.get())
Chris Lattner24943d22010-06-08 16:52:24 +0000101 {
Greg Clayton63094e02010-06-23 01:19:29 +0000102 addr_t addr_offset = m_opaque_ap->GetOffset();
Chris Lattner24943d22010-06-08 16:52:24 +0000103 if (addr_offset != LLDB_INVALID_ADDRESS)
104 {
Greg Clayton63094e02010-06-23 01:19:29 +0000105 m_opaque_ap->SetOffset(addr_offset + offset);
Chris Lattner24943d22010-06-08 16:52:24 +0000106 return true;
107 }
108 }
109 return false;
110}
111
Greg Clayton466f6c42010-09-10 18:31:35 +0000112lldb_private::Address *
113SBAddress::operator->()
114{
115 return m_opaque_ap.get();
116}
Chris Lattner24943d22010-06-08 16:52:24 +0000117
118const lldb_private::Address *
119SBAddress::operator->() const
120{
Greg Clayton63094e02010-06-23 01:19:29 +0000121 return m_opaque_ap.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000122}
123
Greg Clayton466f6c42010-09-10 18:31:35 +0000124lldb_private::Address &
125SBAddress::operator*()
126{
127 if (m_opaque_ap.get() == NULL)
128 m_opaque_ap.reset (new lldb_private::Address);
129 return *m_opaque_ap;
130}
131
Chris Lattner24943d22010-06-08 16:52:24 +0000132const lldb_private::Address &
133SBAddress::operator*() const
134{
Greg Clayton466f6c42010-09-10 18:31:35 +0000135 assert (m_opaque_ap.get());
Greg Clayton63094e02010-06-23 01:19:29 +0000136 return *m_opaque_ap;
Chris Lattner24943d22010-06-08 16:52:24 +0000137}
138
139
Caroline Tice98f930f2010-09-20 05:20:02 +0000140bool
141SBAddress::GetDescription (SBStream &description)
142{
Caroline Ticee49ec182010-09-22 23:01:29 +0000143 description.ref();
Caroline Tice98f930f2010-09-20 05:20:02 +0000144 if (m_opaque_ap.get())
Caroline Ticee7a566e2010-09-20 16:21:41 +0000145 {
Caroline Tice98f930f2010-09-20 05:20:02 +0000146 m_opaque_ap->DumpDebug (description.get());
Caroline Ticee7a566e2010-09-20 16:21:41 +0000147 }
Caroline Tice98f930f2010-09-20 05:20:02 +0000148 else
149 description.Printf ("No value");
150
151 return true;
152}