Home | History | Annotate | Download | only in API
      1 //===-- SBBlock.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/SBBlock.h"
     11 #include "lldb/API/SBAddress.h"
     12 #include "lldb/API/SBFileSpec.h"
     13 #include "lldb/API/SBFrame.h"
     14 #include "lldb/API/SBStream.h"
     15 #include "lldb/API/SBValue.h"
     16 #include "lldb/Core/AddressRange.h"
     17 #include "lldb/Core/Log.h"
     18 #include "lldb/Core/ValueObjectVariable.h"
     19 #include "lldb/Symbol/Block.h"
     20 #include "lldb/Symbol/Function.h"
     21 #include "lldb/Symbol/SymbolContext.h"
     22 #include "lldb/Symbol/VariableList.h"
     23 #include "lldb/Target/StackFrame.h"
     24 #include "lldb/Target/Target.h"
     25 
     26 using namespace lldb;
     27 using namespace lldb_private;
     28 
     29 
     30 SBBlock::SBBlock () :
     31     m_opaque_ptr (NULL)
     32 {
     33 }
     34 
     35 SBBlock::SBBlock (lldb_private::Block *lldb_object_ptr) :
     36     m_opaque_ptr (lldb_object_ptr)
     37 {
     38 }
     39 
     40 SBBlock::SBBlock(const SBBlock &rhs) :
     41     m_opaque_ptr (rhs.m_opaque_ptr)
     42 {
     43 }
     44 
     45 const SBBlock &
     46 SBBlock::operator = (const SBBlock &rhs)
     47 {
     48     m_opaque_ptr = rhs.m_opaque_ptr;
     49     return *this;
     50 }
     51 
     52 SBBlock::~SBBlock ()
     53 {
     54     m_opaque_ptr = NULL;
     55 }
     56 
     57 bool
     58 SBBlock::IsValid () const
     59 {
     60     return m_opaque_ptr != NULL;
     61 }
     62 
     63 bool
     64 SBBlock::IsInlined () const
     65 {
     66     if (m_opaque_ptr)
     67         return m_opaque_ptr->GetInlinedFunctionInfo () != NULL;
     68     return false;
     69 }
     70 
     71 const char *
     72 SBBlock::GetInlinedName () const
     73 {
     74     if (m_opaque_ptr)
     75     {
     76         const InlineFunctionInfo* inlined_info = m_opaque_ptr->GetInlinedFunctionInfo ();
     77         if (inlined_info)
     78             return inlined_info->GetName().AsCString (NULL);
     79     }
     80     return NULL;
     81 }
     82 
     83 SBFileSpec
     84 SBBlock::GetInlinedCallSiteFile () const
     85 {
     86     SBFileSpec sb_file;
     87     if (m_opaque_ptr)
     88     {
     89         const InlineFunctionInfo* inlined_info = m_opaque_ptr->GetInlinedFunctionInfo ();
     90         if (inlined_info)
     91             sb_file.SetFileSpec (inlined_info->GetCallSite().GetFile());
     92     }
     93     return sb_file;
     94 }
     95 
     96 uint32_t
     97 SBBlock::GetInlinedCallSiteLine () const
     98 {
     99     if (m_opaque_ptr)
    100     {
    101         const InlineFunctionInfo* inlined_info = m_opaque_ptr->GetInlinedFunctionInfo ();
    102         if (inlined_info)
    103             return inlined_info->GetCallSite().GetLine();
    104     }
    105     return 0;
    106 }
    107 
    108 uint32_t
    109 SBBlock::GetInlinedCallSiteColumn () const
    110 {
    111     if (m_opaque_ptr)
    112     {
    113         const InlineFunctionInfo* inlined_info = m_opaque_ptr->GetInlinedFunctionInfo ();
    114         if (inlined_info)
    115             return inlined_info->GetCallSite().GetColumn();
    116     }
    117     return 0;
    118 }
    119 
    120 void
    121 SBBlock::AppendVariables (bool can_create, bool get_parent_variables, lldb_private::VariableList *var_list)
    122 {
    123     if (IsValid())
    124     {
    125         bool show_inline = true;
    126         m_opaque_ptr->AppendVariables (can_create, get_parent_variables, show_inline, var_list);
    127     }
    128 }
    129 
    130 SBBlock
    131 SBBlock::GetParent ()
    132 {
    133     SBBlock sb_block;
    134     if (m_opaque_ptr)
    135         sb_block.m_opaque_ptr = m_opaque_ptr->GetParent();
    136     return sb_block;
    137 }
    138 
    139 lldb::SBBlock
    140 SBBlock::GetContainingInlinedBlock  ()
    141 {
    142     SBBlock sb_block;
    143     if (m_opaque_ptr)
    144         sb_block.m_opaque_ptr = m_opaque_ptr->GetContainingInlinedBlock ();
    145     return sb_block;
    146 }
    147 
    148 SBBlock
    149 SBBlock::GetSibling ()
    150 {
    151     SBBlock sb_block;
    152     if (m_opaque_ptr)
    153         sb_block.m_opaque_ptr = m_opaque_ptr->GetSibling();
    154     return sb_block;
    155 }
    156 
    157 SBBlock
    158 SBBlock::GetFirstChild ()
    159 {
    160     SBBlock sb_block;
    161     if (m_opaque_ptr)
    162         sb_block.m_opaque_ptr = m_opaque_ptr->GetFirstChild();
    163     return sb_block;
    164 }
    165 
    166 lldb_private::Block *
    167 SBBlock::GetPtr ()
    168 {
    169     return m_opaque_ptr;
    170 }
    171 
    172 void
    173 SBBlock::SetPtr (lldb_private::Block *block)
    174 {
    175     m_opaque_ptr = block;
    176 }
    177 
    178 bool
    179 SBBlock::GetDescription (SBStream &description)
    180 {
    181     Stream &strm = description.ref();
    182 
    183     if (m_opaque_ptr)
    184     {
    185         lldb::user_id_t id = m_opaque_ptr->GetID();
    186         strm.Printf ("Block: {id: %" PRIu64 "} ", id);
    187         if (IsInlined())
    188         {
    189             strm.Printf (" (inlined, '%s') ", GetInlinedName());
    190         }
    191         lldb_private::SymbolContext sc;
    192         m_opaque_ptr->CalculateSymbolContext (&sc);
    193         if (sc.function)
    194         {
    195             m_opaque_ptr->DumpAddressRanges (&strm,
    196                                              sc.function->GetAddressRange().GetBaseAddress().GetFileAddress());
    197         }
    198     }
    199     else
    200         strm.PutCString ("No value");
    201 
    202     return true;
    203 }
    204 
    205 uint32_t
    206 SBBlock::GetNumRanges ()
    207 {
    208     if (m_opaque_ptr)
    209         return m_opaque_ptr->GetNumRanges();
    210     return 0;
    211 }
    212 
    213 lldb::SBAddress
    214 SBBlock::GetRangeStartAddress (uint32_t idx)
    215 {
    216     lldb::SBAddress sb_addr;
    217     if (m_opaque_ptr)
    218     {
    219         AddressRange range;
    220         if (m_opaque_ptr->GetRangeAtIndex(idx, range))
    221         {
    222             sb_addr.ref() = range.GetBaseAddress();
    223         }
    224     }
    225     return sb_addr;
    226 }
    227 
    228 lldb::SBAddress
    229 SBBlock::GetRangeEndAddress (uint32_t idx)
    230 {
    231     lldb::SBAddress sb_addr;
    232     if (m_opaque_ptr)
    233     {
    234         AddressRange range;
    235         if (m_opaque_ptr->GetRangeAtIndex(idx, range))
    236         {
    237             sb_addr.ref() = range.GetBaseAddress();
    238             sb_addr.ref().Slide(range.GetByteSize());
    239         }
    240     }
    241     return sb_addr;
    242 }
    243 
    244 uint32_t
    245 SBBlock::GetRangeIndexForBlockAddress (lldb::SBAddress block_addr)
    246 {
    247     if (m_opaque_ptr && block_addr.IsValid())
    248     {
    249         return m_opaque_ptr->GetRangeIndexContainingAddress (block_addr.ref());
    250     }
    251 
    252     return UINT32_MAX;
    253 }
    254 
    255 
    256 lldb::SBValueList
    257 SBBlock::GetVariables (lldb::SBFrame& frame,
    258                        bool arguments,
    259                        bool locals,
    260                        bool statics,
    261                        lldb::DynamicValueType use_dynamic)
    262 {
    263     Block *block = GetPtr();
    264     SBValueList value_list;
    265     if (block)
    266     {
    267         StackFrameSP frame_sp(frame.GetFrameSP());
    268         VariableListSP variable_list_sp (block->GetBlockVariableList (true));
    269 
    270         if (variable_list_sp)
    271         {
    272             const size_t num_variables = variable_list_sp->GetSize();
    273             if (num_variables)
    274             {
    275                 for (size_t i = 0; i < num_variables; ++i)
    276                 {
    277                     VariableSP variable_sp (variable_list_sp->GetVariableAtIndex(i));
    278                     if (variable_sp)
    279                     {
    280                         bool add_variable = false;
    281                         switch (variable_sp->GetScope())
    282                         {
    283                             case eValueTypeVariableGlobal:
    284                             case eValueTypeVariableStatic:
    285                                 add_variable = statics;
    286                                 break;
    287 
    288                             case eValueTypeVariableArgument:
    289                                 add_variable = arguments;
    290                                 break;
    291 
    292                             case eValueTypeVariableLocal:
    293                                 add_variable = locals;
    294                                 break;
    295 
    296                             default:
    297                                 break;
    298                         }
    299                         if (add_variable)
    300                         {
    301                             if (frame_sp)
    302                             {
    303                                 lldb::ValueObjectSP valobj_sp(frame_sp->GetValueObjectForFrameVariable (variable_sp,eNoDynamicValues));
    304                                 SBValue value_sb;
    305                                 value_sb.SetSP(valobj_sp, use_dynamic);
    306                                 value_list.Append (value_sb);
    307                             }
    308                         }
    309                     }
    310                 }
    311             }
    312         }
    313     }
    314     return value_list;
    315 }
    316 
    317 lldb::SBValueList
    318 SBBlock::GetVariables (lldb::SBTarget& target,
    319                        bool arguments,
    320                        bool locals,
    321                        bool statics)
    322 {
    323     Block *block = GetPtr();
    324 
    325     SBValueList value_list;
    326     if (block)
    327     {
    328         TargetSP target_sp(target.GetSP());
    329 
    330         VariableListSP variable_list_sp (block->GetBlockVariableList (true));
    331 
    332         if (variable_list_sp)
    333         {
    334             const size_t num_variables = variable_list_sp->GetSize();
    335             if (num_variables)
    336             {
    337                 for (size_t i = 0; i < num_variables; ++i)
    338                 {
    339                     VariableSP variable_sp (variable_list_sp->GetVariableAtIndex(i));
    340                     if (variable_sp)
    341                     {
    342                         bool add_variable = false;
    343                         switch (variable_sp->GetScope())
    344                         {
    345                             case eValueTypeVariableGlobal:
    346                             case eValueTypeVariableStatic:
    347                                 add_variable = statics;
    348                                 break;
    349 
    350                             case eValueTypeVariableArgument:
    351                                 add_variable = arguments;
    352                                 break;
    353 
    354                             case eValueTypeVariableLocal:
    355                                 add_variable = locals;
    356                                 break;
    357 
    358                             default:
    359                                 break;
    360                         }
    361                         if (add_variable)
    362                         {
    363                             if (target_sp)
    364                                 value_list.Append (ValueObjectVariable::Create (target_sp.get(), variable_sp));
    365                         }
    366                     }
    367                 }
    368             }
    369         }
    370     }
    371     return value_list;
    372 }
    373 
    374