1254721Semaste//===-- SBSymbolContext.cpp -------------------------------------*- C++ -*-===// 2254721Semaste// 3254721Semaste// The LLVM Compiler Infrastructure 4254721Semaste// 5254721Semaste// This file is distributed under the University of Illinois Open Source 6254721Semaste// License. See LICENSE.TXT for details. 7254721Semaste// 8254721Semaste//===----------------------------------------------------------------------===// 9254721Semaste 10254721Semaste#include "lldb/API/SBSymbolContext.h" 11254721Semaste#include "lldb/API/SBStream.h" 12254721Semaste#include "lldb/Core/Log.h" 13254721Semaste#include "lldb/Core/Module.h" 14254721Semaste#include "lldb/Symbol/Function.h" 15254721Semaste#include "lldb/Symbol/Symbol.h" 16254721Semaste#include "lldb/Symbol/SymbolContext.h" 17254721Semaste 18254721Semasteusing namespace lldb; 19254721Semasteusing namespace lldb_private; 20254721Semaste 21254721Semaste 22254721Semaste 23254721SemasteSBSymbolContext::SBSymbolContext () : 24254721Semaste m_opaque_ap () 25254721Semaste{ 26254721Semaste} 27254721Semaste 28254721SemasteSBSymbolContext::SBSymbolContext (const SymbolContext *sc_ptr) : 29254721Semaste m_opaque_ap () 30254721Semaste{ 31254721Semaste if (sc_ptr) 32254721Semaste m_opaque_ap.reset (new SymbolContext (*sc_ptr)); 33254721Semaste} 34254721Semaste 35254721SemasteSBSymbolContext::SBSymbolContext (const SBSymbolContext& rhs) : 36254721Semaste m_opaque_ap () 37254721Semaste{ 38254721Semaste if (rhs.IsValid()) 39254721Semaste { 40254721Semaste if (m_opaque_ap.get()) 41254721Semaste *m_opaque_ap = *rhs.m_opaque_ap; 42254721Semaste else 43254721Semaste ref() = *rhs.m_opaque_ap; 44254721Semaste } 45254721Semaste} 46254721Semaste 47254721SemasteSBSymbolContext::~SBSymbolContext () 48254721Semaste{ 49254721Semaste} 50254721Semaste 51254721Semasteconst SBSymbolContext & 52254721SemasteSBSymbolContext::operator = (const SBSymbolContext &rhs) 53254721Semaste{ 54254721Semaste if (this != &rhs) 55254721Semaste { 56254721Semaste if (rhs.IsValid()) 57254721Semaste m_opaque_ap.reset (new lldb_private::SymbolContext(*rhs.m_opaque_ap.get())); 58254721Semaste } 59254721Semaste return *this; 60254721Semaste} 61254721Semaste 62254721Semastevoid 63254721SemasteSBSymbolContext::SetSymbolContext (const SymbolContext *sc_ptr) 64254721Semaste{ 65254721Semaste if (sc_ptr) 66254721Semaste { 67254721Semaste if (m_opaque_ap.get()) 68254721Semaste *m_opaque_ap = *sc_ptr; 69254721Semaste else 70254721Semaste m_opaque_ap.reset (new SymbolContext (*sc_ptr)); 71254721Semaste } 72254721Semaste else 73254721Semaste { 74254721Semaste if (m_opaque_ap.get()) 75254721Semaste m_opaque_ap->Clear(true); 76254721Semaste } 77254721Semaste} 78254721Semaste 79254721Semastebool 80254721SemasteSBSymbolContext::IsValid () const 81254721Semaste{ 82254721Semaste return m_opaque_ap.get() != NULL; 83254721Semaste} 84254721Semaste 85254721Semaste 86254721Semaste 87254721SemasteSBModule 88254721SemasteSBSymbolContext::GetModule () 89254721Semaste{ 90254721Semaste Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 91254721Semaste 92254721Semaste SBModule sb_module; 93254721Semaste ModuleSP module_sp; 94254721Semaste if (m_opaque_ap.get()) 95254721Semaste { 96254721Semaste module_sp = m_opaque_ap->module_sp; 97254721Semaste sb_module.SetSP (module_sp); 98254721Semaste } 99254721Semaste 100254721Semaste if (log) 101254721Semaste { 102254721Semaste SBStream sstr; 103254721Semaste sb_module.GetDescription (sstr); 104254721Semaste log->Printf ("SBSymbolContext(%p)::GetModule () => SBModule(%p): %s", 105254721Semaste m_opaque_ap.get(), module_sp.get(), sstr.GetData()); 106254721Semaste } 107254721Semaste 108254721Semaste return sb_module; 109254721Semaste} 110254721Semaste 111254721SemasteSBCompileUnit 112254721SemasteSBSymbolContext::GetCompileUnit () 113254721Semaste{ 114254721Semaste return SBCompileUnit (m_opaque_ap.get() ? m_opaque_ap->comp_unit : NULL); 115254721Semaste} 116254721Semaste 117254721SemasteSBFunction 118254721SemasteSBSymbolContext::GetFunction () 119254721Semaste{ 120254721Semaste Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 121254721Semaste 122254721Semaste Function *function = NULL; 123254721Semaste 124254721Semaste if (m_opaque_ap.get()) 125254721Semaste function = m_opaque_ap->function; 126254721Semaste 127254721Semaste SBFunction sb_function (function); 128254721Semaste 129254721Semaste if (log) 130254721Semaste log->Printf ("SBSymbolContext(%p)::GetFunction () => SBFunction(%p)", 131254721Semaste m_opaque_ap.get(), function); 132254721Semaste 133254721Semaste return sb_function; 134254721Semaste} 135254721Semaste 136254721SemasteSBBlock 137254721SemasteSBSymbolContext::GetBlock () 138254721Semaste{ 139254721Semaste return SBBlock (m_opaque_ap.get() ? m_opaque_ap->block : NULL); 140254721Semaste} 141254721Semaste 142254721SemasteSBLineEntry 143254721SemasteSBSymbolContext::GetLineEntry () 144254721Semaste{ 145254721Semaste Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 146254721Semaste 147254721Semaste SBLineEntry sb_line_entry; 148254721Semaste if (m_opaque_ap.get()) 149254721Semaste sb_line_entry.SetLineEntry (m_opaque_ap->line_entry); 150254721Semaste 151254721Semaste if (log) 152254721Semaste { 153254721Semaste log->Printf ("SBSymbolContext(%p)::GetLineEntry () => SBLineEntry(%p)", 154254721Semaste m_opaque_ap.get(), sb_line_entry.get()); 155254721Semaste } 156254721Semaste 157254721Semaste return sb_line_entry; 158254721Semaste} 159254721Semaste 160254721SemasteSBSymbol 161254721SemasteSBSymbolContext::GetSymbol () 162254721Semaste{ 163254721Semaste Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 164254721Semaste 165254721Semaste Symbol *symbol = NULL; 166254721Semaste 167254721Semaste if (m_opaque_ap.get()) 168254721Semaste symbol = m_opaque_ap->symbol; 169254721Semaste 170254721Semaste SBSymbol sb_symbol (symbol); 171254721Semaste 172254721Semaste if (log) 173254721Semaste { 174254721Semaste log->Printf ("SBSymbolContext(%p)::GetSymbol () => SBSymbol(%p)", 175254721Semaste m_opaque_ap.get(), symbol); 176254721Semaste } 177254721Semaste 178254721Semaste return sb_symbol; 179254721Semaste} 180254721Semaste 181254721Semastevoid 182254721SemasteSBSymbolContext::SetModule (lldb::SBModule module) 183254721Semaste{ 184254721Semaste ref().module_sp = module.GetSP(); 185254721Semaste} 186254721Semaste 187254721Semastevoid 188254721SemasteSBSymbolContext::SetCompileUnit (lldb::SBCompileUnit compile_unit) 189254721Semaste{ 190254721Semaste ref().comp_unit = compile_unit.get(); 191254721Semaste} 192254721Semaste 193254721Semastevoid 194254721SemasteSBSymbolContext::SetFunction (lldb::SBFunction function) 195254721Semaste{ 196254721Semaste ref().function = function.get(); 197254721Semaste} 198254721Semaste 199254721Semastevoid 200254721SemasteSBSymbolContext::SetBlock (lldb::SBBlock block) 201254721Semaste{ 202254721Semaste ref().block = block.GetPtr(); 203254721Semaste} 204254721Semaste 205254721Semastevoid 206254721SemasteSBSymbolContext::SetLineEntry (lldb::SBLineEntry line_entry) 207254721Semaste{ 208254721Semaste if (line_entry.IsValid()) 209254721Semaste ref().line_entry = line_entry.ref(); 210254721Semaste else 211254721Semaste ref().line_entry.Clear(); 212254721Semaste} 213254721Semaste 214254721Semastevoid 215254721SemasteSBSymbolContext::SetSymbol (lldb::SBSymbol symbol) 216254721Semaste{ 217254721Semaste ref().symbol = symbol.get(); 218254721Semaste} 219254721Semaste 220254721Semaste 221254721Semastelldb_private::SymbolContext* 222254721SemasteSBSymbolContext::operator->() const 223254721Semaste{ 224254721Semaste return m_opaque_ap.get(); 225254721Semaste} 226254721Semaste 227254721Semaste 228254721Semasteconst lldb_private::SymbolContext& 229254721SemasteSBSymbolContext::operator*() const 230254721Semaste{ 231254721Semaste assert (m_opaque_ap.get()); 232254721Semaste return *m_opaque_ap.get(); 233254721Semaste} 234254721Semaste 235254721Semaste 236254721Semastelldb_private::SymbolContext& 237254721SemasteSBSymbolContext::operator*() 238254721Semaste{ 239254721Semaste if (m_opaque_ap.get() == NULL) 240254721Semaste m_opaque_ap.reset (new SymbolContext); 241254721Semaste return *m_opaque_ap.get(); 242254721Semaste} 243254721Semaste 244254721Semastelldb_private::SymbolContext& 245254721SemasteSBSymbolContext::ref() 246254721Semaste{ 247254721Semaste if (m_opaque_ap.get() == NULL) 248254721Semaste m_opaque_ap.reset (new SymbolContext); 249254721Semaste return *m_opaque_ap.get(); 250254721Semaste} 251254721Semaste 252254721Semastelldb_private::SymbolContext * 253254721SemasteSBSymbolContext::get() const 254254721Semaste{ 255254721Semaste return m_opaque_ap.get(); 256254721Semaste} 257254721Semaste 258254721Semastebool 259254721SemasteSBSymbolContext::GetDescription (SBStream &description) 260254721Semaste{ 261254721Semaste Stream &strm = description.ref(); 262254721Semaste 263254721Semaste if (m_opaque_ap.get()) 264254721Semaste { 265254721Semaste m_opaque_ap->GetDescription (&strm, lldb::eDescriptionLevelFull, NULL); 266254721Semaste } 267254721Semaste else 268254721Semaste strm.PutCString ("No value"); 269254721Semaste 270254721Semaste return true; 271254721Semaste} 272254721Semaste 273254721SemasteSBSymbolContext 274254721SemasteSBSymbolContext::GetParentOfInlinedScope (const SBAddress &curr_frame_pc, 275254721Semaste SBAddress &parent_frame_addr) const 276254721Semaste{ 277254721Semaste SBSymbolContext sb_sc; 278254721Semaste if (m_opaque_ap.get() && curr_frame_pc.IsValid()) 279254721Semaste { 280254721Semaste if (m_opaque_ap->GetParentOfInlinedScope (curr_frame_pc.ref(), sb_sc.ref(), parent_frame_addr.ref())) 281254721Semaste return sb_sc; 282254721Semaste } 283254721Semaste return SBSymbolContext(); 284254721Semaste} 285254721Semaste 286