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