blob: 0cad2b7fddf27da3503be131b36234f282348165 [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- SBAddress.cpp -------------------------------------------*- C++ -*-===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006//
7//===----------------------------------------------------------------------===//
8
9#include "lldb/API/SBAddress.h"
10#include "lldb/API/SBProcess.h"
Greg Claytoncac9c5f2011-09-24 00:52:29 +000011#include "lldb/API/SBSection.h"
Caroline Ticedde9cff2010-09-20 05:20:02 +000012#include "lldb/API/SBStream.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000013#include "lldb/Core/Address.h"
Greg Clayton05d2b7f2011-03-31 01:08:07 +000014#include "lldb/Core/Module.h"
Zachary Turner32abc6e2015-03-03 19:23:09 +000015#include "lldb/Symbol/LineEntry.h"
Greg Claytonaf67cec2010-12-20 20:49:23 +000016#include "lldb/Target/Target.h"
Zachary Turner6f9e6902017-03-03 20:56:28 +000017#include "lldb/Utility/Log.h"
Zachary Turnerbf9a7732017-02-02 21:39:50 +000018#include "lldb/Utility/StreamString.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000019
20using namespace lldb;
Caroline Ticeceb6b132010-10-26 03:11:13 +000021using namespace lldb_private;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000022
Kate Stoneb9c1b512016-09-06 20:57:50 +000023SBAddress::SBAddress() : m_opaque_ap(new Address()) {}
Chris Lattner30fdc8d2010-06-08 16:52:24 +000024
Kate Stoneb9c1b512016-09-06 20:57:50 +000025SBAddress::SBAddress(const Address *lldb_object_ptr)
26 : m_opaque_ap(new Address()) {
27 if (lldb_object_ptr)
28 ref() = *lldb_object_ptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000029}
30
Kate Stoneb9c1b512016-09-06 20:57:50 +000031SBAddress::SBAddress(const SBAddress &rhs) : m_opaque_ap(new Address()) {
32 if (rhs.IsValid())
33 ref() = rhs.ref();
Chris Lattner30fdc8d2010-06-08 16:52:24 +000034}
35
Kate Stoneb9c1b512016-09-06 20:57:50 +000036SBAddress::SBAddress(lldb::SBSection section, lldb::addr_t offset)
37 : m_opaque_ap(new Address(section.GetSP(), offset)) {}
Greg Clayton819134a2012-02-04 02:58:17 +000038
Greg Clayton00e6fbf2011-07-22 16:46:35 +000039// Create an address by resolving a load address using the supplied target
Kate Stoneb9c1b512016-09-06 20:57:50 +000040SBAddress::SBAddress(lldb::addr_t load_addr, lldb::SBTarget &target)
41 : m_opaque_ap(new Address()) {
42 SetLoadAddress(load_addr, target);
Greg Clayton00e6fbf2011-07-22 16:46:35 +000043}
44
Kate Stoneb9c1b512016-09-06 20:57:50 +000045SBAddress::~SBAddress() {}
Greg Clayton00e6fbf2011-07-22 16:46:35 +000046
Kate Stoneb9c1b512016-09-06 20:57:50 +000047const SBAddress &SBAddress::operator=(const SBAddress &rhs) {
48 if (this != &rhs) {
49 if (rhs.IsValid())
50 ref() = rhs.ref();
Greg Claytoncac9c5f2011-09-24 00:52:29 +000051 else
Kate Stoneb9c1b512016-09-06 20:57:50 +000052 m_opaque_ap.reset(new Address());
53 }
54 return *this;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000055}
56
Nitesh Jaindd125942017-05-04 11:34:42 +000057bool lldb::operator==(const SBAddress &lhs, const SBAddress &rhs) {
58 if (lhs.IsValid() && rhs.IsValid())
59 return lhs.ref() == rhs.ref();
60 return false;
61}
62
Kate Stoneb9c1b512016-09-06 20:57:50 +000063bool SBAddress::IsValid() const {
Jonas Devlieghere34470772018-12-20 21:02:55 +000064 return m_opaque_ap != NULL && m_opaque_ap->IsValid();
Kate Stoneb9c1b512016-09-06 20:57:50 +000065}
66
67void SBAddress::Clear() { m_opaque_ap.reset(new Address()); }
68
69void SBAddress::SetAddress(lldb::SBSection section, lldb::addr_t offset) {
70 Address &addr = ref();
71 addr.SetSection(section.GetSP());
72 addr.SetOffset(offset);
73}
74
75void SBAddress::SetAddress(const Address *lldb_object_ptr) {
76 if (lldb_object_ptr)
77 ref() = *lldb_object_ptr;
78 else
79 m_opaque_ap.reset(new Address());
80}
81
82lldb::addr_t SBAddress::GetFileAddress() const {
83 if (m_opaque_ap->IsValid())
84 return m_opaque_ap->GetFileAddress();
85 else
86 return LLDB_INVALID_ADDRESS;
87}
88
89lldb::addr_t SBAddress::GetLoadAddress(const SBTarget &target) const {
90 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
91
92 lldb::addr_t addr = LLDB_INVALID_ADDRESS;
93 TargetSP target_sp(target.GetSP());
94 if (target_sp) {
95 if (m_opaque_ap->IsValid()) {
96 std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
97 addr = m_opaque_ap->GetLoadAddress(target_sp.get());
98 }
99 }
100
101 if (log) {
102 if (addr == LLDB_INVALID_ADDRESS)
103 log->Printf(
104 "SBAddress::GetLoadAddress (SBTarget(%p)) => LLDB_INVALID_ADDRESS",
105 static_cast<void *>(target_sp.get()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000106 else
Kate Stoneb9c1b512016-09-06 20:57:50 +0000107 log->Printf("SBAddress::GetLoadAddress (SBTarget(%p)) => 0x%" PRIx64,
108 static_cast<void *>(target_sp.get()), addr);
109 }
110
111 return addr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000112}
113
Kate Stoneb9c1b512016-09-06 20:57:50 +0000114void SBAddress::SetLoadAddress(lldb::addr_t load_addr, lldb::SBTarget &target) {
115 // Create the address object if we don't already have one
116 ref();
117 if (target.IsValid())
118 *this = target.ResolveLoadAddress(load_addr);
119 else
120 m_opaque_ap->Clear();
Caroline Ticeceb6b132010-10-26 03:11:13 +0000121
Adrian Prantl05097242018-04-30 16:49:04 +0000122 // Check if we weren't were able to resolve a section offset address. If we
123 // weren't it is ok, the load address might be a location on the stack or
124 // heap, so we should just have an address with no section and a valid offset
Kate Stoneb9c1b512016-09-06 20:57:50 +0000125 if (!m_opaque_ap->IsValid())
126 m_opaque_ap->SetOffset(load_addr);
127}
128
129bool SBAddress::OffsetAddress(addr_t offset) {
130 if (m_opaque_ap->IsValid()) {
131 addr_t addr_offset = m_opaque_ap->GetOffset();
132 if (addr_offset != LLDB_INVALID_ADDRESS) {
133 m_opaque_ap->SetOffset(addr_offset + offset);
134 return true;
Caroline Ticeceb6b132010-10-26 03:11:13 +0000135 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000136 }
137 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000138}
139
Kate Stoneb9c1b512016-09-06 20:57:50 +0000140lldb::SBSection SBAddress::GetSection() {
141 lldb::SBSection sb_section;
142 if (m_opaque_ap->IsValid())
143 sb_section.SetSP(m_opaque_ap->GetSection());
144 return sb_section;
Greg Clayton00e6fbf2011-07-22 16:46:35 +0000145}
146
Kate Stoneb9c1b512016-09-06 20:57:50 +0000147lldb::addr_t SBAddress::GetOffset() {
148 if (m_opaque_ap->IsValid())
149 return m_opaque_ap->GetOffset();
150 return 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000151}
152
Kate Stoneb9c1b512016-09-06 20:57:50 +0000153Address *SBAddress::operator->() { return m_opaque_ap.get(); }
154
155const Address *SBAddress::operator->() const { return m_opaque_ap.get(); }
156
157Address &SBAddress::ref() {
Jonas Devlieghere34470772018-12-20 21:02:55 +0000158 if (m_opaque_ap == NULL)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000159 m_opaque_ap.reset(new Address());
160 return *m_opaque_ap;
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000161}
162
Kate Stoneb9c1b512016-09-06 20:57:50 +0000163const Address &SBAddress::ref() const {
Adrian Prantl05097242018-04-30 16:49:04 +0000164 // This object should already have checked with "IsValid()" prior to calling
165 // this function. In case you didn't we will assert and die to let you know.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000166 assert(m_opaque_ap.get());
167 return *m_opaque_ap;
Greg Clayton13d19502012-01-29 06:07:39 +0000168}
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000169
Kate Stoneb9c1b512016-09-06 20:57:50 +0000170Address *SBAddress::get() { return m_opaque_ap.get(); }
171
172bool SBAddress::GetDescription(SBStream &description) {
173 // Call "ref()" on the stream to make sure it creates a backing stream in
174 // case there isn't one already...
175 Stream &strm = description.ref();
176 if (m_opaque_ap->IsValid()) {
177 m_opaque_ap->Dump(&strm, NULL, Address::DumpStyleResolvedDescription,
178 Address::DumpStyleModuleWithFileAddress, 4);
179 StreamString sstrm;
180 // m_opaque_ap->Dump (&sstrm, NULL,
181 // Address::DumpStyleResolvedDescription, Address::DumpStyleInvalid,
182 // 4);
183 // if (sstrm.GetData())
184 // strm.Printf (" (%s)", sstrm.GetData());
185 } else
186 strm.PutCString("No value");
187
188 return true;
Greg Clayton09960032010-09-10 18:31:35 +0000189}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000190
Kate Stoneb9c1b512016-09-06 20:57:50 +0000191SBModule SBAddress::GetModule() {
192 SBModule sb_module;
193 if (m_opaque_ap->IsValid())
194 sb_module.SetSP(m_opaque_ap->GetModule());
195 return sb_module;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000196}
197
Kate Stoneb9c1b512016-09-06 20:57:50 +0000198SBSymbolContext SBAddress::GetSymbolContext(uint32_t resolve_scope) {
199 SBSymbolContext sb_sc;
Zachary Turner991e4452018-10-25 20:45:19 +0000200 SymbolContextItem scope = static_cast<SymbolContextItem>(resolve_scope);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000201 if (m_opaque_ap->IsValid())
Zachary Turner991e4452018-10-25 20:45:19 +0000202 m_opaque_ap->CalculateSymbolContext(&sb_sc.ref(), scope);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000203 return sb_sc;
Greg Clayton09960032010-09-10 18:31:35 +0000204}
205
Kate Stoneb9c1b512016-09-06 20:57:50 +0000206SBCompileUnit SBAddress::GetCompileUnit() {
207 SBCompileUnit sb_comp_unit;
208 if (m_opaque_ap->IsValid())
209 sb_comp_unit.reset(m_opaque_ap->CalculateSymbolContextCompileUnit());
210 return sb_comp_unit;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000211}
212
Kate Stoneb9c1b512016-09-06 20:57:50 +0000213SBFunction SBAddress::GetFunction() {
214 SBFunction sb_function;
215 if (m_opaque_ap->IsValid())
216 sb_function.reset(m_opaque_ap->CalculateSymbolContextFunction());
217 return sb_function;
Caroline Tice750cd172010-10-26 23:49:36 +0000218}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000219
Kate Stoneb9c1b512016-09-06 20:57:50 +0000220SBBlock SBAddress::GetBlock() {
221 SBBlock sb_block;
222 if (m_opaque_ap->IsValid())
223 sb_block.SetPtr(m_opaque_ap->CalculateSymbolContextBlock());
224 return sb_block;
Caroline Ticedde9cff2010-09-20 05:20:02 +0000225}
Greg Clayton05d2b7f2011-03-31 01:08:07 +0000226
Kate Stoneb9c1b512016-09-06 20:57:50 +0000227SBSymbol SBAddress::GetSymbol() {
228 SBSymbol sb_symbol;
229 if (m_opaque_ap->IsValid())
230 sb_symbol.reset(m_opaque_ap->CalculateSymbolContextSymbol());
231 return sb_symbol;
Greg Clayton05d2b7f2011-03-31 01:08:07 +0000232}
233
Kate Stoneb9c1b512016-09-06 20:57:50 +0000234SBLineEntry SBAddress::GetLineEntry() {
235 SBLineEntry sb_line_entry;
236 if (m_opaque_ap->IsValid()) {
237 LineEntry line_entry;
238 if (m_opaque_ap->CalculateSymbolContextLineEntry(line_entry))
239 sb_line_entry.SetLineEntry(line_entry);
240 }
241 return sb_line_entry;
Greg Clayton7e9b1fd2011-08-12 21:40:01 +0000242}