blob: 45dfffd916e7bc2cb418458d049829d9f45a60f8 [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- SBSymbolContext.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/SBSymbolContext.h"
Caroline Ticedde9cff2010-09-20 05:20:02 +000011#include "lldb/API/SBStream.h"
Greg Clayton8f7180b2011-09-26 07:11:27 +000012#include "lldb/Core/Module.h"
Greg Claytoncfd1ace2010-10-31 03:01:06 +000013#include "lldb/Symbol/Function.h"
14#include "lldb/Symbol/Symbol.h"
15#include "lldb/Symbol/SymbolContext.h"
Zachary Turner6f9e6902017-03-03 20:56:28 +000016#include "lldb/Utility/Log.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000017
18using namespace lldb;
19using namespace lldb_private;
20
Kate Stoneb9c1b512016-09-06 20:57:50 +000021SBSymbolContext::SBSymbolContext() : m_opaque_ap() {}
Chris Lattner30fdc8d2010-06-08 16:52:24 +000022
Kate Stoneb9c1b512016-09-06 20:57:50 +000023SBSymbolContext::SBSymbolContext(const SymbolContext *sc_ptr) : m_opaque_ap() {
24 if (sc_ptr)
25 m_opaque_ap.reset(new SymbolContext(*sc_ptr));
Chris Lattner30fdc8d2010-06-08 16:52:24 +000026}
27
Kate Stoneb9c1b512016-09-06 20:57:50 +000028SBSymbolContext::SBSymbolContext(const SBSymbolContext &rhs) : m_opaque_ap() {
29 if (rhs.IsValid()) {
30 if (m_opaque_ap.get())
31 *m_opaque_ap = *rhs.m_opaque_ap;
32 else
33 ref() = *rhs.m_opaque_ap;
34 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +000035}
36
Kate Stoneb9c1b512016-09-06 20:57:50 +000037SBSymbolContext::~SBSymbolContext() {}
38
39const SBSymbolContext &SBSymbolContext::operator=(const SBSymbolContext &rhs) {
40 if (this != &rhs) {
Chris Lattner30fdc8d2010-06-08 16:52:24 +000041 if (rhs.IsValid())
Kate Stoneb9c1b512016-09-06 20:57:50 +000042 m_opaque_ap.reset(
43 new lldb_private::SymbolContext(*rhs.m_opaque_ap.get()));
44 }
45 return *this;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000046}
47
Kate Stoneb9c1b512016-09-06 20:57:50 +000048void SBSymbolContext::SetSymbolContext(const SymbolContext *sc_ptr) {
49 if (sc_ptr) {
50 if (m_opaque_ap.get())
51 *m_opaque_ap = *sc_ptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000052 else
Kate Stoneb9c1b512016-09-06 20:57:50 +000053 m_opaque_ap.reset(new SymbolContext(*sc_ptr));
54 } else {
Greg Clayton66111032010-06-23 01:19:29 +000055 if (m_opaque_ap.get())
Kate Stoneb9c1b512016-09-06 20:57:50 +000056 m_opaque_ap->Clear(true);
57 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +000058}
59
Kate Stoneb9c1b512016-09-06 20:57:50 +000060bool SBSymbolContext::IsValid() const { return m_opaque_ap.get() != NULL; }
61
62SBModule SBSymbolContext::GetModule() {
63 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
64
65 SBModule sb_module;
66 ModuleSP module_sp;
67 if (m_opaque_ap.get()) {
68 module_sp = m_opaque_ap->module_sp;
69 sb_module.SetSP(module_sp);
70 }
71
72 if (log) {
73 SBStream sstr;
74 sb_module.GetDescription(sstr);
75 log->Printf("SBSymbolContext(%p)::GetModule () => SBModule(%p): %s",
76 static_cast<void *>(m_opaque_ap.get()),
77 static_cast<void *>(module_sp.get()), sstr.GetData());
78 }
79
80 return sb_module;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000081}
82
Kate Stoneb9c1b512016-09-06 20:57:50 +000083SBCompileUnit SBSymbolContext::GetCompileUnit() {
84 return SBCompileUnit(m_opaque_ap.get() ? m_opaque_ap->comp_unit : NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +000085}
86
Kate Stoneb9c1b512016-09-06 20:57:50 +000087SBFunction SBSymbolContext::GetFunction() {
88 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
89
90 Function *function = NULL;
91
92 if (m_opaque_ap.get())
93 function = m_opaque_ap->function;
94
95 SBFunction sb_function(function);
96
97 if (log)
98 log->Printf("SBSymbolContext(%p)::GetFunction () => SBFunction(%p)",
99 static_cast<void *>(m_opaque_ap.get()),
100 static_cast<void *>(function));
101
102 return sb_function;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000103}
104
Kate Stoneb9c1b512016-09-06 20:57:50 +0000105SBBlock SBSymbolContext::GetBlock() {
106 return SBBlock(m_opaque_ap.get() ? m_opaque_ap->block : NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000107}
108
Kate Stoneb9c1b512016-09-06 20:57:50 +0000109SBLineEntry SBSymbolContext::GetLineEntry() {
110 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000111
Kate Stoneb9c1b512016-09-06 20:57:50 +0000112 SBLineEntry sb_line_entry;
113 if (m_opaque_ap.get())
114 sb_line_entry.SetLineEntry(m_opaque_ap->line_entry);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000115
Kate Stoneb9c1b512016-09-06 20:57:50 +0000116 if (log) {
117 log->Printf("SBSymbolContext(%p)::GetLineEntry () => SBLineEntry(%p)",
118 static_cast<void *>(m_opaque_ap.get()),
119 static_cast<void *>(sb_line_entry.get()));
120 }
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000121
Kate Stoneb9c1b512016-09-06 20:57:50 +0000122 return sb_line_entry;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000123}
124
Kate Stoneb9c1b512016-09-06 20:57:50 +0000125SBSymbol SBSymbolContext::GetSymbol() {
126 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
127
128 Symbol *symbol = NULL;
129
130 if (m_opaque_ap.get())
131 symbol = m_opaque_ap->symbol;
132
133 SBSymbol sb_symbol(symbol);
134
135 if (log)
136 log->Printf("SBSymbolContext(%p)::GetSymbol () => SBSymbol(%p)",
137 static_cast<void *>(m_opaque_ap.get()),
138 static_cast<void *>(symbol));
139
140 return sb_symbol;
Greg Clayton8f7180b2011-09-26 07:11:27 +0000141}
142
Kate Stoneb9c1b512016-09-06 20:57:50 +0000143void SBSymbolContext::SetModule(lldb::SBModule module) {
144 ref().module_sp = module.GetSP();
Greg Clayton8f7180b2011-09-26 07:11:27 +0000145}
146
Kate Stoneb9c1b512016-09-06 20:57:50 +0000147void SBSymbolContext::SetCompileUnit(lldb::SBCompileUnit compile_unit) {
148 ref().comp_unit = compile_unit.get();
Greg Clayton8f7180b2011-09-26 07:11:27 +0000149}
150
Kate Stoneb9c1b512016-09-06 20:57:50 +0000151void SBSymbolContext::SetFunction(lldb::SBFunction function) {
152 ref().function = function.get();
Greg Clayton8f7180b2011-09-26 07:11:27 +0000153}
154
Kate Stoneb9c1b512016-09-06 20:57:50 +0000155void SBSymbolContext::SetBlock(lldb::SBBlock block) {
156 ref().block = block.GetPtr();
Greg Clayton8f7180b2011-09-26 07:11:27 +0000157}
158
Kate Stoneb9c1b512016-09-06 20:57:50 +0000159void SBSymbolContext::SetLineEntry(lldb::SBLineEntry line_entry) {
160 if (line_entry.IsValid())
161 ref().line_entry = line_entry.ref();
162 else
163 ref().line_entry.Clear();
Greg Clayton8f7180b2011-09-26 07:11:27 +0000164}
165
Kate Stoneb9c1b512016-09-06 20:57:50 +0000166void SBSymbolContext::SetSymbol(lldb::SBSymbol symbol) {
167 ref().symbol = symbol.get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000168}
169
Kate Stoneb9c1b512016-09-06 20:57:50 +0000170lldb_private::SymbolContext *SBSymbolContext::operator->() const {
171 return m_opaque_ap.get();
Greg Clayton09960032010-09-10 18:31:35 +0000172}
173
Kate Stoneb9c1b512016-09-06 20:57:50 +0000174const lldb_private::SymbolContext &SBSymbolContext::operator*() const {
175 assert(m_opaque_ap.get());
176 return *m_opaque_ap.get();
Greg Clayton09960032010-09-10 18:31:35 +0000177}
178
Kate Stoneb9c1b512016-09-06 20:57:50 +0000179lldb_private::SymbolContext &SBSymbolContext::operator*() {
180 if (m_opaque_ap.get() == NULL)
181 m_opaque_ap.reset(new SymbolContext);
182 return *m_opaque_ap.get();
Caroline Ticedac97f32010-09-22 23:01:29 +0000183}
184
Kate Stoneb9c1b512016-09-06 20:57:50 +0000185lldb_private::SymbolContext &SBSymbolContext::ref() {
186 if (m_opaque_ap.get() == NULL)
187 m_opaque_ap.reset(new SymbolContext);
188 return *m_opaque_ap.get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000189}
190
Kate Stoneb9c1b512016-09-06 20:57:50 +0000191lldb_private::SymbolContext *SBSymbolContext::get() const {
192 return m_opaque_ap.get();
193}
Greg Claytonda7bc7d2011-11-13 06:57:31 +0000194
Kate Stoneb9c1b512016-09-06 20:57:50 +0000195bool SBSymbolContext::GetDescription(SBStream &description) {
196 Stream &strm = description.ref();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000197
Kate Stoneb9c1b512016-09-06 20:57:50 +0000198 if (m_opaque_ap.get()) {
199 m_opaque_ap->GetDescription(&strm, lldb::eDescriptionLevelFull, NULL);
200 } else
201 strm.PutCString("No value");
202
203 return true;
Caroline Ticedde9cff2010-09-20 05:20:02 +0000204}
Greg Clayton8f7180b2011-09-26 07:11:27 +0000205
206SBSymbolContext
Kate Stoneb9c1b512016-09-06 20:57:50 +0000207SBSymbolContext::GetParentOfInlinedScope(const SBAddress &curr_frame_pc,
208 SBAddress &parent_frame_addr) const {
209 SBSymbolContext sb_sc;
210 if (m_opaque_ap.get() && curr_frame_pc.IsValid()) {
211 if (m_opaque_ap->GetParentOfInlinedScope(curr_frame_pc.ref(), sb_sc.ref(),
212 parent_frame_addr.ref()))
213 return sb_sc;
214 }
215 return SBSymbolContext();
Greg Clayton8f7180b2011-09-26 07:11:27 +0000216}