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(true); 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 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 91 92 SBModule sb_module; 93 ModuleSP module_sp; 94 if (m_opaque_ap.get()) 95 { 96 module_sp = m_opaque_ap->module_sp; 97 sb_module.SetSP (module_sp); 98 } 99 100 if (log) 101 { 102 SBStream sstr; 103 sb_module.GetDescription (sstr); 104 log->Printf ("SBSymbolContext(%p)::GetModule () => SBModule(%p): %s", 105 static_cast<void*>(m_opaque_ap.get()), 106 static_cast<void*>(module_sp.get()), sstr.GetData()); 107 } 108 109 return sb_module; 110 } 111 112 SBCompileUnit 113 SBSymbolContext::GetCompileUnit () 114 { 115 return SBCompileUnit (m_opaque_ap.get() ? m_opaque_ap->comp_unit : NULL); 116 } 117 118 SBFunction 119 SBSymbolContext::GetFunction () 120 { 121 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 122 123 Function *function = NULL; 124 125 if (m_opaque_ap.get()) 126 function = m_opaque_ap->function; 127 128 SBFunction sb_function (function); 129 130 if (log) 131 log->Printf ("SBSymbolContext(%p)::GetFunction () => SBFunction(%p)", 132 static_cast<void*>(m_opaque_ap.get()), 133 static_cast<void*>(function)); 134 135 return sb_function; 136 } 137 138 SBBlock 139 SBSymbolContext::GetBlock () 140 { 141 return SBBlock (m_opaque_ap.get() ? m_opaque_ap->block : NULL); 142 } 143 144 SBLineEntry 145 SBSymbolContext::GetLineEntry () 146 { 147 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 148 149 SBLineEntry sb_line_entry; 150 if (m_opaque_ap.get()) 151 sb_line_entry.SetLineEntry (m_opaque_ap->line_entry); 152 153 if (log) 154 { 155 log->Printf ("SBSymbolContext(%p)::GetLineEntry () => SBLineEntry(%p)", 156 static_cast<void*>(m_opaque_ap.get()), 157 static_cast<void*>(sb_line_entry.get())); 158 } 159 160 return sb_line_entry; 161 } 162 163 SBSymbol 164 SBSymbolContext::GetSymbol () 165 { 166 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 167 168 Symbol *symbol = NULL; 169 170 if (m_opaque_ap.get()) 171 symbol = m_opaque_ap->symbol; 172 173 SBSymbol sb_symbol (symbol); 174 175 if (log) 176 log->Printf ("SBSymbolContext(%p)::GetSymbol () => SBSymbol(%p)", 177 static_cast<void*>(m_opaque_ap.get()), 178 static_cast<void*>(symbol)); 179 180 return sb_symbol; 181 } 182 183 void 184 SBSymbolContext::SetModule (lldb::SBModule module) 185 { 186 ref().module_sp = module.GetSP(); 187 } 188 189 void 190 SBSymbolContext::SetCompileUnit (lldb::SBCompileUnit compile_unit) 191 { 192 ref().comp_unit = compile_unit.get(); 193 } 194 195 void 196 SBSymbolContext::SetFunction (lldb::SBFunction function) 197 { 198 ref().function = function.get(); 199 } 200 201 void 202 SBSymbolContext::SetBlock (lldb::SBBlock block) 203 { 204 ref().block = block.GetPtr(); 205 } 206 207 void 208 SBSymbolContext::SetLineEntry (lldb::SBLineEntry line_entry) 209 { 210 if (line_entry.IsValid()) 211 ref().line_entry = line_entry.ref(); 212 else 213 ref().line_entry.Clear(); 214 } 215 216 void 217 SBSymbolContext::SetSymbol (lldb::SBSymbol symbol) 218 { 219 ref().symbol = symbol.get(); 220 } 221 222 223 lldb_private::SymbolContext* 224 SBSymbolContext::operator->() const 225 { 226 return m_opaque_ap.get(); 227 } 228 229 230 const lldb_private::SymbolContext& 231 SBSymbolContext::operator*() const 232 { 233 assert (m_opaque_ap.get()); 234 return *m_opaque_ap.get(); 235 } 236 237 238 lldb_private::SymbolContext& 239 SBSymbolContext::operator*() 240 { 241 if (m_opaque_ap.get() == NULL) 242 m_opaque_ap.reset (new SymbolContext); 243 return *m_opaque_ap.get(); 244 } 245 246 lldb_private::SymbolContext& 247 SBSymbolContext::ref() 248 { 249 if (m_opaque_ap.get() == NULL) 250 m_opaque_ap.reset (new SymbolContext); 251 return *m_opaque_ap.get(); 252 } 253 254 lldb_private::SymbolContext * 255 SBSymbolContext::get() const 256 { 257 return m_opaque_ap.get(); 258 } 259 260 bool 261 SBSymbolContext::GetDescription (SBStream &description) 262 { 263 Stream &strm = description.ref(); 264 265 if (m_opaque_ap.get()) 266 { 267 m_opaque_ap->GetDescription (&strm, lldb::eDescriptionLevelFull, NULL); 268 } 269 else 270 strm.PutCString ("No value"); 271 272 return true; 273 } 274 275 SBSymbolContext 276 SBSymbolContext::GetParentOfInlinedScope (const SBAddress &curr_frame_pc, 277 SBAddress &parent_frame_addr) const 278 { 279 SBSymbolContext sb_sc; 280 if (m_opaque_ap.get() && curr_frame_pc.IsValid()) 281 { 282 if (m_opaque_ap->GetParentOfInlinedScope (curr_frame_pc.ref(), sb_sc.ref(), parent_frame_addr.ref())) 283 return sb_sc; 284 } 285 return SBSymbolContext(); 286 } 287 288