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 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) 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(new lldb_private::SymbolContext(*rhs.m_opaque_ap)); 43 } 44 return *this; 45 } 46 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 59 bool SBSymbolContext::IsValid() const { return m_opaque_ap != NULL; } 60 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 82 SBCompileUnit SBSymbolContext::GetCompileUnit() { 83 return SBCompileUnit(m_opaque_ap ? m_opaque_ap->comp_unit : NULL); 84 } 85 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 104 SBBlock SBSymbolContext::GetBlock() { 105 return SBBlock(m_opaque_ap ? m_opaque_ap->block : NULL); 106 } 107 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 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 142 void SBSymbolContext::SetModule(lldb::SBModule module) { 143 ref().module_sp = module.GetSP(); 144 } 145 146 void SBSymbolContext::SetCompileUnit(lldb::SBCompileUnit compile_unit) { 147 ref().comp_unit = compile_unit.get(); 148 } 149 150 void SBSymbolContext::SetFunction(lldb::SBFunction function) { 151 ref().function = function.get(); 152 } 153 154 void SBSymbolContext::SetBlock(lldb::SBBlock block) { 155 ref().block = block.GetPtr(); 156 } 157 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 165 void SBSymbolContext::SetSymbol(lldb::SBSymbol symbol) { 166 ref().symbol = symbol.get(); 167 } 168 169 lldb_private::SymbolContext *SBSymbolContext::operator->() const { 170 return m_opaque_ap.get(); 171 } 172 173 const lldb_private::SymbolContext &SBSymbolContext::operator*() const { 174 assert(m_opaque_ap.get()); 175 return *m_opaque_ap; 176 } 177 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 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 190 lldb_private::SymbolContext *SBSymbolContext::get() const { 191 return m_opaque_ap.get(); 192 } 193 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 206 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