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/Log.h" 13 #include "lldb/Core/Module.h" 14 #include "lldb/Symbol/Function.h" 15 #include "lldb/Symbol/Symbol.h" 16 #include "lldb/Symbol/SymbolContext.h" 17 18 using namespace lldb; 19 using namespace lldb_private; 20 21 22 23 SBSymbolContext::SBSymbolContext () : 24 m_opaque_ap () 25 { 26 } 27 28 SBSymbolContext::SBSymbolContext (const SymbolContext *sc_ptr) : 29 m_opaque_ap () 30 { 31 if (sc_ptr) 32 m_opaque_ap.reset (new SymbolContext (*sc_ptr)); 33 } 34 35 SBSymbolContext::SBSymbolContext (const SBSymbolContext& rhs) : 36 m_opaque_ap () 37 { 38 if (rhs.IsValid()) 39 { 40 if (m_opaque_ap.get()) 41 *m_opaque_ap = *rhs.m_opaque_ap; 42 else 43 ref() = *rhs.m_opaque_ap; 44 } 45 } 46 47 SBSymbolContext::~SBSymbolContext () 48 { 49 } 50 51 const SBSymbolContext & 52 SBSymbolContext::operator = (const SBSymbolContext &rhs) 53 { 54 if (this != &rhs) 55 { 56 if (rhs.IsValid()) 57 m_opaque_ap.reset (new lldb_private::SymbolContext(*rhs.m_opaque_ap.get())); 58 } 59 return *this; 60 } 61 62 void 63 SBSymbolContext::SetSymbolContext (const SymbolContext *sc_ptr) 64 { 65 if (sc_ptr) 66 { 67 if (m_opaque_ap.get()) 68 *m_opaque_ap = *sc_ptr; 69 else 70 m_opaque_ap.reset (new SymbolContext (*sc_ptr)); 71 } 72 else 73 { 74 if (m_opaque_ap.get()) 75 m_opaque_ap->Clear(); 76 } 77 } 78 79 bool 80 SBSymbolContext::IsValid () const 81 { 82 return m_opaque_ap.get() != NULL; 83 } 84 85 86 87 SBModule 88 SBSymbolContext::GetModule () 89 { 90 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 91 92 SBModule sb_module; 93 if (m_opaque_ap.get()) 94 sb_module.SetModule(m_opaque_ap->module_sp); 95 96 if (log) 97 { 98 SBStream sstr; 99 sb_module.GetDescription (sstr); 100 log->Printf ("SBSymbolContext(%p)::GetModule () => SBModule(%p): %s", 101 m_opaque_ap.get(), sb_module.get(), sstr.GetData()); 102 } 103 104 return sb_module; 105 } 106 107 SBCompileUnit 108 SBSymbolContext::GetCompileUnit () 109 { 110 return SBCompileUnit (m_opaque_ap.get() ? m_opaque_ap->comp_unit : NULL); 111 } 112 113 SBFunction 114 SBSymbolContext::GetFunction () 115 { 116 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 117 118 Function *function = NULL; 119 120 if (m_opaque_ap.get()) 121 function = m_opaque_ap->function; 122 123 SBFunction sb_function (function); 124 125 if (log) 126 log->Printf ("SBSymbolContext(%p)::GetFunction () => SBFunction(%p)", 127 m_opaque_ap.get(), function); 128 129 return sb_function; 130 } 131 132 SBBlock 133 SBSymbolContext::GetBlock () 134 { 135 return SBBlock (m_opaque_ap.get() ? m_opaque_ap->block : NULL); 136 } 137 138 SBLineEntry 139 SBSymbolContext::GetLineEntry () 140 { 141 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 142 143 SBLineEntry sb_line_entry; 144 if (m_opaque_ap.get()) 145 sb_line_entry.SetLineEntry (m_opaque_ap->line_entry); 146 147 if (log) 148 { 149 log->Printf ("SBSymbolContext(%p)::GetLineEntry () => SBLineEntry(%p)", 150 m_opaque_ap.get(), sb_line_entry.get()); 151 } 152 153 return sb_line_entry; 154 } 155 156 SBSymbol 157 SBSymbolContext::GetSymbol () 158 { 159 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 160 161 Symbol *symbol = NULL; 162 163 if (m_opaque_ap.get()) 164 symbol = m_opaque_ap->symbol; 165 166 SBSymbol sb_symbol (symbol); 167 168 if (log) 169 { 170 log->Printf ("SBSymbolContext(%p)::GetSymbol () => SBSymbol(%p)", 171 m_opaque_ap.get(), symbol); 172 } 173 174 return sb_symbol; 175 } 176 177 void 178 SBSymbolContext::SetModule (lldb::SBModule module) 179 { 180 ref().module_sp = module.get_sp(); 181 } 182 183 void 184 SBSymbolContext::SetCompileUnit (lldb::SBCompileUnit compile_unit) 185 { 186 ref().comp_unit = compile_unit.get(); 187 } 188 189 void 190 SBSymbolContext::SetFunction (lldb::SBFunction function) 191 { 192 ref().function = function.get(); 193 } 194 195 void 196 SBSymbolContext::SetBlock (lldb::SBBlock block) 197 { 198 ref().block = block.get(); 199 } 200 201 void 202 SBSymbolContext::SetLineEntry (lldb::SBLineEntry line_entry) 203 { 204 if (line_entry.IsValid()) 205 ref().line_entry = line_entry.ref(); 206 else 207 ref().line_entry.Clear(); 208 } 209 210 void 211 SBSymbolContext::SetSymbol (lldb::SBSymbol symbol) 212 { 213 ref().symbol = symbol.get(); 214 } 215 216 217 lldb_private::SymbolContext* 218 SBSymbolContext::operator->() const 219 { 220 return m_opaque_ap.get(); 221 } 222 223 224 const lldb_private::SymbolContext& 225 SBSymbolContext::operator*() const 226 { 227 assert (m_opaque_ap.get()); 228 return *m_opaque_ap.get(); 229 } 230 231 232 lldb_private::SymbolContext& 233 SBSymbolContext::operator*() 234 { 235 if (m_opaque_ap.get() == NULL) 236 m_opaque_ap.reset (new SymbolContext); 237 return *m_opaque_ap.get(); 238 } 239 240 lldb_private::SymbolContext& 241 SBSymbolContext::ref() 242 { 243 if (m_opaque_ap.get() == NULL) 244 m_opaque_ap.reset (new SymbolContext); 245 return *m_opaque_ap.get(); 246 } 247 248 lldb_private::SymbolContext * 249 SBSymbolContext::get() const 250 { 251 return m_opaque_ap.get(); 252 } 253 254 bool 255 SBSymbolContext::GetDescription (SBStream &description) 256 { 257 if (m_opaque_ap.get()) 258 { 259 description.ref(); 260 m_opaque_ap->GetDescription (description.get(), lldb::eDescriptionLevelFull, NULL); 261 } 262 else 263 description.Printf ("No value"); 264 265 return true; 266 } 267 268 SBSymbolContext 269 SBSymbolContext::GetParentOfInlinedScope (const SBAddress &curr_frame_pc, 270 SBAddress &parent_frame_addr) const 271 { 272 SBSymbolContext sb_sc; 273 if (m_opaque_ap.get() && curr_frame_pc.IsValid()) 274 { 275 if (m_opaque_ap->GetParentOfInlinedScope (curr_frame_pc.ref(), sb_sc.ref(), parent_frame_addr.ref())) 276 return sb_sc; 277 } 278 return SBSymbolContext(); 279 } 280 281