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 SBSymbolContext::SBSymbolContext() : m_opaque_ap() {} 22 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 28 SBSymbolContext::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 } 35 } 36 37 SBSymbolContext::~SBSymbolContext() {} 38 39 const SBSymbolContext &SBSymbolContext::operator=(const SBSymbolContext &rhs) { 40 if (this != &rhs) { 41 if (rhs.IsValid()) 42 m_opaque_ap.reset( 43 new lldb_private::SymbolContext(*rhs.m_opaque_ap.get())); 44 } 45 return *this; 46 } 47 48 void SBSymbolContext::SetSymbolContext(const SymbolContext *sc_ptr) { 49 if (sc_ptr) { 50 if (m_opaque_ap.get()) 51 *m_opaque_ap = *sc_ptr; 52 else 53 m_opaque_ap.reset(new SymbolContext(*sc_ptr)); 54 } else { 55 if (m_opaque_ap.get()) 56 m_opaque_ap->Clear(true); 57 } 58 } 59 60 bool SBSymbolContext::IsValid() const { return m_opaque_ap.get() != NULL; } 61 62 SBModule 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; 81 } 82 83 SBCompileUnit SBSymbolContext::GetCompileUnit() { 84 return SBCompileUnit(m_opaque_ap.get() ? m_opaque_ap->comp_unit : NULL); 85 } 86 87 SBFunction 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; 103 } 104 105 SBBlock SBSymbolContext::GetBlock() { 106 return SBBlock(m_opaque_ap.get() ? m_opaque_ap->block : NULL); 107 } 108 109 SBLineEntry SBSymbolContext::GetLineEntry() { 110 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 111 112 SBLineEntry sb_line_entry; 113 if (m_opaque_ap.get()) 114 sb_line_entry.SetLineEntry(m_opaque_ap->line_entry); 115 116 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 } 121 122 return sb_line_entry; 123 } 124 125 SBSymbol 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; 141 } 142 143 void SBSymbolContext::SetModule(lldb::SBModule module) { 144 ref().module_sp = module.GetSP(); 145 } 146 147 void SBSymbolContext::SetCompileUnit(lldb::SBCompileUnit compile_unit) { 148 ref().comp_unit = compile_unit.get(); 149 } 150 151 void SBSymbolContext::SetFunction(lldb::SBFunction function) { 152 ref().function = function.get(); 153 } 154 155 void SBSymbolContext::SetBlock(lldb::SBBlock block) { 156 ref().block = block.GetPtr(); 157 } 158 159 void 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(); 164 } 165 166 void SBSymbolContext::SetSymbol(lldb::SBSymbol symbol) { 167 ref().symbol = symbol.get(); 168 } 169 170 lldb_private::SymbolContext *SBSymbolContext::operator->() const { 171 return m_opaque_ap.get(); 172 } 173 174 const lldb_private::SymbolContext &SBSymbolContext::operator*() const { 175 assert(m_opaque_ap.get()); 176 return *m_opaque_ap.get(); 177 } 178 179 lldb_private::SymbolContext &SBSymbolContext::operator*() { 180 if (m_opaque_ap.get() == NULL) 181 m_opaque_ap.reset(new SymbolContext); 182 return *m_opaque_ap.get(); 183 } 184 185 lldb_private::SymbolContext &SBSymbolContext::ref() { 186 if (m_opaque_ap.get() == NULL) 187 m_opaque_ap.reset(new SymbolContext); 188 return *m_opaque_ap.get(); 189 } 190 191 lldb_private::SymbolContext *SBSymbolContext::get() const { 192 return m_opaque_ap.get(); 193 } 194 195 bool SBSymbolContext::GetDescription(SBStream &description) { 196 Stream &strm = description.ref(); 197 198 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; 204 } 205 206 SBSymbolContext 207 SBSymbolContext::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(); 216 } 217