1 //===-- 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"
11 #include "lldb/API/SBStream.h"
12 #include "lldb/Core/Module.h"
13 #include "lldb/Symbol/Function.h"
14 #include "lldb/Symbol/Symbol.h"
15 #include "lldb/Symbol/SymbolContext.h"
16 #include "lldb/Utility/Log.h"
17
18 using namespace lldb;
19 using namespace lldb_private;
20
SBSymbolContext()21 SBSymbolContext::SBSymbolContext() : m_opaque_ap() {}
22
SBSymbolContext(const SymbolContext * sc_ptr)23 SBSymbolContext::SBSymbolContext(const SymbolContext *sc_ptr) : m_opaque_ap() {
24 if (sc_ptr)
25 m_opaque_ap.reset(new SymbolContext(*sc_ptr));
26 }
27
SBSymbolContext(const SBSymbolContext & rhs)28 SBSymbolContext::SBSymbolContext(const SBSymbolContext &rhs) : m_opaque_ap() {
29 if (rhs.IsValid()) {
30 if (m_opaque_ap)
31 *m_opaque_ap = *rhs.m_opaque_ap;
32 else
33 ref() = *rhs.m_opaque_ap;
34 }
35 }
36
~SBSymbolContext()37 SBSymbolContext::~SBSymbolContext() {}
38
operator =(const SBSymbolContext & rhs)39 const SBSymbolContext &SBSymbolContext::operator=(const SBSymbolContext &rhs) {
40 if (this != &rhs) {
41 if (rhs.IsValid())
42 m_opaque_ap.reset(new lldb_private::SymbolContext(*rhs.m_opaque_ap));
43 }
44 return *this;
45 }
46
SetSymbolContext(const SymbolContext * sc_ptr)47 void SBSymbolContext::SetSymbolContext(const SymbolContext *sc_ptr) {
48 if (sc_ptr) {
49 if (m_opaque_ap)
50 *m_opaque_ap = *sc_ptr;
51 else
52 m_opaque_ap.reset(new SymbolContext(*sc_ptr));
53 } else {
54 if (m_opaque_ap)
55 m_opaque_ap->Clear(true);
56 }
57 }
58
IsValid() const59 bool SBSymbolContext::IsValid() const { return m_opaque_ap != NULL; }
60
GetModule()61 SBModule SBSymbolContext::GetModule() {
62 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
63
64 SBModule sb_module;
65 ModuleSP module_sp;
66 if (m_opaque_ap) {
67 module_sp = m_opaque_ap->module_sp;
68 sb_module.SetSP(module_sp);
69 }
70
71 if (log) {
72 SBStream sstr;
73 sb_module.GetDescription(sstr);
74 log->Printf("SBSymbolContext(%p)::GetModule () => SBModule(%p): %s",
75 static_cast<void *>(m_opaque_ap.get()),
76 static_cast<void *>(module_sp.get()), sstr.GetData());
77 }
78
79 return sb_module;
80 }
81
GetCompileUnit()82 SBCompileUnit SBSymbolContext::GetCompileUnit() {
83 return SBCompileUnit(m_opaque_ap ? m_opaque_ap->comp_unit : NULL);
84 }
85
GetFunction()86 SBFunction SBSymbolContext::GetFunction() {
87 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
88
89 Function *function = NULL;
90
91 if (m_opaque_ap)
92 function = m_opaque_ap->function;
93
94 SBFunction sb_function(function);
95
96 if (log)
97 log->Printf("SBSymbolContext(%p)::GetFunction () => SBFunction(%p)",
98 static_cast<void *>(m_opaque_ap.get()),
99 static_cast<void *>(function));
100
101 return sb_function;
102 }
103
GetBlock()104 SBBlock SBSymbolContext::GetBlock() {
105 return SBBlock(m_opaque_ap ? m_opaque_ap->block : NULL);
106 }
107
GetLineEntry()108 SBLineEntry SBSymbolContext::GetLineEntry() {
109 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
110
111 SBLineEntry sb_line_entry;
112 if (m_opaque_ap)
113 sb_line_entry.SetLineEntry(m_opaque_ap->line_entry);
114
115 if (log) {
116 log->Printf("SBSymbolContext(%p)::GetLineEntry () => SBLineEntry(%p)",
117 static_cast<void *>(m_opaque_ap.get()),
118 static_cast<void *>(sb_line_entry.get()));
119 }
120
121 return sb_line_entry;
122 }
123
GetSymbol()124 SBSymbol SBSymbolContext::GetSymbol() {
125 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
126
127 Symbol *symbol = NULL;
128
129 if (m_opaque_ap)
130 symbol = m_opaque_ap->symbol;
131
132 SBSymbol sb_symbol(symbol);
133
134 if (log)
135 log->Printf("SBSymbolContext(%p)::GetSymbol () => SBSymbol(%p)",
136 static_cast<void *>(m_opaque_ap.get()),
137 static_cast<void *>(symbol));
138
139 return sb_symbol;
140 }
141
SetModule(lldb::SBModule module)142 void SBSymbolContext::SetModule(lldb::SBModule module) {
143 ref().module_sp = module.GetSP();
144 }
145
SetCompileUnit(lldb::SBCompileUnit compile_unit)146 void SBSymbolContext::SetCompileUnit(lldb::SBCompileUnit compile_unit) {
147 ref().comp_unit = compile_unit.get();
148 }
149
SetFunction(lldb::SBFunction function)150 void SBSymbolContext::SetFunction(lldb::SBFunction function) {
151 ref().function = function.get();
152 }
153
SetBlock(lldb::SBBlock block)154 void SBSymbolContext::SetBlock(lldb::SBBlock block) {
155 ref().block = block.GetPtr();
156 }
157
SetLineEntry(lldb::SBLineEntry line_entry)158 void SBSymbolContext::SetLineEntry(lldb::SBLineEntry line_entry) {
159 if (line_entry.IsValid())
160 ref().line_entry = line_entry.ref();
161 else
162 ref().line_entry.Clear();
163 }
164
SetSymbol(lldb::SBSymbol symbol)165 void SBSymbolContext::SetSymbol(lldb::SBSymbol symbol) {
166 ref().symbol = symbol.get();
167 }
168
operator ->() const169 lldb_private::SymbolContext *SBSymbolContext::operator->() const {
170 return m_opaque_ap.get();
171 }
172
operator *() const173 const lldb_private::SymbolContext &SBSymbolContext::operator*() const {
174 assert(m_opaque_ap.get());
175 return *m_opaque_ap;
176 }
177
operator *()178 lldb_private::SymbolContext &SBSymbolContext::operator*() {
179 if (m_opaque_ap == NULL)
180 m_opaque_ap.reset(new SymbolContext);
181 return *m_opaque_ap;
182 }
183
ref()184 lldb_private::SymbolContext &SBSymbolContext::ref() {
185 if (m_opaque_ap == NULL)
186 m_opaque_ap.reset(new SymbolContext);
187 return *m_opaque_ap;
188 }
189
get() const190 lldb_private::SymbolContext *SBSymbolContext::get() const {
191 return m_opaque_ap.get();
192 }
193
GetDescription(SBStream & description)194 bool SBSymbolContext::GetDescription(SBStream &description) {
195 Stream &strm = description.ref();
196
197 if (m_opaque_ap) {
198 m_opaque_ap->GetDescription(&strm, lldb::eDescriptionLevelFull, NULL);
199 } else
200 strm.PutCString("No value");
201
202 return true;
203 }
204
205 SBSymbolContext
GetParentOfInlinedScope(const SBAddress & curr_frame_pc,SBAddress & parent_frame_addr) const206 SBSymbolContext::GetParentOfInlinedScope(const SBAddress &curr_frame_pc,
207 SBAddress &parent_frame_addr) const {
208 SBSymbolContext sb_sc;
209 if (m_opaque_ap.get() && curr_frame_pc.IsValid()) {
210 if (m_opaque_ap->GetParentOfInlinedScope(curr_frame_pc.ref(), sb_sc.ref(),
211 parent_frame_addr.ref()))
212 return sb_sc;
213 }
214 return SBSymbolContext();
215 }
216