Home | History | Annotate | Download | only in API
      1 //===-- SBValue.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/lldb-python.h"
     11 
     12 #include "lldb/API/SBValue.h"
     13 
     14 #include "lldb/API/SBDeclaration.h"
     15 #include "lldb/API/SBStream.h"
     16 #include "lldb/API/SBTypeFilter.h"
     17 #include "lldb/API/SBTypeFormat.h"
     18 #include "lldb/API/SBTypeSummary.h"
     19 #include "lldb/API/SBTypeSynthetic.h"
     20 
     21 #include "lldb/Breakpoint/Watchpoint.h"
     22 #include "lldb/Core/DataExtractor.h"
     23 #include "lldb/Core/Log.h"
     24 #include "lldb/Core/Module.h"
     25 #include "lldb/Core/Scalar.h"
     26 #include "lldb/Core/Section.h"
     27 #include "lldb/Core/Stream.h"
     28 #include "lldb/Core/StreamFile.h"
     29 #include "lldb/Core/Value.h"
     30 #include "lldb/Core/ValueObject.h"
     31 #include "lldb/Core/ValueObjectConstResult.h"
     32 #include "lldb/DataFormatters/DataVisualization.h"
     33 #include "lldb/Symbol/Block.h"
     34 #include "lldb/Symbol/Declaration.h"
     35 #include "lldb/Symbol/ObjectFile.h"
     36 #include "lldb/Symbol/Type.h"
     37 #include "lldb/Symbol/Variable.h"
     38 #include "lldb/Symbol/VariableList.h"
     39 #include "lldb/Target/ExecutionContext.h"
     40 #include "lldb/Target/Process.h"
     41 #include "lldb/Target/StackFrame.h"
     42 #include "lldb/Target/Target.h"
     43 #include "lldb/Target/Thread.h"
     44 
     45 #include "lldb/API/SBDebugger.h"
     46 #include "lldb/API/SBExpressionOptions.h"
     47 #include "lldb/API/SBFrame.h"
     48 #include "lldb/API/SBProcess.h"
     49 #include "lldb/API/SBTarget.h"
     50 #include "lldb/API/SBThread.h"
     51 
     52 using namespace lldb;
     53 using namespace lldb_private;
     54 
     55 class ValueImpl
     56 {
     57 public:
     58     ValueImpl ()
     59     {
     60     }
     61 
     62     ValueImpl (lldb::ValueObjectSP in_valobj_sp,
     63                lldb::DynamicValueType use_dynamic,
     64                bool use_synthetic,
     65                const char *name = NULL) :
     66         m_valobj_sp(in_valobj_sp),
     67         m_use_dynamic(use_dynamic),
     68         m_use_synthetic(use_synthetic),
     69         m_name (name)
     70     {
     71         if (!m_name.IsEmpty() && m_valobj_sp)
     72             m_valobj_sp->SetName(m_name);
     73     }
     74 
     75     ValueImpl (const ValueImpl& rhs) :
     76         m_valobj_sp(rhs.m_valobj_sp),
     77         m_use_dynamic(rhs.m_use_dynamic),
     78         m_use_synthetic(rhs.m_use_synthetic),
     79         m_name (rhs.m_name)
     80     {
     81     }
     82 
     83     ValueImpl &
     84     operator = (const ValueImpl &rhs)
     85     {
     86         if (this != &rhs)
     87         {
     88             m_valobj_sp = rhs.m_valobj_sp;
     89             m_use_dynamic = rhs.m_use_dynamic;
     90             m_use_synthetic = rhs.m_use_synthetic;
     91             m_name = rhs.m_name;
     92         }
     93         return *this;
     94     }
     95 
     96     bool
     97     IsValid ()
     98     {
     99         return m_valobj_sp.get() != NULL;
    100     }
    101 
    102     lldb::ValueObjectSP
    103     GetRootSP ()
    104     {
    105         return m_valobj_sp;
    106     }
    107 
    108     lldb::ValueObjectSP
    109     GetSP (Process::StopLocker &stop_locker, Mutex::Locker &api_locker, Error &error)
    110     {
    111         Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    112         if (!m_valobj_sp)
    113         {
    114             error.SetErrorString("invalid value object");
    115             return m_valobj_sp;
    116         }
    117 
    118         lldb::ValueObjectSP value_sp = m_valobj_sp;
    119 
    120         Target *target = value_sp->GetTargetSP().get();
    121         if (target)
    122             api_locker.Lock(target->GetAPIMutex());
    123 
    124         ProcessSP process_sp(value_sp->GetProcessSP());
    125         if (process_sp && !stop_locker.TryLock (&process_sp->GetRunLock()))
    126         {
    127             // We don't allow people to play around with ValueObject if the process is running.
    128             // If you want to look at values, pause the process, then look.
    129             if (log)
    130                 log->Printf ("SBValue(%p)::GetSP() => error: process is running", value_sp.get());
    131             error.SetErrorString ("process must be stopped.");
    132             return ValueObjectSP();
    133         }
    134 
    135         if (value_sp->GetDynamicValue(m_use_dynamic))
    136             value_sp = value_sp->GetDynamicValue(m_use_dynamic);
    137         if (value_sp->GetSyntheticValue(m_use_synthetic))
    138             value_sp = value_sp->GetSyntheticValue(m_use_synthetic);
    139         if (!value_sp)
    140             error.SetErrorString("invalid value object");
    141         if (!m_name.IsEmpty())
    142             value_sp->SetName(m_name);
    143 
    144         return value_sp;
    145     }
    146 
    147     void
    148     SetUseDynamic (lldb::DynamicValueType use_dynamic)
    149     {
    150         m_use_dynamic = use_dynamic;
    151     }
    152 
    153     void
    154     SetUseSynthetic (bool use_synthetic)
    155     {
    156         m_use_synthetic = use_synthetic;
    157     }
    158 
    159     lldb::DynamicValueType
    160     GetUseDynamic ()
    161     {
    162         return m_use_dynamic;
    163     }
    164 
    165     bool
    166     GetUseSynthetic ()
    167     {
    168         return m_use_synthetic;
    169     }
    170 
    171     // All the derived values that we would make from the m_valobj_sp will share
    172     // the ExecutionContext with m_valobj_sp, so we don't need to do the calculations
    173     // in GetSP to return the Target, Process, Thread or Frame.  It is convenient to
    174     // provide simple accessors for these, which I do here.
    175     TargetSP
    176     GetTargetSP ()
    177     {
    178         if (m_valobj_sp)
    179             return m_valobj_sp->GetTargetSP();
    180         else
    181             return TargetSP();
    182     }
    183 
    184     ProcessSP
    185     GetProcessSP ()
    186     {
    187         if (m_valobj_sp)
    188             return m_valobj_sp->GetProcessSP();
    189         else
    190             return ProcessSP();
    191     }
    192 
    193     ThreadSP
    194     GetThreadSP ()
    195     {
    196         if (m_valobj_sp)
    197             return m_valobj_sp->GetThreadSP();
    198         else
    199             return ThreadSP();
    200     }
    201 
    202     StackFrameSP
    203     GetFrameSP ()
    204     {
    205         if (m_valobj_sp)
    206             return m_valobj_sp->GetFrameSP();
    207         else
    208             return StackFrameSP();
    209     }
    210 
    211 private:
    212     lldb::ValueObjectSP m_valobj_sp;
    213     lldb::DynamicValueType m_use_dynamic;
    214     bool m_use_synthetic;
    215     ConstString m_name;
    216 };
    217 
    218 class ValueLocker
    219 {
    220 public:
    221     ValueLocker ()
    222     {
    223     }
    224 
    225     ValueObjectSP
    226     GetLockedSP(ValueImpl &in_value)
    227     {
    228         return in_value.GetSP(m_stop_locker, m_api_locker, m_lock_error);
    229     }
    230 
    231     Error &
    232     GetError()
    233     {
    234         return m_lock_error;
    235     }
    236 
    237 private:
    238     Process::StopLocker m_stop_locker;
    239     Mutex::Locker m_api_locker;
    240     Error m_lock_error;
    241 
    242 };
    243 
    244 SBValue::SBValue () :
    245     m_opaque_sp ()
    246 {
    247 }
    248 
    249 SBValue::SBValue (const lldb::ValueObjectSP &value_sp)
    250 {
    251     SetSP(value_sp);
    252 }
    253 
    254 SBValue::SBValue(const SBValue &rhs)
    255 {
    256     SetSP(rhs.m_opaque_sp);
    257 }
    258 
    259 SBValue &
    260 SBValue::operator = (const SBValue &rhs)
    261 {
    262     if (this != &rhs)
    263     {
    264         SetSP(rhs.m_opaque_sp);
    265     }
    266     return *this;
    267 }
    268 
    269 SBValue::~SBValue()
    270 {
    271 }
    272 
    273 bool
    274 SBValue::IsValid ()
    275 {
    276     // If this function ever changes to anything that does more than just
    277     // check if the opaque shared pointer is non NULL, then we need to update
    278     // all "if (m_opaque_sp)" code in this file.
    279     return m_opaque_sp.get() != NULL && m_opaque_sp->GetRootSP().get() != NULL;
    280 }
    281 
    282 void
    283 SBValue::Clear()
    284 {
    285     m_opaque_sp.reset();
    286 }
    287 
    288 SBError
    289 SBValue::GetError()
    290 {
    291     SBError sb_error;
    292 
    293     ValueLocker locker;
    294     lldb::ValueObjectSP value_sp(GetSP(locker));
    295     if (value_sp)
    296         sb_error.SetError(value_sp->GetError());
    297     else
    298         sb_error.SetErrorStringWithFormat ("error: %s", locker.GetError().AsCString());
    299 
    300     return sb_error;
    301 }
    302 
    303 user_id_t
    304 SBValue::GetID()
    305 {
    306     ValueLocker locker;
    307     lldb::ValueObjectSP value_sp(GetSP(locker));
    308     if (value_sp)
    309         return value_sp->GetID();
    310     return LLDB_INVALID_UID;
    311 }
    312 
    313 const char *
    314 SBValue::GetName()
    315 {
    316     const char *name = NULL;
    317     ValueLocker locker;
    318     lldb::ValueObjectSP value_sp(GetSP(locker));
    319     if (value_sp)
    320         name = value_sp->GetName().GetCString();
    321 
    322     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    323     if (log)
    324     {
    325         if (name)
    326             log->Printf ("SBValue(%p)::GetName () => \"%s\"", value_sp.get(), name);
    327         else
    328             log->Printf ("SBValue(%p)::GetName () => NULL", value_sp.get());
    329     }
    330 
    331     return name;
    332 }
    333 
    334 const char *
    335 SBValue::GetTypeName ()
    336 {
    337     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    338     const char *name = NULL;
    339     ValueLocker locker;
    340     lldb::ValueObjectSP value_sp(GetSP(locker));
    341     if (value_sp)
    342     {
    343         name = value_sp->GetQualifiedTypeName().GetCString();
    344     }
    345 
    346     if (log)
    347     {
    348         if (name)
    349             log->Printf ("SBValue(%p)::GetTypeName () => \"%s\"", value_sp.get(), name);
    350         else
    351             log->Printf ("SBValue(%p)::GetTypeName () => NULL", value_sp.get());
    352     }
    353 
    354     return name;
    355 }
    356 
    357 size_t
    358 SBValue::GetByteSize ()
    359 {
    360     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    361     size_t result = 0;
    362 
    363     ValueLocker locker;
    364     lldb::ValueObjectSP value_sp(GetSP(locker));
    365     if (value_sp)
    366     {
    367         result = value_sp->GetByteSize();
    368     }
    369 
    370     if (log)
    371         log->Printf ("SBValue(%p)::GetByteSize () => %" PRIu64, value_sp.get(), (uint64_t)result);
    372 
    373     return result;
    374 }
    375 
    376 bool
    377 SBValue::IsInScope ()
    378 {
    379     bool result = false;
    380 
    381     ValueLocker locker;
    382     lldb::ValueObjectSP value_sp(GetSP(locker));
    383     if (value_sp)
    384     {
    385         result = value_sp->IsInScope ();
    386     }
    387 
    388     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    389     if (log)
    390         log->Printf ("SBValue(%p)::IsInScope () => %i", value_sp.get(), result);
    391 
    392     return result;
    393 }
    394 
    395 const char *
    396 SBValue::GetValue ()
    397 {
    398     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    399 
    400     const char *cstr = NULL;
    401     ValueLocker locker;
    402     lldb::ValueObjectSP value_sp(GetSP(locker));
    403     if (value_sp)
    404     {
    405         cstr = value_sp->GetValueAsCString ();
    406     }
    407     if (log)
    408     {
    409         if (cstr)
    410             log->Printf ("SBValue(%p)::GetValue() => \"%s\"", value_sp.get(), cstr);
    411         else
    412             log->Printf ("SBValue(%p)::GetValue() => NULL", value_sp.get());
    413     }
    414 
    415     return cstr;
    416 }
    417 
    418 ValueType
    419 SBValue::GetValueType ()
    420 {
    421     ValueType result = eValueTypeInvalid;
    422     ValueLocker locker;
    423     lldb::ValueObjectSP value_sp(GetSP(locker));
    424     if (value_sp)
    425         result = value_sp->GetValueType();
    426 
    427     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    428     if (log)
    429     {
    430         switch (result)
    431         {
    432         case eValueTypeInvalid:         log->Printf ("SBValue(%p)::GetValueType () => eValueTypeInvalid", value_sp.get()); break;
    433         case eValueTypeVariableGlobal:  log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableGlobal", value_sp.get()); break;
    434         case eValueTypeVariableStatic:  log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableStatic", value_sp.get()); break;
    435         case eValueTypeVariableArgument:log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableArgument", value_sp.get()); break;
    436         case eValueTypeVariableLocal:   log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableLocal", value_sp.get()); break;
    437         case eValueTypeRegister:        log->Printf ("SBValue(%p)::GetValueType () => eValueTypeRegister", value_sp.get()); break;
    438         case eValueTypeRegisterSet:     log->Printf ("SBValue(%p)::GetValueType () => eValueTypeRegisterSet", value_sp.get()); break;
    439         case eValueTypeConstResult:     log->Printf ("SBValue(%p)::GetValueType () => eValueTypeConstResult", value_sp.get()); break;
    440         }
    441     }
    442     return result;
    443 }
    444 
    445 const char *
    446 SBValue::GetObjectDescription ()
    447 {
    448     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    449     const char *cstr = NULL;
    450     ValueLocker locker;
    451     lldb::ValueObjectSP value_sp(GetSP(locker));
    452     if (value_sp)
    453     {
    454         cstr = value_sp->GetObjectDescription ();
    455     }
    456     if (log)
    457     {
    458         if (cstr)
    459             log->Printf ("SBValue(%p)::GetObjectDescription() => \"%s\"", value_sp.get(), cstr);
    460         else
    461             log->Printf ("SBValue(%p)::GetObjectDescription() => NULL", value_sp.get());
    462     }
    463     return cstr;
    464 }
    465 
    466 SBType
    467 SBValue::GetType()
    468 {
    469     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    470     SBType sb_type;
    471     ValueLocker locker;
    472     lldb::ValueObjectSP value_sp(GetSP(locker));
    473     TypeImplSP type_sp;
    474     if (value_sp)
    475     {
    476         type_sp.reset (new TypeImpl(value_sp->GetClangType()));
    477         sb_type.SetSP(type_sp);
    478     }
    479     if (log)
    480     {
    481         if (type_sp)
    482             log->Printf ("SBValue(%p)::GetType => SBType(%p)", value_sp.get(), type_sp.get());
    483         else
    484             log->Printf ("SBValue(%p)::GetType => NULL", value_sp.get());
    485     }
    486     return sb_type;
    487 }
    488 
    489 bool
    490 SBValue::GetValueDidChange ()
    491 {
    492     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    493     bool result = false;
    494     ValueLocker locker;
    495     lldb::ValueObjectSP value_sp(GetSP(locker));
    496     if (value_sp)
    497     {
    498         result = value_sp->GetValueDidChange ();
    499     }
    500     if (log)
    501         log->Printf ("SBValue(%p)::GetValueDidChange() => %i", value_sp.get(), result);
    502 
    503     return result;
    504 }
    505 
    506 #ifndef LLDB_DISABLE_PYTHON
    507 const char *
    508 SBValue::GetSummary ()
    509 {
    510     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    511     const char *cstr = NULL;
    512     ValueLocker locker;
    513     lldb::ValueObjectSP value_sp(GetSP(locker));
    514     if (value_sp)
    515     {
    516         cstr = value_sp->GetSummaryAsCString();
    517     }
    518     if (log)
    519     {
    520         if (cstr)
    521             log->Printf ("SBValue(%p)::GetSummary() => \"%s\"", value_sp.get(), cstr);
    522         else
    523             log->Printf ("SBValue(%p)::GetSummary() => NULL", value_sp.get());
    524     }
    525     return cstr;
    526 }
    527 #endif // LLDB_DISABLE_PYTHON
    528 
    529 const char *
    530 SBValue::GetLocation ()
    531 {
    532     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    533     const char *cstr = NULL;
    534     ValueLocker locker;
    535     lldb::ValueObjectSP value_sp(GetSP(locker));
    536     if (value_sp)
    537     {
    538         cstr = value_sp->GetLocationAsCString();
    539     }
    540     if (log)
    541     {
    542         if (cstr)
    543             log->Printf ("SBValue(%p)::GetLocation() => \"%s\"", value_sp.get(), cstr);
    544         else
    545             log->Printf ("SBValue(%p)::GetLocation() => NULL", value_sp.get());
    546     }
    547     return cstr;
    548 }
    549 
    550 // Deprecated - use the one that takes an lldb::SBError
    551 bool
    552 SBValue::SetValueFromCString (const char *value_str)
    553 {
    554     lldb::SBError dummy;
    555     return SetValueFromCString(value_str,dummy);
    556 }
    557 
    558 bool
    559 SBValue::SetValueFromCString (const char *value_str, lldb::SBError& error)
    560 {
    561     bool success = false;
    562     ValueLocker locker;
    563     lldb::ValueObjectSP value_sp(GetSP(locker));
    564     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    565     if (value_sp)
    566     {
    567         success = value_sp->SetValueFromCString (value_str,error.ref());
    568     }
    569     else
    570         error.SetErrorStringWithFormat ("Could not get value: %s", locker.GetError().AsCString());
    571 
    572     if (log)
    573         log->Printf ("SBValue(%p)::SetValueFromCString(\"%s\") => %i", value_sp.get(), value_str, success);
    574 
    575     return success;
    576 }
    577 
    578 lldb::SBTypeFormat
    579 SBValue::GetTypeFormat ()
    580 {
    581     lldb::SBTypeFormat format;
    582     ValueLocker locker;
    583     lldb::ValueObjectSP value_sp(GetSP(locker));
    584     if (value_sp)
    585     {
    586         if (value_sp->UpdateValueIfNeeded(true))
    587         {
    588             lldb::TypeFormatImplSP format_sp = value_sp->GetValueFormat();
    589             if (format_sp)
    590                 format.SetSP(format_sp);
    591         }
    592     }
    593     return format;
    594 }
    595 
    596 #ifndef LLDB_DISABLE_PYTHON
    597 lldb::SBTypeSummary
    598 SBValue::GetTypeSummary ()
    599 {
    600     lldb::SBTypeSummary summary;
    601     ValueLocker locker;
    602     lldb::ValueObjectSP value_sp(GetSP(locker));
    603     if (value_sp)
    604     {
    605         if (value_sp->UpdateValueIfNeeded(true))
    606         {
    607             lldb::TypeSummaryImplSP summary_sp = value_sp->GetSummaryFormat();
    608             if (summary_sp)
    609                 summary.SetSP(summary_sp);
    610         }
    611     }
    612     return summary;
    613 }
    614 #endif // LLDB_DISABLE_PYTHON
    615 
    616 lldb::SBTypeFilter
    617 SBValue::GetTypeFilter ()
    618 {
    619     lldb::SBTypeFilter filter;
    620     ValueLocker locker;
    621     lldb::ValueObjectSP value_sp(GetSP(locker));
    622     if (value_sp)
    623     {
    624         if (value_sp->UpdateValueIfNeeded(true))
    625         {
    626             lldb::SyntheticChildrenSP synthetic_sp = value_sp->GetSyntheticChildren();
    627 
    628             if (synthetic_sp && !synthetic_sp->IsScripted())
    629             {
    630                 TypeFilterImplSP filter_sp = std::static_pointer_cast<TypeFilterImpl>(synthetic_sp);
    631                 filter.SetSP(filter_sp);
    632             }
    633         }
    634     }
    635     return filter;
    636 }
    637 
    638 #ifndef LLDB_DISABLE_PYTHON
    639 lldb::SBTypeSynthetic
    640 SBValue::GetTypeSynthetic ()
    641 {
    642     lldb::SBTypeSynthetic synthetic;
    643     ValueLocker locker;
    644     lldb::ValueObjectSP value_sp(GetSP(locker));
    645     if (value_sp)
    646     {
    647         if (value_sp->UpdateValueIfNeeded(true))
    648         {
    649             lldb::SyntheticChildrenSP children_sp = value_sp->GetSyntheticChildren();
    650 
    651             if (children_sp && children_sp->IsScripted())
    652             {
    653                 ScriptedSyntheticChildrenSP synth_sp = std::static_pointer_cast<ScriptedSyntheticChildren>(children_sp);
    654                 synthetic.SetSP(synth_sp);
    655             }
    656         }
    657     }
    658     return synthetic;
    659 }
    660 #endif
    661 
    662 lldb::SBValue
    663 SBValue::CreateChildAtOffset (const char *name, uint32_t offset, SBType type)
    664 {
    665     lldb::SBValue sb_value;
    666     ValueLocker locker;
    667     lldb::ValueObjectSP value_sp(GetSP(locker));
    668     lldb::ValueObjectSP new_value_sp;
    669     if (value_sp)
    670     {
    671         TypeImplSP type_sp (type.GetSP());
    672         if (type.IsValid())
    673         {
    674             sb_value.SetSP(value_sp->GetSyntheticChildAtOffset(offset, type_sp->GetClangASTType(), true),GetPreferDynamicValue(),GetPreferSyntheticValue(), name);
    675         }
    676     }
    677     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    678     if (log)
    679     {
    680         if (new_value_sp)
    681             log->Printf ("SBValue(%p)::CreateChildAtOffset => \"%s\"",
    682                          value_sp.get(),
    683                          new_value_sp->GetName().AsCString());
    684         else
    685             log->Printf ("SBValue(%p)::CreateChildAtOffset => NULL",
    686                          value_sp.get());
    687     }
    688     return sb_value;
    689 }
    690 
    691 lldb::SBValue
    692 SBValue::Cast (SBType type)
    693 {
    694     lldb::SBValue sb_value;
    695     ValueLocker locker;
    696     lldb::ValueObjectSP value_sp(GetSP(locker));
    697     TypeImplSP type_sp (type.GetSP());
    698     if (value_sp && type_sp)
    699         sb_value.SetSP(value_sp->Cast(type_sp->GetClangASTType()),GetPreferDynamicValue(),GetPreferSyntheticValue());
    700     return sb_value;
    701 }
    702 
    703 lldb::SBValue
    704 SBValue::CreateValueFromExpression (const char *name, const char* expression)
    705 {
    706     SBExpressionOptions options;
    707     options.ref().SetKeepInMemory(true);
    708     return CreateValueFromExpression (name, expression, options);
    709 }
    710 
    711 lldb::SBValue
    712 SBValue::CreateValueFromExpression (const char *name, const char *expression, SBExpressionOptions &options)
    713 {
    714     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    715     lldb::SBValue sb_value;
    716     ValueLocker locker;
    717     lldb::ValueObjectSP value_sp(GetSP(locker));
    718     lldb::ValueObjectSP new_value_sp;
    719     if (value_sp)
    720     {
    721         ExecutionContext exe_ctx (value_sp->GetExecutionContextRef());
    722         Target* target = exe_ctx.GetTargetPtr();
    723         if (target)
    724         {
    725             options.ref().SetKeepInMemory(true);
    726             target->EvaluateExpression (expression,
    727                                         exe_ctx.GetFramePtr(),
    728                                         new_value_sp,
    729                                         options.ref());
    730             if (new_value_sp)
    731             {
    732                 new_value_sp->SetName(ConstString(name));
    733                 sb_value.SetSP(new_value_sp);
    734             }
    735         }
    736     }
    737     if (log)
    738     {
    739         if (new_value_sp)
    740             log->Printf ("SBValue(%p)::CreateValueFromExpression(name=\"%s\", expression=\"%s\") => SBValue (%p)",
    741                          value_sp.get(),
    742                          name,
    743                          expression,
    744                          new_value_sp.get());
    745         else
    746             log->Printf ("SBValue(%p)::CreateValueFromExpression(name=\"%s\", expression=\"%s\") => NULL",
    747                          value_sp.get(),
    748                          name,
    749                          expression);
    750     }
    751     return sb_value;
    752 }
    753 
    754 lldb::SBValue
    755 SBValue::CreateValueFromAddress(const char* name, lldb::addr_t address, SBType sb_type)
    756 {
    757     lldb::SBValue sb_value;
    758     ValueLocker locker;
    759     lldb::ValueObjectSP value_sp(GetSP(locker));
    760     lldb::ValueObjectSP new_value_sp;
    761     lldb::TypeImplSP type_impl_sp (sb_type.GetSP());
    762     if (value_sp && type_impl_sp)
    763     {
    764         ClangASTType pointee_ast_type(type_impl_sp->GetClangASTType().GetPointerType ());
    765         if (pointee_ast_type)
    766         {
    767             lldb::DataBufferSP buffer(new lldb_private::DataBufferHeap(&address,sizeof(lldb::addr_t)));
    768 
    769             ExecutionContext exe_ctx (value_sp->GetExecutionContextRef());
    770             ValueObjectSP ptr_result_valobj_sp(ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
    771                                                                                pointee_ast_type,
    772                                                                                ConstString(name),
    773                                                                                buffer,
    774                                                                                lldb::endian::InlHostByteOrder(),
    775                                                                                exe_ctx.GetAddressByteSize()));
    776 
    777             if (ptr_result_valobj_sp)
    778             {
    779                 ptr_result_valobj_sp->GetValue().SetValueType(Value::eValueTypeLoadAddress);
    780                 Error err;
    781                 new_value_sp = ptr_result_valobj_sp->Dereference(err);
    782                 if (new_value_sp)
    783                     new_value_sp->SetName(ConstString(name));
    784             }
    785             sb_value.SetSP(new_value_sp);
    786         }
    787     }
    788     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    789     if (log)
    790     {
    791         if (new_value_sp)
    792             log->Printf ("SBValue(%p)::CreateValueFromAddress => \"%s\"", value_sp.get(), new_value_sp->GetName().AsCString());
    793         else
    794             log->Printf ("SBValue(%p)::CreateValueFromAddress => NULL", value_sp.get());
    795     }
    796     return sb_value;
    797 }
    798 
    799 lldb::SBValue
    800 SBValue::CreateValueFromData (const char* name, SBData data, SBType type)
    801 {
    802     lldb::SBValue sb_value;
    803     lldb::ValueObjectSP new_value_sp;
    804     ValueLocker locker;
    805     lldb::ValueObjectSP value_sp(GetSP(locker));
    806     if (value_sp)
    807     {
    808         ExecutionContext exe_ctx (value_sp->GetExecutionContextRef());
    809 
    810         new_value_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
    811                                                        type.m_opaque_sp->GetClangASTType(),
    812                                                        ConstString(name),
    813                                                        *data.m_opaque_sp,
    814                                                        LLDB_INVALID_ADDRESS);
    815         new_value_sp->SetAddressTypeOfChildren(eAddressTypeLoad);
    816         sb_value.SetSP(new_value_sp);
    817     }
    818     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    819     if (log)
    820     {
    821         if (new_value_sp)
    822             log->Printf ("SBValue(%p)::CreateValueFromData => \"%s\"", value_sp.get(), new_value_sp->GetName().AsCString());
    823         else
    824             log->Printf ("SBValue(%p)::CreateValueFromData => NULL", value_sp.get());
    825     }
    826     return sb_value;
    827 }
    828 
    829 SBValue
    830 SBValue::GetChildAtIndex (uint32_t idx)
    831 {
    832     const bool can_create_synthetic = false;
    833     lldb::DynamicValueType use_dynamic = eNoDynamicValues;
    834     TargetSP target_sp;
    835     if (m_opaque_sp)
    836         target_sp = m_opaque_sp->GetTargetSP();
    837 
    838     if (target_sp)
    839         use_dynamic = target_sp->GetPreferDynamicValue();
    840 
    841     return GetChildAtIndex (idx, use_dynamic, can_create_synthetic);
    842 }
    843 
    844 SBValue
    845 SBValue::GetChildAtIndex (uint32_t idx, lldb::DynamicValueType use_dynamic, bool can_create_synthetic)
    846 {
    847     lldb::ValueObjectSP child_sp;
    848     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    849 
    850     ValueLocker locker;
    851     lldb::ValueObjectSP value_sp(GetSP(locker));
    852     if (value_sp)
    853     {
    854         const bool can_create = true;
    855         child_sp = value_sp->GetChildAtIndex (idx, can_create);
    856         if (can_create_synthetic && !child_sp)
    857         {
    858             if (value_sp->IsPointerType())
    859             {
    860                 child_sp = value_sp->GetSyntheticArrayMemberFromPointer(idx, can_create);
    861             }
    862             else if (value_sp->IsArrayType())
    863             {
    864                 child_sp = value_sp->GetSyntheticArrayMemberFromArray(idx, can_create);
    865             }
    866         }
    867     }
    868 
    869     SBValue sb_value;
    870     sb_value.SetSP (child_sp, use_dynamic, GetPreferSyntheticValue());
    871     if (log)
    872         log->Printf ("SBValue(%p)::GetChildAtIndex (%u) => SBValue(%p)", value_sp.get(), idx, value_sp.get());
    873 
    874     return sb_value;
    875 }
    876 
    877 uint32_t
    878 SBValue::GetIndexOfChildWithName (const char *name)
    879 {
    880     uint32_t idx = UINT32_MAX;
    881     ValueLocker locker;
    882     lldb::ValueObjectSP value_sp(GetSP(locker));
    883     if (value_sp)
    884     {
    885         idx = value_sp->GetIndexOfChildWithName (ConstString(name));
    886     }
    887     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    888     if (log)
    889     {
    890         if (idx == UINT32_MAX)
    891             log->Printf ("SBValue(%p)::GetIndexOfChildWithName (name=\"%s\") => NOT FOUND", value_sp.get(), name);
    892         else
    893             log->Printf ("SBValue(%p)::GetIndexOfChildWithName (name=\"%s\") => %u", value_sp.get(), name, idx);
    894     }
    895     return idx;
    896 }
    897 
    898 SBValue
    899 SBValue::GetChildMemberWithName (const char *name)
    900 {
    901     lldb::DynamicValueType use_dynamic_value = eNoDynamicValues;
    902     TargetSP target_sp;
    903     if (m_opaque_sp)
    904         target_sp = m_opaque_sp->GetTargetSP();
    905 
    906     if (target_sp)
    907         use_dynamic_value = target_sp->GetPreferDynamicValue();
    908     return GetChildMemberWithName (name, use_dynamic_value);
    909 }
    910 
    911 SBValue
    912 SBValue::GetChildMemberWithName (const char *name, lldb::DynamicValueType use_dynamic_value)
    913 {
    914     lldb::ValueObjectSP child_sp;
    915     const ConstString str_name (name);
    916 
    917     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    918 
    919     ValueLocker locker;
    920     lldb::ValueObjectSP value_sp(GetSP(locker));
    921     if (value_sp)
    922     {
    923         child_sp = value_sp->GetChildMemberWithName (str_name, true);
    924     }
    925 
    926     SBValue sb_value;
    927     sb_value.SetSP(child_sp, use_dynamic_value, GetPreferSyntheticValue());
    928 
    929     if (log)
    930         log->Printf ("SBValue(%p)::GetChildMemberWithName (name=\"%s\") => SBValue(%p)", value_sp.get(), name, value_sp.get());
    931 
    932     return sb_value;
    933 }
    934 
    935 lldb::SBValue
    936 SBValue::GetDynamicValue (lldb::DynamicValueType use_dynamic)
    937 {
    938     SBValue value_sb;
    939     if (IsValid())
    940     {
    941         ValueImplSP proxy_sp(new ValueImpl(m_opaque_sp->GetRootSP(),use_dynamic,m_opaque_sp->GetUseSynthetic()));
    942         value_sb.SetSP(proxy_sp);
    943     }
    944     return value_sb;
    945 }
    946 
    947 lldb::SBValue
    948 SBValue::GetStaticValue ()
    949 {
    950     SBValue value_sb;
    951     if (IsValid())
    952     {
    953         ValueImplSP proxy_sp(new ValueImpl(m_opaque_sp->GetRootSP(),eNoDynamicValues,m_opaque_sp->GetUseSynthetic()));
    954         value_sb.SetSP(proxy_sp);
    955     }
    956     return value_sb;
    957 }
    958 
    959 lldb::SBValue
    960 SBValue::GetNonSyntheticValue ()
    961 {
    962     SBValue value_sb;
    963     if (IsValid())
    964     {
    965         ValueImplSP proxy_sp(new ValueImpl(m_opaque_sp->GetRootSP(),m_opaque_sp->GetUseDynamic(),false));
    966         value_sb.SetSP(proxy_sp);
    967     }
    968     return value_sb;
    969 }
    970 
    971 lldb::DynamicValueType
    972 SBValue::GetPreferDynamicValue ()
    973 {
    974     if (!IsValid())
    975         return eNoDynamicValues;
    976     return m_opaque_sp->GetUseDynamic();
    977 }
    978 
    979 void
    980 SBValue::SetPreferDynamicValue (lldb::DynamicValueType use_dynamic)
    981 {
    982     if (IsValid())
    983         return m_opaque_sp->SetUseDynamic (use_dynamic);
    984 }
    985 
    986 bool
    987 SBValue::GetPreferSyntheticValue ()
    988 {
    989     if (!IsValid())
    990         return false;
    991     return m_opaque_sp->GetUseSynthetic();
    992 }
    993 
    994 void
    995 SBValue::SetPreferSyntheticValue (bool use_synthetic)
    996 {
    997     if (IsValid())
    998         return m_opaque_sp->SetUseSynthetic (use_synthetic);
    999 }
   1000 
   1001 bool
   1002 SBValue::IsDynamic()
   1003 {
   1004     ValueLocker locker;
   1005     lldb::ValueObjectSP value_sp(GetSP(locker));
   1006     if (value_sp)
   1007         return value_sp->IsDynamic();
   1008     return false;
   1009 }
   1010 
   1011 bool
   1012 SBValue::IsSynthetic ()
   1013 {
   1014     ValueLocker locker;
   1015     lldb::ValueObjectSP value_sp(GetSP(locker));
   1016     if (value_sp)
   1017         return value_sp->IsSynthetic();
   1018     return false;
   1019 }
   1020 
   1021 lldb::SBValue
   1022 SBValue::GetValueForExpressionPath(const char* expr_path)
   1023 {
   1024     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
   1025     lldb::ValueObjectSP child_sp;
   1026     ValueLocker locker;
   1027     lldb::ValueObjectSP value_sp(GetSP(locker));
   1028     if (value_sp)
   1029     {
   1030         // using default values for all the fancy options, just do it if you can
   1031         child_sp = value_sp->GetValueForExpressionPath(expr_path);
   1032     }
   1033 
   1034     SBValue sb_value;
   1035     sb_value.SetSP(child_sp,GetPreferDynamicValue(),GetPreferSyntheticValue());
   1036 
   1037     if (log)
   1038         log->Printf ("SBValue(%p)::GetValueForExpressionPath (expr_path=\"%s\") => SBValue(%p)", value_sp.get(), expr_path, value_sp.get());
   1039 
   1040     return sb_value;
   1041 }
   1042 
   1043 int64_t
   1044 SBValue::GetValueAsSigned(SBError& error, int64_t fail_value)
   1045 {
   1046     error.Clear();
   1047     ValueLocker locker;
   1048     lldb::ValueObjectSP value_sp(GetSP(locker));
   1049     if (value_sp)
   1050     {
   1051         Scalar scalar;
   1052         if (value_sp->ResolveValue (scalar))
   1053             return scalar.SLongLong (fail_value);
   1054         else
   1055             error.SetErrorString ("could not resolve value");
   1056     }
   1057     else
   1058         error.SetErrorStringWithFormat ("could not get SBValue: %s", locker.GetError().AsCString());
   1059 
   1060     return fail_value;
   1061 }
   1062 
   1063 uint64_t
   1064 SBValue::GetValueAsUnsigned(SBError& error, uint64_t fail_value)
   1065 {
   1066     error.Clear();
   1067     ValueLocker locker;
   1068     lldb::ValueObjectSP value_sp(GetSP(locker));
   1069     if (value_sp)
   1070     {
   1071         Scalar scalar;
   1072         if (value_sp->ResolveValue (scalar))
   1073             return scalar.ULongLong(fail_value);
   1074         else
   1075             error.SetErrorString("could not resolve value");
   1076     }
   1077     else
   1078         error.SetErrorStringWithFormat ("could not get SBValue: %s", locker.GetError().AsCString());
   1079 
   1080     return fail_value;
   1081 }
   1082 
   1083 int64_t
   1084 SBValue::GetValueAsSigned(int64_t fail_value)
   1085 {
   1086     ValueLocker locker;
   1087     lldb::ValueObjectSP value_sp(GetSP(locker));
   1088     if (value_sp)
   1089     {
   1090         Scalar scalar;
   1091         if (value_sp->ResolveValue (scalar))
   1092             return scalar.SLongLong(fail_value);
   1093     }
   1094     return fail_value;
   1095 }
   1096 
   1097 uint64_t
   1098 SBValue::GetValueAsUnsigned(uint64_t fail_value)
   1099 {
   1100     ValueLocker locker;
   1101     lldb::ValueObjectSP value_sp(GetSP(locker));
   1102     if (value_sp)
   1103     {
   1104         Scalar scalar;
   1105         if (value_sp->ResolveValue (scalar))
   1106             return scalar.ULongLong(fail_value);
   1107     }
   1108     return fail_value;
   1109 }
   1110 
   1111 bool
   1112 SBValue::MightHaveChildren ()
   1113 {
   1114     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
   1115     bool has_children = false;
   1116     ValueLocker locker;
   1117     lldb::ValueObjectSP value_sp(GetSP(locker));
   1118     if (value_sp)
   1119         has_children = value_sp->MightHaveChildren();
   1120 
   1121     if (log)
   1122         log->Printf ("SBValue(%p)::MightHaveChildren() => %i", value_sp.get(), has_children);
   1123     return has_children;
   1124 }
   1125 
   1126 uint32_t
   1127 SBValue::GetNumChildren ()
   1128 {
   1129     uint32_t num_children = 0;
   1130 
   1131     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
   1132     ValueLocker locker;
   1133     lldb::ValueObjectSP value_sp(GetSP(locker));
   1134     if (value_sp)
   1135         num_children = value_sp->GetNumChildren();
   1136 
   1137     if (log)
   1138         log->Printf ("SBValue(%p)::GetNumChildren () => %u", value_sp.get(), num_children);
   1139 
   1140     return num_children;
   1141 }
   1142 
   1143 
   1144 SBValue
   1145 SBValue::Dereference ()
   1146 {
   1147     SBValue sb_value;
   1148     ValueLocker locker;
   1149     lldb::ValueObjectSP value_sp(GetSP(locker));
   1150     if (value_sp)
   1151     {
   1152             Error error;
   1153             sb_value = value_sp->Dereference (error);
   1154     }
   1155     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
   1156     if (log)
   1157         log->Printf ("SBValue(%p)::Dereference () => SBValue(%p)", value_sp.get(), value_sp.get());
   1158 
   1159     return sb_value;
   1160 }
   1161 
   1162 bool
   1163 SBValue::TypeIsPointerType ()
   1164 {
   1165     bool is_ptr_type = false;
   1166 
   1167     ValueLocker locker;
   1168     lldb::ValueObjectSP value_sp(GetSP(locker));
   1169     if (value_sp)
   1170         is_ptr_type = value_sp->IsPointerType();
   1171 
   1172     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
   1173     if (log)
   1174         log->Printf ("SBValue(%p)::TypeIsPointerType () => %i", value_sp.get(), is_ptr_type);
   1175 
   1176 
   1177     return is_ptr_type;
   1178 }
   1179 
   1180 void *
   1181 SBValue::GetOpaqueType()
   1182 {
   1183     ValueLocker locker;
   1184     lldb::ValueObjectSP value_sp(GetSP(locker));
   1185     if (value_sp)
   1186         return value_sp->GetClangType().GetOpaqueQualType();
   1187     return NULL;
   1188 }
   1189 
   1190 lldb::SBTarget
   1191 SBValue::GetTarget()
   1192 {
   1193     SBTarget sb_target;
   1194     TargetSP target_sp;
   1195     if (m_opaque_sp)
   1196     {
   1197         target_sp = m_opaque_sp->GetTargetSP();
   1198         sb_target.SetSP (target_sp);
   1199     }
   1200     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
   1201     if (log)
   1202     {
   1203         if (target_sp.get() == NULL)
   1204             log->Printf ("SBValue(%p)::GetTarget () => NULL", m_opaque_sp.get());
   1205         else
   1206             log->Printf ("SBValue(%p)::GetTarget () => %p", m_opaque_sp.get(), target_sp.get());
   1207     }
   1208     return sb_target;
   1209 }
   1210 
   1211 lldb::SBProcess
   1212 SBValue::GetProcess()
   1213 {
   1214     SBProcess sb_process;
   1215     ProcessSP process_sp;
   1216     if (m_opaque_sp)
   1217     {
   1218         process_sp = m_opaque_sp->GetProcessSP();
   1219         sb_process.SetSP (process_sp);
   1220     }
   1221     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
   1222     if (log)
   1223     {
   1224         if (process_sp.get() == NULL)
   1225             log->Printf ("SBValue(%p)::GetProcess () => NULL", m_opaque_sp.get());
   1226         else
   1227             log->Printf ("SBValue(%p)::GetProcess () => %p", m_opaque_sp.get(), process_sp.get());
   1228     }
   1229     return sb_process;
   1230 }
   1231 
   1232 lldb::SBThread
   1233 SBValue::GetThread()
   1234 {
   1235     SBThread sb_thread;
   1236     ThreadSP thread_sp;
   1237     if (m_opaque_sp)
   1238     {
   1239         thread_sp = m_opaque_sp->GetThreadSP();
   1240         sb_thread.SetThread(thread_sp);
   1241     }
   1242     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
   1243     if (log)
   1244     {
   1245         if (thread_sp.get() == NULL)
   1246             log->Printf ("SBValue(%p)::GetThread () => NULL", m_opaque_sp.get());
   1247         else
   1248             log->Printf ("SBValue(%p)::GetThread () => %p", m_opaque_sp.get(), thread_sp.get());
   1249     }
   1250     return sb_thread;
   1251 }
   1252 
   1253 lldb::SBFrame
   1254 SBValue::GetFrame()
   1255 {
   1256     SBFrame sb_frame;
   1257     StackFrameSP frame_sp;
   1258     if (m_opaque_sp)
   1259     {
   1260         frame_sp = m_opaque_sp->GetFrameSP();
   1261         sb_frame.SetFrameSP (frame_sp);
   1262     }
   1263     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
   1264     if (log)
   1265     {
   1266         if (frame_sp.get() == NULL)
   1267             log->Printf ("SBValue(%p)::GetFrame () => NULL", m_opaque_sp.get());
   1268         else
   1269             log->Printf ("SBValue(%p)::GetFrame () => %p", m_opaque_sp.get(), frame_sp.get());
   1270     }
   1271     return sb_frame;
   1272 }
   1273 
   1274 
   1275 lldb::ValueObjectSP
   1276 SBValue::GetSP (ValueLocker &locker) const
   1277 {
   1278     if (!m_opaque_sp || !m_opaque_sp->IsValid())
   1279         return ValueObjectSP();
   1280     return locker.GetLockedSP(*m_opaque_sp.get());
   1281 }
   1282 
   1283 lldb::ValueObjectSP
   1284 SBValue::GetSP () const
   1285 {
   1286     ValueLocker locker;
   1287     return GetSP(locker);
   1288 }
   1289 
   1290 void
   1291 SBValue::SetSP (ValueImplSP impl_sp)
   1292 {
   1293     m_opaque_sp = impl_sp;
   1294 }
   1295 
   1296 void
   1297 SBValue::SetSP (const lldb::ValueObjectSP &sp)
   1298 {
   1299     if (sp)
   1300     {
   1301         lldb::TargetSP target_sp(sp->GetTargetSP());
   1302         if (target_sp)
   1303         {
   1304             lldb::DynamicValueType use_dynamic = target_sp->GetPreferDynamicValue();
   1305             bool use_synthetic = target_sp->TargetProperties::GetEnableSyntheticValue();
   1306             m_opaque_sp = ValueImplSP(new ValueImpl(sp, use_dynamic, use_synthetic));
   1307         }
   1308         else
   1309             m_opaque_sp = ValueImplSP(new ValueImpl(sp,eNoDynamicValues,true));
   1310     }
   1311     else
   1312         m_opaque_sp = ValueImplSP(new ValueImpl(sp,eNoDynamicValues,false));
   1313 }
   1314 
   1315 void
   1316 SBValue::SetSP (const lldb::ValueObjectSP &sp, lldb::DynamicValueType use_dynamic)
   1317 {
   1318     if (sp)
   1319     {
   1320         lldb::TargetSP target_sp(sp->GetTargetSP());
   1321         if (target_sp)
   1322         {
   1323             bool use_synthetic = target_sp->TargetProperties::GetEnableSyntheticValue();
   1324             SetSP (sp, use_dynamic, use_synthetic);
   1325         }
   1326         else
   1327             SetSP (sp, use_dynamic, true);
   1328     }
   1329     else
   1330         SetSP (sp, use_dynamic, false);
   1331 }
   1332 
   1333 void
   1334 SBValue::SetSP (const lldb::ValueObjectSP &sp, bool use_synthetic)
   1335 {
   1336     if (sp)
   1337     {
   1338         lldb::TargetSP target_sp(sp->GetTargetSP());
   1339         if (target_sp)
   1340         {
   1341             lldb::DynamicValueType use_dynamic = target_sp->GetPreferDynamicValue();
   1342             SetSP (sp, use_dynamic, use_synthetic);
   1343         }
   1344         else
   1345             SetSP (sp, eNoDynamicValues, use_synthetic);
   1346     }
   1347     else
   1348         SetSP (sp, eNoDynamicValues, use_synthetic);
   1349 }
   1350 
   1351 void
   1352 SBValue::SetSP (const lldb::ValueObjectSP &sp, lldb::DynamicValueType use_dynamic, bool use_synthetic)
   1353 {
   1354     m_opaque_sp = ValueImplSP(new ValueImpl(sp,use_dynamic,use_synthetic));
   1355 }
   1356 
   1357 void
   1358 SBValue::SetSP (const lldb::ValueObjectSP &sp, lldb::DynamicValueType use_dynamic, bool use_synthetic, const char *name)
   1359 {
   1360     m_opaque_sp = ValueImplSP(new ValueImpl(sp,use_dynamic,use_synthetic, name));
   1361 }
   1362 
   1363 bool
   1364 SBValue::GetExpressionPath (SBStream &description)
   1365 {
   1366     ValueLocker locker;
   1367     lldb::ValueObjectSP value_sp(GetSP(locker));
   1368     if (value_sp)
   1369     {
   1370         value_sp->GetExpressionPath (description.ref(), false);
   1371         return true;
   1372     }
   1373     return false;
   1374 }
   1375 
   1376 bool
   1377 SBValue::GetExpressionPath (SBStream &description, bool qualify_cxx_base_classes)
   1378 {
   1379     ValueLocker locker;
   1380     lldb::ValueObjectSP value_sp(GetSP(locker));
   1381     if (value_sp)
   1382     {
   1383         value_sp->GetExpressionPath (description.ref(), qualify_cxx_base_classes);
   1384         return true;
   1385     }
   1386     return false;
   1387 }
   1388 
   1389 bool
   1390 SBValue::GetDescription (SBStream &description)
   1391 {
   1392     Stream &strm = description.ref();
   1393 
   1394     ValueLocker locker;
   1395     lldb::ValueObjectSP value_sp(GetSP(locker));
   1396     if (value_sp)
   1397     {
   1398         ValueObject::DumpValueObject (strm, value_sp.get());
   1399     }
   1400     else
   1401         strm.PutCString ("No value");
   1402 
   1403     return true;
   1404 }
   1405 
   1406 lldb::Format
   1407 SBValue::GetFormat ()
   1408 {
   1409     ValueLocker locker;
   1410     lldb::ValueObjectSP value_sp(GetSP(locker));
   1411     if (value_sp)
   1412         return value_sp->GetFormat();
   1413     return eFormatDefault;
   1414 }
   1415 
   1416 void
   1417 SBValue::SetFormat (lldb::Format format)
   1418 {
   1419     ValueLocker locker;
   1420     lldb::ValueObjectSP value_sp(GetSP(locker));
   1421     if (value_sp)
   1422         value_sp->SetFormat(format);
   1423 }
   1424 
   1425 lldb::SBValue
   1426 SBValue::AddressOf()
   1427 {
   1428     SBValue sb_value;
   1429     ValueLocker locker;
   1430     lldb::ValueObjectSP value_sp(GetSP(locker));
   1431     if (value_sp)
   1432     {
   1433         Error error;
   1434         sb_value.SetSP(value_sp->AddressOf (error),GetPreferDynamicValue(), GetPreferSyntheticValue());
   1435     }
   1436     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
   1437     if (log)
   1438         log->Printf ("SBValue(%p)::AddressOf () => SBValue(%p)", value_sp.get(), value_sp.get());
   1439 
   1440     return sb_value;
   1441 }
   1442 
   1443 lldb::addr_t
   1444 SBValue::GetLoadAddress()
   1445 {
   1446     lldb::addr_t value = LLDB_INVALID_ADDRESS;
   1447     ValueLocker locker;
   1448     lldb::ValueObjectSP value_sp(GetSP(locker));
   1449     if (value_sp)
   1450     {
   1451         TargetSP target_sp (value_sp->GetTargetSP());
   1452         if (target_sp)
   1453         {
   1454             const bool scalar_is_load_address = true;
   1455             AddressType addr_type;
   1456             value = value_sp->GetAddressOf(scalar_is_load_address, &addr_type);
   1457             if (addr_type == eAddressTypeFile)
   1458             {
   1459                 ModuleSP module_sp (value_sp->GetModule());
   1460                 if (!module_sp)
   1461                     value = LLDB_INVALID_ADDRESS;
   1462                 else
   1463                 {
   1464                     Address addr;
   1465                     module_sp->ResolveFileAddress(value, addr);
   1466                     value = addr.GetLoadAddress(target_sp.get());
   1467                 }
   1468             }
   1469             else if (addr_type == eAddressTypeHost || addr_type == eAddressTypeInvalid)
   1470                 value = LLDB_INVALID_ADDRESS;
   1471         }
   1472     }
   1473     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
   1474     if (log)
   1475         log->Printf ("SBValue(%p)::GetLoadAddress () => (%" PRIu64 ")", value_sp.get(), value);
   1476 
   1477     return value;
   1478 }
   1479 
   1480 lldb::SBAddress
   1481 SBValue::GetAddress()
   1482 {
   1483     Address addr;
   1484     ValueLocker locker;
   1485     lldb::ValueObjectSP value_sp(GetSP(locker));
   1486     if (value_sp)
   1487     {
   1488         TargetSP target_sp (value_sp->GetTargetSP());
   1489         if (target_sp)
   1490         {
   1491             lldb::addr_t value = LLDB_INVALID_ADDRESS;
   1492             const bool scalar_is_load_address = true;
   1493             AddressType addr_type;
   1494             value = value_sp->GetAddressOf(scalar_is_load_address, &addr_type);
   1495             if (addr_type == eAddressTypeFile)
   1496             {
   1497                 ModuleSP module_sp (value_sp->GetModule());
   1498                 if (module_sp)
   1499                     module_sp->ResolveFileAddress(value, addr);
   1500             }
   1501             else if (addr_type == eAddressTypeLoad)
   1502             {
   1503                 // no need to check the return value on this.. if it can actually do the resolve
   1504                 // addr will be in the form (section,offset), otherwise it will simply be returned
   1505                 // as (NULL, value)
   1506                 addr.SetLoadAddress(value, target_sp.get());
   1507             }
   1508         }
   1509     }
   1510     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
   1511     if (log)
   1512         log->Printf ("SBValue(%p)::GetAddress () => (%s,%" PRIu64 ")", value_sp.get(),
   1513                      (addr.GetSection() ? addr.GetSection()->GetName().GetCString() : "NULL"),
   1514                      addr.GetOffset());
   1515     return SBAddress(new Address(addr));
   1516 }
   1517 
   1518 lldb::SBData
   1519 SBValue::GetPointeeData (uint32_t item_idx,
   1520                          uint32_t item_count)
   1521 {
   1522     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
   1523     lldb::SBData sb_data;
   1524     ValueLocker locker;
   1525     lldb::ValueObjectSP value_sp(GetSP(locker));
   1526     if (value_sp)
   1527     {
   1528         TargetSP target_sp (value_sp->GetTargetSP());
   1529         if (target_sp)
   1530         {
   1531             DataExtractorSP data_sp(new DataExtractor());
   1532             value_sp->GetPointeeData(*data_sp, item_idx, item_count);
   1533             if (data_sp->GetByteSize() > 0)
   1534                 *sb_data = data_sp;
   1535         }
   1536     }
   1537     if (log)
   1538         log->Printf ("SBValue(%p)::GetPointeeData (%d, %d) => SBData(%p)",
   1539                      value_sp.get(),
   1540                      item_idx,
   1541                      item_count,
   1542                      sb_data.get());
   1543 
   1544     return sb_data;
   1545 }
   1546 
   1547 lldb::SBData
   1548 SBValue::GetData ()
   1549 {
   1550     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
   1551     lldb::SBData sb_data;
   1552     ValueLocker locker;
   1553     lldb::ValueObjectSP value_sp(GetSP(locker));
   1554     if (value_sp)
   1555     {
   1556         DataExtractorSP data_sp(new DataExtractor());
   1557         value_sp->GetData(*data_sp);
   1558         if (data_sp->GetByteSize() > 0)
   1559             *sb_data = data_sp;
   1560     }
   1561     if (log)
   1562         log->Printf ("SBValue(%p)::GetData () => SBData(%p)",
   1563                      value_sp.get(),
   1564                      sb_data.get());
   1565 
   1566     return sb_data;
   1567 }
   1568 
   1569 bool
   1570 SBValue::SetData (lldb::SBData &data, SBError &error)
   1571 {
   1572     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
   1573     ValueLocker locker;
   1574     lldb::ValueObjectSP value_sp(GetSP(locker));
   1575     bool ret = true;
   1576 
   1577     if (value_sp)
   1578     {
   1579         DataExtractor *data_extractor = data.get();
   1580 
   1581         if (!data_extractor)
   1582         {
   1583             if (log)
   1584                 log->Printf ("SBValue(%p)::SetData() => error: no data to set", value_sp.get());
   1585 
   1586             error.SetErrorString("No data to set");
   1587             ret = false;
   1588         }
   1589         else
   1590         {
   1591             Error set_error;
   1592 
   1593             value_sp->SetData(*data_extractor, set_error);
   1594 
   1595             if (!set_error.Success())
   1596             {
   1597                 error.SetErrorStringWithFormat("Couldn't set data: %s", set_error.AsCString());
   1598                 ret = false;
   1599             }
   1600         }
   1601     }
   1602     else
   1603     {
   1604         error.SetErrorStringWithFormat ("Couldn't set data: could not get SBValue: %s", locker.GetError().AsCString());
   1605         ret = false;
   1606     }
   1607 
   1608     if (log)
   1609         log->Printf ("SBValue(%p)::SetData (%p) => %s",
   1610                      value_sp.get(),
   1611                      data.get(),
   1612                      ret ? "true" : "false");
   1613     return ret;
   1614 }
   1615 
   1616 lldb::SBDeclaration
   1617 SBValue::GetDeclaration ()
   1618 {
   1619     ValueLocker locker;
   1620     lldb::ValueObjectSP value_sp(GetSP(locker));
   1621     SBDeclaration decl_sb;
   1622     if (value_sp)
   1623     {
   1624         Declaration decl;
   1625         if (value_sp->GetDeclaration(decl))
   1626             decl_sb.SetDeclaration(decl);
   1627     }
   1628     return decl_sb;
   1629 }
   1630 
   1631 lldb::SBWatchpoint
   1632 SBValue::Watch (bool resolve_location, bool read, bool write, SBError &error)
   1633 {
   1634     SBWatchpoint sb_watchpoint;
   1635 
   1636     // If the SBValue is not valid, there's no point in even trying to watch it.
   1637     ValueLocker locker;
   1638     lldb::ValueObjectSP value_sp(GetSP(locker));
   1639     TargetSP target_sp (GetTarget().GetSP());
   1640     if (value_sp && target_sp)
   1641     {
   1642         // Read and Write cannot both be false.
   1643         if (!read && !write)
   1644             return sb_watchpoint;
   1645 
   1646         // If the value is not in scope, don't try and watch and invalid value
   1647         if (!IsInScope())
   1648             return sb_watchpoint;
   1649 
   1650         addr_t addr = GetLoadAddress();
   1651         if (addr == LLDB_INVALID_ADDRESS)
   1652             return sb_watchpoint;
   1653         size_t byte_size = GetByteSize();
   1654         if (byte_size == 0)
   1655             return sb_watchpoint;
   1656 
   1657         uint32_t watch_type = 0;
   1658         if (read)
   1659             watch_type |= LLDB_WATCH_TYPE_READ;
   1660         if (write)
   1661             watch_type |= LLDB_WATCH_TYPE_WRITE;
   1662 
   1663         Error rc;
   1664         ClangASTType type (value_sp->GetClangType());
   1665         WatchpointSP watchpoint_sp = target_sp->CreateWatchpoint(addr, byte_size, &type, watch_type, rc);
   1666         error.SetError(rc);
   1667 
   1668         if (watchpoint_sp)
   1669         {
   1670             sb_watchpoint.SetSP (watchpoint_sp);
   1671             Declaration decl;
   1672             if (value_sp->GetDeclaration (decl))
   1673             {
   1674                 if (decl.GetFile())
   1675                 {
   1676                     StreamString ss;
   1677                     // True to show fullpath for declaration file.
   1678                     decl.DumpStopContext(&ss, true);
   1679                     watchpoint_sp->SetDeclInfo(ss.GetString());
   1680                 }
   1681             }
   1682         }
   1683     }
   1684     else if (target_sp)
   1685     {
   1686         Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
   1687         if (log)
   1688             log->Printf ("SBValue(%p)::Watch() => error getting SBValue: %s", value_sp.get(), locker.GetError().AsCString());
   1689 
   1690         error.SetErrorStringWithFormat("could not get SBValue: %s", locker.GetError().AsCString());
   1691     }
   1692     else
   1693     {
   1694         Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
   1695         if (log)
   1696             log->Printf ("SBValue(%p)::Watch() => error getting SBValue: no target", value_sp.get());
   1697         error.SetErrorString("could not set watchpoint, a target is required");
   1698     }
   1699 
   1700     return sb_watchpoint;
   1701 }
   1702 
   1703 // FIXME: Remove this method impl (as well as the decl in .h) once it is no longer needed.
   1704 // Backward compatibility fix in the interim.
   1705 lldb::SBWatchpoint
   1706 SBValue::Watch (bool resolve_location, bool read, bool write)
   1707 {
   1708     SBError error;
   1709     return Watch(resolve_location, read, write, error);
   1710 }
   1711 
   1712 lldb::SBWatchpoint
   1713 SBValue::WatchPointee (bool resolve_location, bool read, bool write, SBError &error)
   1714 {
   1715     SBWatchpoint sb_watchpoint;
   1716     if (IsInScope() && GetType().IsPointerType())
   1717         sb_watchpoint = Dereference().Watch (resolve_location, read, write, error);
   1718     return sb_watchpoint;
   1719 }
   1720