SBValue.cpp revision c48ca82920bd333c7ccb6ec0e579207add130296
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/API/SBValue.h"
11
12#include "lldb/API/SBStream.h"
13#include "lldb/API/SBTypeFilter.h"
14#include "lldb/API/SBTypeFormat.h"
15#include "lldb/API/SBTypeSummary.h"
16#include "lldb/API/SBTypeSynthetic.h"
17
18#include "lldb/Breakpoint/Watchpoint.h"
19#include "lldb/Core/DataExtractor.h"
20#include "lldb/Core/DataVisualization.h"
21#include "lldb/Core/Log.h"
22#include "lldb/Core/Module.h"
23#include "lldb/Core/Scalar.h"
24#include "lldb/Core/Stream.h"
25#include "lldb/Core/StreamFile.h"
26#include "lldb/Core/Value.h"
27#include "lldb/Core/ValueObject.h"
28#include "lldb/Core/ValueObjectConstResult.h"
29#include "lldb/Symbol/Block.h"
30#include "lldb/Symbol/ObjectFile.h"
31#include "lldb/Symbol/Type.h"
32#include "lldb/Symbol/Variable.h"
33#include "lldb/Symbol/VariableList.h"
34#include "lldb/Target/ExecutionContext.h"
35#include "lldb/Target/Process.h"
36#include "lldb/Target/StackFrame.h"
37#include "lldb/Target/Target.h"
38#include "lldb/Target/Thread.h"
39
40#include "lldb/API/SBProcess.h"
41#include "lldb/API/SBTarget.h"
42#include "lldb/API/SBThread.h"
43#include "lldb/API/SBFrame.h"
44#include "lldb/API/SBDebugger.h"
45
46using namespace lldb;
47using namespace lldb_private;
48
49SBValue::SBValue () :
50    m_opaque_sp ()
51{
52}
53
54SBValue::SBValue (const lldb::ValueObjectSP &value_sp) :
55    m_opaque_sp (value_sp)
56{
57}
58
59SBValue::SBValue(const SBValue &rhs) :
60    m_opaque_sp (rhs.m_opaque_sp)
61{
62}
63
64SBValue &
65SBValue::operator = (const SBValue &rhs)
66{
67    if (this != &rhs)
68        m_opaque_sp = rhs.m_opaque_sp;
69    return *this;
70}
71
72SBValue::~SBValue()
73{
74}
75
76bool
77SBValue::IsValid ()
78{
79    // If this function ever changes to anything that does more than just
80    // check if the opaque shared pointer is non NULL, then we need to update
81    // all "if (m_opaque_sp)" code in this file.
82    return m_opaque_sp.get() != NULL;
83}
84
85void
86SBValue::Clear()
87{
88    m_opaque_sp.reset();
89}
90
91SBError
92SBValue::GetError()
93{
94    SBError sb_error;
95
96    lldb::ValueObjectSP value_sp(GetSP());
97    if (value_sp)
98        sb_error.SetError(value_sp->GetError());
99    else
100        sb_error.SetErrorString("error: invalid value");
101
102    return sb_error;
103}
104
105user_id_t
106SBValue::GetID()
107{
108    lldb::ValueObjectSP value_sp(GetSP());
109    if (value_sp)
110        return value_sp->GetID();
111    return LLDB_INVALID_UID;
112}
113
114const char *
115SBValue::GetName()
116{
117
118    const char *name = NULL;
119    lldb::ValueObjectSP value_sp(GetSP());
120    if (value_sp)
121        name = value_sp->GetName().GetCString();
122
123    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
124    if (log)
125    {
126        if (name)
127            log->Printf ("SBValue(%p)::GetName () => \"%s\"", value_sp.get(), name);
128        else
129            log->Printf ("SBValue(%p)::GetName () => NULL", value_sp.get());
130    }
131
132    return name;
133}
134
135const char *
136SBValue::GetTypeName ()
137{
138    const char *name = NULL;
139    lldb::ValueObjectSP value_sp(GetSP());
140    if (value_sp)
141        name = value_sp->GetTypeName().GetCString();
142    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
143    if (log)
144    {
145        if (name)
146            log->Printf ("SBValue(%p)::GetTypeName () => \"%s\"", value_sp.get(), name);
147        else
148            log->Printf ("SBValue(%p)::GetTypeName () => NULL", value_sp.get());
149    }
150
151    return name;
152}
153
154size_t
155SBValue::GetByteSize ()
156{
157    size_t result = 0;
158
159    lldb::ValueObjectSP value_sp(GetSP());
160    if (value_sp)
161        result = value_sp->GetByteSize();
162
163    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
164    if (log)
165        log->Printf ("SBValue(%p)::GetByteSize () => %zu", value_sp.get(), result);
166
167    return result;
168}
169
170bool
171SBValue::IsInScope ()
172{
173    bool result = false;
174
175    lldb::ValueObjectSP value_sp(GetSP());
176    if (value_sp)
177    {
178        TargetSP target_sp(value_sp->GetTargetSP());
179        if (target_sp)
180        {
181            Mutex::Locker api_locker (target_sp->GetAPIMutex());
182            result = value_sp->IsInScope ();
183        }
184    }
185
186    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
187    if (log)
188        log->Printf ("SBValue(%p)::IsInScope () => %i", value_sp.get(), result);
189
190    return result;
191}
192
193const char *
194SBValue::GetValue ()
195{
196    const char *cstr = NULL;
197    lldb::ValueObjectSP value_sp(GetSP());
198    if (value_sp)
199    {
200        TargetSP target_sp(value_sp->GetTargetSP());
201        if (target_sp)
202        {
203            Mutex::Locker api_locker (target_sp->GetAPIMutex());
204            cstr = value_sp->GetValueAsCString ();
205        }
206    }
207    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
208    if (log)
209    {
210        if (cstr)
211            log->Printf ("SBValue(%p)::GetValue => \"%s\"", value_sp.get(), cstr);
212        else
213            log->Printf ("SBValue(%p)::GetValue => NULL", value_sp.get());
214    }
215
216    return cstr;
217}
218
219ValueType
220SBValue::GetValueType ()
221{
222    ValueType result = eValueTypeInvalid;
223    lldb::ValueObjectSP value_sp(GetSP());
224    if (value_sp)
225        result = value_sp->GetValueType();
226    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
227    if (log)
228    {
229        switch (result)
230        {
231        case eValueTypeInvalid:         log->Printf ("SBValue(%p)::GetValueType () => eValueTypeInvalid", value_sp.get()); break;
232        case eValueTypeVariableGlobal:  log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableGlobal", value_sp.get()); break;
233        case eValueTypeVariableStatic:  log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableStatic", value_sp.get()); break;
234        case eValueTypeVariableArgument:log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableArgument", value_sp.get()); break;
235        case eValueTypeVariableLocal:   log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableLocal", value_sp.get()); break;
236        case eValueTypeRegister:        log->Printf ("SBValue(%p)::GetValueType () => eValueTypeRegister", value_sp.get()); break;
237        case eValueTypeRegisterSet:     log->Printf ("SBValue(%p)::GetValueType () => eValueTypeRegisterSet", value_sp.get()); break;
238        case eValueTypeConstResult:     log->Printf ("SBValue(%p)::GetValueType () => eValueTypeConstResult", value_sp.get()); break;
239        default:     log->Printf ("SBValue(%p)::GetValueType () => %i ???", value_sp.get(), result); break;
240        }
241    }
242    return result;
243}
244
245const char *
246SBValue::GetObjectDescription ()
247{
248    const char *cstr = NULL;
249    lldb::ValueObjectSP value_sp(GetSP());
250    if (value_sp)
251    {
252        TargetSP target_sp(value_sp->GetTargetSP());
253        if (target_sp)
254        {
255            Mutex::Locker api_locker (target_sp->GetAPIMutex());
256            cstr = value_sp->GetObjectDescription ();
257        }
258    }
259    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
260    if (log)
261    {
262        if (cstr)
263            log->Printf ("SBValue(%p)::GetObjectDescription => \"%s\"", value_sp.get(), cstr);
264        else
265            log->Printf ("SBValue(%p)::GetObjectDescription => NULL", value_sp.get());
266    }
267    return cstr;
268}
269
270SBType
271SBValue::GetType()
272{
273    SBType sb_type;
274    lldb::ValueObjectSP value_sp(GetSP());
275    TypeImplSP type_sp;
276    if (value_sp)
277    {
278        type_sp.reset (new TypeImpl(ClangASTType (value_sp->GetClangAST(), value_sp->GetClangType())));
279        sb_type.SetSP(type_sp);
280    }
281    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
282    if (log)
283    {
284        if (type_sp)
285            log->Printf ("SBValue(%p)::GetType => SBType(%p)", value_sp.get(), type_sp.get());
286        else
287            log->Printf ("SBValue(%p)::GetType => NULL", value_sp.get());
288    }
289    return sb_type;
290}
291
292bool
293SBValue::GetValueDidChange ()
294{
295    bool result = false;
296    lldb::ValueObjectSP value_sp(GetSP());
297    if (value_sp)
298    {
299        TargetSP target_sp(value_sp->GetTargetSP());
300        if (target_sp)
301        {
302            Mutex::Locker api_locker (target_sp->GetAPIMutex());
303            result = value_sp->GetValueDidChange ();
304        }
305    }
306    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
307    if (log)
308        log->Printf ("SBValue(%p)::GetValueDidChange => %i", value_sp.get(), result);
309
310    return result;
311}
312
313#ifndef LLDB_DISABLE_PYTHON
314const char *
315SBValue::GetSummary ()
316{
317    const char *cstr = NULL;
318    lldb::ValueObjectSP value_sp(GetSP());
319    if (value_sp)
320    {
321        TargetSP target_sp(value_sp->GetTargetSP());
322        if (target_sp)
323        {
324            Mutex::Locker api_locker (target_sp->GetAPIMutex());
325            cstr = value_sp->GetSummaryAsCString();
326        }
327    }
328    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
329    if (log)
330    {
331        if (cstr)
332            log->Printf ("SBValue(%p)::GetSummary => \"%s\"", value_sp.get(), cstr);
333        else
334            log->Printf ("SBValue(%p)::GetSummary => NULL", value_sp.get());
335    }
336    return cstr;
337}
338#endif // LLDB_DISABLE_PYTHON
339
340const char *
341SBValue::GetLocation ()
342{
343    const char *cstr = NULL;
344    lldb::ValueObjectSP value_sp(GetSP());
345    if (value_sp)
346    {
347        TargetSP target_sp(value_sp->GetTargetSP());
348        if (target_sp)
349        {
350            Mutex::Locker api_locker (target_sp->GetAPIMutex());
351            cstr = value_sp->GetLocationAsCString();
352        }
353    }
354    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
355    if (log)
356    {
357        if (cstr)
358            log->Printf ("SBValue(%p)::GetSummary => \"%s\"", value_sp.get(), cstr);
359        else
360            log->Printf ("SBValue(%p)::GetSummary => NULL", value_sp.get());
361    }
362    return cstr;
363}
364
365bool
366SBValue::SetValueFromCString (const char *value_str)
367{
368    bool success = false;
369    lldb::ValueObjectSP value_sp(GetSP());
370    if (value_sp)
371    {
372        TargetSP target_sp(value_sp->GetTargetSP());
373        if (target_sp)
374        {
375            Mutex::Locker api_locker (target_sp->GetAPIMutex());
376            success = value_sp->SetValueFromCString (value_str);
377        }
378    }
379    return success;
380}
381
382lldb::SBTypeFormat
383SBValue::GetTypeFormat ()
384{
385    lldb::SBTypeFormat format;
386    lldb::ValueObjectSP value_sp(GetSP());
387    if (value_sp)
388    {
389        TargetSP target_sp(value_sp->GetTargetSP());
390        if (target_sp)
391        {
392            Mutex::Locker api_locker (target_sp->GetAPIMutex());
393            if (value_sp->UpdateValueIfNeeded(true))
394            {
395                lldb::TypeFormatImplSP format_sp = value_sp->GetValueFormat();
396                if (format_sp)
397                    format.SetSP(format_sp);
398            }
399        }
400    }
401    return format;
402}
403
404#ifndef LLDB_DISABLE_PYTHON
405lldb::SBTypeSummary
406SBValue::GetTypeSummary ()
407{
408    lldb::SBTypeSummary summary;
409    lldb::ValueObjectSP value_sp(GetSP());
410    if (value_sp)
411    {
412        TargetSP target_sp(value_sp->GetTargetSP());
413        if (target_sp)
414        {
415            Mutex::Locker api_locker (target_sp->GetAPIMutex());
416            if (value_sp->UpdateValueIfNeeded(true))
417            {
418                lldb::TypeSummaryImplSP summary_sp = value_sp->GetSummaryFormat();
419                if (summary_sp)
420                    summary.SetSP(summary_sp);
421            }
422        }
423    }
424    return summary;
425}
426#endif // LLDB_DISABLE_PYTHON
427
428lldb::SBTypeFilter
429SBValue::GetTypeFilter ()
430{
431    lldb::SBTypeFilter filter;
432    lldb::ValueObjectSP value_sp(GetSP());
433    if (value_sp)
434    {
435        TargetSP target_sp(value_sp->GetTargetSP());
436        if (target_sp)
437        {
438            Mutex::Locker api_locker (target_sp->GetAPIMutex());
439            if (value_sp->UpdateValueIfNeeded(true))
440            {
441                lldb::SyntheticChildrenSP synthetic_sp = value_sp->GetSyntheticChildren();
442
443                if (synthetic_sp && !synthetic_sp->IsScripted())
444                {
445                    TypeFilterImplSP filter_sp = std::tr1::static_pointer_cast<TypeFilterImpl>(synthetic_sp);
446                    filter.SetSP(filter_sp);
447                }
448            }
449        }
450    }
451    return filter;
452}
453
454#ifndef LLDB_DISABLE_PYTHON
455lldb::SBTypeSynthetic
456SBValue::GetTypeSynthetic ()
457{
458    lldb::SBTypeSynthetic synthetic;
459    lldb::ValueObjectSP value_sp(GetSP());
460    if (value_sp)
461    {
462        TargetSP target_sp(value_sp->GetTargetSP());
463        if (target_sp)
464        {
465            Mutex::Locker api_locker (target_sp->GetAPIMutex());
466            if (value_sp->UpdateValueIfNeeded(true))
467            {
468                lldb::SyntheticChildrenSP children_sp = value_sp->GetSyntheticChildren();
469
470                if (children_sp && children_sp->IsScripted())
471                {
472                    TypeSyntheticImplSP synth_sp = std::tr1::static_pointer_cast<TypeSyntheticImpl>(children_sp);
473                    synthetic.SetSP(synth_sp);
474                }
475            }
476        }
477    }
478    return synthetic;
479}
480#endif
481
482lldb::SBValue
483SBValue::CreateChildAtOffset (const char *name, uint32_t offset, SBType type)
484{
485    lldb::SBValue sb_value;
486    lldb::ValueObjectSP value_sp(GetSP());
487    lldb::ValueObjectSP new_value_sp;
488    if (value_sp)
489    {
490        TypeImplSP type_sp (type.GetSP());
491        if (type.IsValid())
492        {
493            sb_value = SBValue(value_sp->GetSyntheticChildAtOffset(offset, type_sp->GetClangASTType(), true));
494            new_value_sp = sb_value.GetSP();
495            if (new_value_sp)
496                new_value_sp->SetName(ConstString(name));
497        }
498    }
499    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
500    if (log)
501    {
502        if (new_value_sp)
503            log->Printf ("SBValue(%p)::GetChildAtOffset => \"%s\"", value_sp.get(), new_value_sp->GetName().AsCString());
504        else
505            log->Printf ("SBValue(%p)::GetChildAtOffset => NULL", value_sp.get());
506    }
507    return sb_value;
508}
509
510lldb::SBValue
511SBValue::Cast (SBType type)
512{
513    lldb::SBValue sb_value;
514    lldb::ValueObjectSP value_sp(GetSP());
515    TypeImplSP type_sp (type.GetSP());
516    if (value_sp && type_sp)
517        sb_value.SetSP(value_sp->Cast(type_sp->GetClangASTType()));
518    return sb_value;
519}
520
521lldb::SBValue
522SBValue::CreateValueFromExpression (const char *name, const char* expression)
523{
524    lldb::SBValue sb_value;
525    lldb::ValueObjectSP value_sp(GetSP());
526    lldb::ValueObjectSP new_value_sp;
527    if (value_sp)
528    {
529        ExecutionContext exe_ctx (value_sp->GetExecutionContextRef());
530        Target* target = exe_ctx.GetTargetPtr();
531        if (target)
532        {
533            target->EvaluateExpression (expression,
534                                        exe_ctx.GetFramePtr(),
535                                        eExecutionPolicyOnlyWhenNeeded,
536                                        false, // coerce to id
537                                        true, // unwind on error
538                                        true, // keep in memory
539                                        eNoDynamicValues,
540                                        new_value_sp);
541            if (new_value_sp)
542            {
543                new_value_sp->SetName(ConstString(name));
544                sb_value.SetSP(new_value_sp);
545            }
546        }
547    }
548    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
549    if (log)
550    {
551        if (new_value_sp)
552            log->Printf ("SBValue(%p)::GetChildFromExpression => \"%s\"", value_sp.get(), new_value_sp->GetName().AsCString());
553        else
554            log->Printf ("SBValue(%p)::GetChildFromExpression => NULL", value_sp.get());
555    }
556    return sb_value;
557}
558
559lldb::SBValue
560SBValue::CreateValueFromAddress(const char* name, lldb::addr_t address, SBType sb_type)
561{
562    lldb::SBValue sb_value;
563    lldb::ValueObjectSP value_sp(GetSP());
564    lldb::ValueObjectSP new_value_sp;
565    lldb::TypeImplSP type_impl_sp (sb_type.GetSP());
566    if (value_sp && type_impl_sp)
567    {
568        ClangASTType pointee_ast_type(type_impl_sp->GetASTContext(), type_impl_sp->GetClangASTType().GetPointerType ());
569        lldb::TypeImplSP pointee_type_impl_sp (new TypeImpl(pointee_ast_type));
570        if (pointee_type_impl_sp)
571        {
572
573            lldb::DataBufferSP buffer(new lldb_private::DataBufferHeap(&address,sizeof(lldb::addr_t)));
574
575            ExecutionContext exe_ctx (value_sp->GetExecutionContextRef());
576            ValueObjectSP ptr_result_valobj_sp(ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
577                                                                               pointee_type_impl_sp->GetASTContext(),
578                                                                               pointee_type_impl_sp->GetOpaqueQualType(),
579                                                                               ConstString(name),
580                                                                               buffer,
581                                                                               lldb::endian::InlHostByteOrder(),
582                                                                               exe_ctx.GetAddressByteSize()));
583
584            if (ptr_result_valobj_sp)
585            {
586                ptr_result_valobj_sp->GetValue().SetValueType(Value::eValueTypeLoadAddress);
587                Error err;
588                new_value_sp = ptr_result_valobj_sp->Dereference(err);
589                if (new_value_sp)
590                    new_value_sp->SetName(ConstString(name));
591            }
592            sb_value.SetSP(new_value_sp);
593        }
594    }
595    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
596    if (log)
597    {
598        if (new_value_sp)
599            log->Printf ("SBValue(%p)::CreateValueFromAddress => \"%s\"", value_sp.get(), new_value_sp->GetName().AsCString());
600        else
601            log->Printf ("SBValue(%p)::CreateValueFromAddress => NULL", value_sp.get());
602    }
603    return sb_value;
604}
605
606lldb::SBValue
607SBValue::CreateValueFromData (const char* name, SBData data, SBType type)
608{
609    lldb::SBValue sb_value;
610    lldb::ValueObjectSP new_value_sp;
611    lldb::ValueObjectSP value_sp(GetSP());
612    if (value_sp)
613    {
614        ExecutionContext exe_ctx (value_sp->GetExecutionContextRef());
615
616        new_value_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
617                                                       type.m_opaque_sp->GetASTContext() ,
618                                                       type.m_opaque_sp->GetOpaqueQualType(),
619                                                       ConstString(name),
620                                                       *data.m_opaque_sp,
621                                                       LLDB_INVALID_ADDRESS);
622        new_value_sp->SetAddressTypeOfChildren(eAddressTypeLoad);
623        sb_value.SetSP(new_value_sp);
624    }
625    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
626    if (log)
627    {
628        if (new_value_sp)
629            log->Printf ("SBValue(%p)::GetChildFromExpression => \"%s\"", value_sp.get(), new_value_sp->GetName().AsCString());
630        else
631            log->Printf ("SBValue(%p)::GetChildFromExpression => NULL", value_sp.get());
632    }
633    return sb_value;
634}
635
636SBValue
637SBValue::GetChildAtIndex (uint32_t idx)
638{
639    const bool can_create_synthetic = false;
640    lldb::DynamicValueType use_dynamic = eNoDynamicValues;
641    lldb::ValueObjectSP value_sp(GetSP());
642    if (value_sp)
643    {
644        TargetSP target_sp(value_sp->GetTargetSP());
645        if (target_sp)
646            use_dynamic = target_sp->GetPreferDynamicValue();
647    }
648    return GetChildAtIndex (idx, use_dynamic, can_create_synthetic);
649}
650
651SBValue
652SBValue::GetChildAtIndex (uint32_t idx, lldb::DynamicValueType use_dynamic, bool can_create_synthetic)
653{
654    lldb::ValueObjectSP child_sp;
655
656    lldb::ValueObjectSP value_sp(GetSP());
657    if (value_sp)
658    {
659        TargetSP target_sp(value_sp->GetTargetSP());
660        if (target_sp)
661        {
662            Mutex::Locker api_locker (target_sp->GetAPIMutex());
663            const bool can_create = true;
664            child_sp = value_sp->GetChildAtIndex (idx, can_create);
665            if (can_create_synthetic && !child_sp)
666            {
667                if (value_sp->IsPointerType())
668                {
669                    child_sp = value_sp->GetSyntheticArrayMemberFromPointer(idx, can_create);
670                }
671                else if (value_sp->IsArrayType())
672                {
673                    child_sp = value_sp->GetSyntheticArrayMemberFromArray(idx, can_create);
674                }
675            }
676
677            if (child_sp)
678            {
679                if (use_dynamic != lldb::eNoDynamicValues)
680                {
681                    lldb::ValueObjectSP dynamic_sp(child_sp->GetDynamicValue (use_dynamic));
682                    if (dynamic_sp)
683                        child_sp = dynamic_sp;
684                }
685            }
686        }
687    }
688
689    SBValue sb_value (child_sp);
690    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
691    if (log)
692        log->Printf ("SBValue(%p)::GetChildAtIndex (%u) => SBValue(%p)", value_sp.get(), idx, value_sp.get());
693
694    return sb_value;
695}
696
697uint32_t
698SBValue::GetIndexOfChildWithName (const char *name)
699{
700    uint32_t idx = UINT32_MAX;
701    lldb::ValueObjectSP value_sp(GetSP());
702    if (value_sp)
703    {
704        TargetSP target_sp(value_sp->GetTargetSP());
705        if (target_sp)
706        {
707            Mutex::Locker api_locker (target_sp->GetAPIMutex());
708
709            idx = value_sp->GetIndexOfChildWithName (ConstString(name));
710        }
711    }
712    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
713    if (log)
714    {
715        if (idx == UINT32_MAX)
716            log->Printf ("SBValue(%p)::GetIndexOfChildWithName (name=\"%s\") => NOT FOUND", value_sp.get(), name);
717        else
718            log->Printf ("SBValue(%p)::GetIndexOfChildWithName (name=\"%s\") => %u", value_sp.get(), name, idx);
719    }
720    return idx;
721}
722
723SBValue
724SBValue::GetChildMemberWithName (const char *name)
725{
726    lldb::ValueObjectSP value_sp(GetSP());
727    if (value_sp)
728    {
729        lldb::DynamicValueType use_dynamic_value = eNoDynamicValues;
730        TargetSP target_sp(value_sp->GetTargetSP());
731        if (target_sp)
732        {
733            Mutex::Locker api_locker (target_sp->GetAPIMutex());
734            use_dynamic_value = target_sp->GetPreferDynamicValue();
735        }
736        return GetChildMemberWithName (name, use_dynamic_value);
737    }
738    return SBValue();
739}
740
741SBValue
742SBValue::GetChildMemberWithName (const char *name, lldb::DynamicValueType use_dynamic_value)
743{
744    lldb::ValueObjectSP child_sp;
745    const ConstString str_name (name);
746
747
748    lldb::ValueObjectSP value_sp(GetSP());
749    if (value_sp)
750    {
751        TargetSP target_sp(value_sp->GetTargetSP());
752        if (target_sp)
753        {
754            Mutex::Locker api_locker (target_sp->GetAPIMutex());
755            child_sp = value_sp->GetChildMemberWithName (str_name, true);
756            if (use_dynamic_value != lldb::eNoDynamicValues)
757            {
758                if (child_sp)
759                {
760                    lldb::ValueObjectSP dynamic_sp = child_sp->GetDynamicValue (use_dynamic_value);
761                    if (dynamic_sp)
762                        child_sp = dynamic_sp;
763                }
764            }
765        }
766    }
767
768    SBValue sb_value (child_sp);
769
770    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
771    if (log)
772        log->Printf ("SBValue(%p)::GetChildMemberWithName (name=\"%s\") => SBValue(%p)", value_sp.get(), name, value_sp.get());
773
774    return sb_value;
775}
776
777lldb::SBValue
778SBValue::GetDynamicValue (lldb::DynamicValueType use_dynamic)
779{
780    lldb::ValueObjectSP value_sp(GetSP());
781    if (value_sp)
782    {
783        TargetSP target_sp(value_sp->GetTargetSP());
784        if (target_sp)
785        {
786            Mutex::Locker api_locker (target_sp->GetAPIMutex());
787            return SBValue (value_sp->GetDynamicValue(use_dynamic));
788        }
789    }
790
791    return SBValue();
792}
793
794lldb::SBValue
795SBValue::GetStaticValue ()
796{
797    lldb::ValueObjectSP value_sp(GetSP());
798    if (value_sp)
799    {
800        TargetSP target_sp(value_sp->GetTargetSP());
801        if (target_sp)
802        {
803            Mutex::Locker api_locker (target_sp->GetAPIMutex());
804            return SBValue(value_sp->GetStaticValue());
805        }
806    }
807
808    return SBValue();
809}
810
811bool
812SBValue::IsDynamic()
813{
814    lldb::ValueObjectSP value_sp(GetSP());
815    if (value_sp)
816    {
817        TargetSP target_sp(value_sp->GetTargetSP());
818        if (target_sp)
819        {
820            Mutex::Locker api_locker (target_sp->GetAPIMutex());
821            return value_sp->IsDynamic();
822        }
823    }
824    return false;
825}
826
827lldb::SBValue
828SBValue::GetValueForExpressionPath(const char* expr_path)
829{
830    lldb::ValueObjectSP child_sp;
831    lldb::ValueObjectSP value_sp(GetSP());
832    if (value_sp)
833    {
834        TargetSP target_sp(value_sp->GetTargetSP());
835        if (target_sp)
836        {
837            Mutex::Locker api_locker (target_sp->GetAPIMutex());
838            // using default values for all the fancy options, just do it if you can
839            child_sp = value_sp->GetValueForExpressionPath(expr_path);
840        }
841    }
842
843    SBValue sb_value (child_sp);
844
845    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
846    if (log)
847        log->Printf ("SBValue(%p)::GetValueForExpressionPath (expr_path=\"%s\") => SBValue(%p)", value_sp.get(), expr_path, value_sp.get());
848
849    return sb_value;
850}
851
852int64_t
853SBValue::GetValueAsSigned(SBError& error, int64_t fail_value)
854{
855    error.Clear();
856    lldb::ValueObjectSP value_sp(GetSP());
857    if (value_sp)
858    {
859        TargetSP target_sp(value_sp->GetTargetSP());
860        if (target_sp)
861        {
862            Mutex::Locker api_locker (target_sp->GetAPIMutex());
863            Scalar scalar;
864            if (value_sp->ResolveValue (scalar))
865                return scalar.GetRawBits64(fail_value);
866            else
867                error.SetErrorString("could not get value");
868        }
869        else
870            error.SetErrorString("could not get target");
871    }
872    error.SetErrorString("invalid SBValue");
873    return fail_value;
874}
875
876uint64_t
877SBValue::GetValueAsUnsigned(SBError& error, uint64_t fail_value)
878{
879    error.Clear();
880    lldb::ValueObjectSP value_sp(GetSP());
881    if (value_sp)
882    {
883        TargetSP target_sp(value_sp->GetTargetSP());
884        if (target_sp)
885        {
886            Mutex::Locker api_locker (target_sp->GetAPIMutex());
887            Scalar scalar;
888            if (value_sp->ResolveValue (scalar))
889                return scalar.GetRawBits64(fail_value);
890            else
891                error.SetErrorString("could not get value");
892        }
893        else
894            error.SetErrorString("could not get target");
895    }
896    error.SetErrorString("invalid SBValue");
897    return fail_value;
898}
899
900int64_t
901SBValue::GetValueAsSigned(int64_t fail_value)
902{
903    lldb::ValueObjectSP value_sp(GetSP());
904    if (value_sp)
905    {
906        TargetSP target_sp(value_sp->GetTargetSP());
907        if (target_sp)
908        {
909            Mutex::Locker api_locker (target_sp->GetAPIMutex());
910            Scalar scalar;
911            if (value_sp->ResolveValue (scalar))
912                return scalar.GetRawBits64(fail_value);
913        }
914    }
915    return fail_value;
916}
917
918uint64_t
919SBValue::GetValueAsUnsigned(uint64_t fail_value)
920{
921    lldb::ValueObjectSP value_sp(GetSP());
922    if (value_sp)
923    {
924        TargetSP target_sp(value_sp->GetTargetSP());
925        if (target_sp)
926        {
927            Mutex::Locker api_locker (target_sp->GetAPIMutex());
928            Scalar scalar;
929            if (value_sp->ResolveValue (scalar))
930                return scalar.GetRawBits64(fail_value);
931        }
932    }
933    return fail_value;
934}
935
936uint32_t
937SBValue::GetNumChildren ()
938{
939    uint32_t num_children = 0;
940
941    lldb::ValueObjectSP value_sp(GetSP());
942    if (value_sp)
943    {
944        TargetSP target_sp(value_sp->GetTargetSP());
945        if (target_sp)
946        {
947            Mutex::Locker api_locker (target_sp->GetAPIMutex());
948
949            num_children = value_sp->GetNumChildren();
950        }
951    }
952
953    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
954    if (log)
955        log->Printf ("SBValue(%p)::GetNumChildren () => %u", value_sp.get(), num_children);
956
957    return num_children;
958}
959
960
961SBValue
962SBValue::Dereference ()
963{
964    SBValue sb_value;
965    lldb::ValueObjectSP value_sp(GetSP());
966    if (value_sp)
967    {
968        TargetSP target_sp(value_sp->GetTargetSP());
969        if (target_sp)
970        {
971            Mutex::Locker api_locker (target_sp->GetAPIMutex());
972
973            Error error;
974            sb_value = value_sp->Dereference (error);
975        }
976    }
977    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
978    if (log)
979        log->Printf ("SBValue(%p)::Dereference () => SBValue(%p)", value_sp.get(), value_sp.get());
980
981    return sb_value;
982}
983
984bool
985SBValue::TypeIsPointerType ()
986{
987    bool is_ptr_type = false;
988
989    lldb::ValueObjectSP value_sp(GetSP());
990    if (value_sp)
991    {
992        TargetSP target_sp(value_sp->GetTargetSP());
993        if (target_sp)
994        {
995            Mutex::Locker api_locker (target_sp->GetAPIMutex());
996
997            is_ptr_type = value_sp->IsPointerType();
998        }
999    }
1000
1001    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1002    if (log)
1003        log->Printf ("SBValue(%p)::TypeIsPointerType () => %i", value_sp.get(), is_ptr_type);
1004
1005
1006    return is_ptr_type;
1007}
1008
1009void *
1010SBValue::GetOpaqueType()
1011{
1012    lldb::ValueObjectSP value_sp(GetSP());
1013    if (value_sp)
1014    {
1015        TargetSP target_sp(value_sp->GetTargetSP());
1016        if (target_sp)
1017        {
1018            Mutex::Locker api_locker (target_sp->GetAPIMutex());
1019
1020            return value_sp->GetClangType();
1021        }
1022    }
1023    return NULL;
1024}
1025
1026lldb::SBTarget
1027SBValue::GetTarget()
1028{
1029    SBTarget sb_target;
1030    TargetSP target_sp;
1031    lldb::ValueObjectSP value_sp(GetSP());
1032    if (value_sp)
1033    {
1034        target_sp = value_sp->GetTargetSP();
1035        sb_target.SetSP (target_sp);
1036    }
1037    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1038    if (log)
1039    {
1040        if (target_sp.get() == NULL)
1041            log->Printf ("SBValue(%p)::GetTarget () => NULL", value_sp.get());
1042        else
1043            log->Printf ("SBValue(%p)::GetTarget () => %p", value_sp.get(), target_sp.get());
1044    }
1045    return sb_target;
1046}
1047
1048lldb::SBProcess
1049SBValue::GetProcess()
1050{
1051    SBProcess sb_process;
1052    ProcessSP process_sp;
1053    lldb::ValueObjectSP value_sp(GetSP());
1054    if (value_sp)
1055    {
1056        process_sp = value_sp->GetProcessSP();
1057        if (process_sp)
1058            sb_process.SetSP (process_sp);
1059    }
1060    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1061    if (log)
1062    {
1063        if (process_sp.get() == NULL)
1064            log->Printf ("SBValue(%p)::GetProcess () => NULL", value_sp.get());
1065        else
1066            log->Printf ("SBValue(%p)::GetProcess () => %p", value_sp.get(), process_sp.get());
1067    }
1068    return sb_process;
1069}
1070
1071lldb::SBThread
1072SBValue::GetThread()
1073{
1074    SBThread sb_thread;
1075    ThreadSP thread_sp;
1076    lldb::ValueObjectSP value_sp(GetSP());
1077    if (value_sp)
1078    {
1079        thread_sp = value_sp->GetThreadSP();
1080        sb_thread.SetThread(thread_sp);
1081    }
1082    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1083    if (log)
1084    {
1085        if (thread_sp.get() == NULL)
1086            log->Printf ("SBValue(%p)::GetThread () => NULL", value_sp.get());
1087        else
1088            log->Printf ("SBValue(%p)::GetThread () => %p", value_sp.get(), thread_sp.get());
1089    }
1090    return sb_thread;
1091}
1092
1093lldb::SBFrame
1094SBValue::GetFrame()
1095{
1096    SBFrame sb_frame;
1097    StackFrameSP frame_sp;
1098    lldb::ValueObjectSP value_sp(GetSP());
1099    if (value_sp)
1100    {
1101        frame_sp = value_sp->GetFrameSP();
1102        sb_frame.SetFrameSP (frame_sp);
1103    }
1104    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1105    if (log)
1106    {
1107        if (frame_sp.get() == NULL)
1108            log->Printf ("SBValue(%p)::GetFrame () => NULL", value_sp.get());
1109        else
1110            log->Printf ("SBValue(%p)::GetFrame () => %p", value_sp.get(), frame_sp.get());
1111    }
1112    return sb_frame;
1113}
1114
1115
1116lldb::ValueObjectSP
1117SBValue::GetSP () const
1118{
1119    return m_opaque_sp;
1120}
1121
1122void
1123SBValue::SetSP (const lldb::ValueObjectSP &sp)
1124{
1125    m_opaque_sp = sp;
1126}
1127
1128
1129bool
1130SBValue::GetExpressionPath (SBStream &description)
1131{
1132    lldb::ValueObjectSP value_sp(GetSP());
1133    if (value_sp)
1134    {
1135        value_sp->GetExpressionPath (description.ref(), false);
1136        return true;
1137    }
1138    return false;
1139}
1140
1141bool
1142SBValue::GetExpressionPath (SBStream &description, bool qualify_cxx_base_classes)
1143{
1144    lldb::ValueObjectSP value_sp(GetSP());
1145    if (value_sp)
1146    {
1147        value_sp->GetExpressionPath (description.ref(), qualify_cxx_base_classes);
1148        return true;
1149    }
1150    return false;
1151}
1152
1153bool
1154SBValue::GetDescription (SBStream &description)
1155{
1156    Stream &strm = description.ref();
1157
1158    lldb::ValueObjectSP value_sp(GetSP());
1159    if (value_sp)
1160    {
1161        ValueObject::DumpValueObject (strm, value_sp.get());
1162    }
1163    else
1164        strm.PutCString ("No value");
1165
1166    return true;
1167}
1168
1169lldb::Format
1170SBValue::GetFormat ()
1171{
1172    lldb::ValueObjectSP value_sp(GetSP());
1173    if (value_sp)
1174        return value_sp->GetFormat();
1175    return eFormatDefault;
1176}
1177
1178void
1179SBValue::SetFormat (lldb::Format format)
1180{
1181    lldb::ValueObjectSP value_sp(GetSP());
1182    if (value_sp)
1183        value_sp->SetFormat(format);
1184}
1185
1186lldb::SBValue
1187SBValue::AddressOf()
1188{
1189    SBValue sb_value;
1190    lldb::ValueObjectSP value_sp(GetSP());
1191    if (value_sp)
1192    {
1193        TargetSP target_sp (value_sp->GetTargetSP());
1194        if (target_sp)
1195        {
1196            Mutex::Locker api_locker (target_sp->GetAPIMutex());
1197            Error error;
1198            sb_value = value_sp->AddressOf (error);
1199        }
1200    }
1201    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1202    if (log)
1203        log->Printf ("SBValue(%p)::GetPointerToObject () => SBValue(%p)", value_sp.get(), value_sp.get());
1204
1205    return sb_value;
1206}
1207
1208lldb::addr_t
1209SBValue::GetLoadAddress()
1210{
1211    lldb::addr_t value = LLDB_INVALID_ADDRESS;
1212    lldb::ValueObjectSP value_sp(GetSP());
1213    if (value_sp)
1214    {
1215        TargetSP target_sp (value_sp->GetTargetSP());
1216        if (target_sp)
1217        {
1218            Mutex::Locker api_locker (target_sp->GetAPIMutex());
1219            const bool scalar_is_load_address = true;
1220            AddressType addr_type;
1221            value = value_sp->GetAddressOf(scalar_is_load_address, &addr_type);
1222            if (addr_type == eAddressTypeFile)
1223            {
1224                Module* module = value_sp->GetModule();
1225                if (!module)
1226                    value = LLDB_INVALID_ADDRESS;
1227                else
1228                {
1229                    Address addr;
1230                    module->ResolveFileAddress(value, addr);
1231                    value = addr.GetLoadAddress(target_sp.get());
1232                }
1233            }
1234            else if (addr_type == eAddressTypeHost || addr_type == eAddressTypeInvalid)
1235                value = LLDB_INVALID_ADDRESS;
1236        }
1237    }
1238    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1239    if (log)
1240        log->Printf ("SBValue(%p)::GetLoadAddress () => (%llu)", value_sp.get(), value);
1241
1242    return value;
1243}
1244
1245lldb::SBAddress
1246SBValue::GetAddress()
1247{
1248    Address addr;
1249    lldb::ValueObjectSP value_sp(GetSP());
1250    if (value_sp)
1251    {
1252        TargetSP target_sp (value_sp->GetTargetSP());
1253        if (target_sp)
1254        {
1255            lldb::addr_t value = LLDB_INVALID_ADDRESS;
1256            Mutex::Locker api_locker (target_sp->GetAPIMutex());
1257            const bool scalar_is_load_address = true;
1258            AddressType addr_type;
1259            value = value_sp->GetAddressOf(scalar_is_load_address, &addr_type);
1260            if (addr_type == eAddressTypeFile)
1261            {
1262                Module* module = value_sp->GetModule();
1263                if (module)
1264                    module->ResolveFileAddress(value, addr);
1265            }
1266            else if (addr_type == eAddressTypeLoad)
1267            {
1268                // no need to check the return value on this.. if it can actually do the resolve
1269                // addr will be in the form (section,offset), otherwise it will simply be returned
1270                // as (NULL, value)
1271                addr.SetLoadAddress(value, target_sp.get());
1272            }
1273        }
1274    }
1275    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1276    if (log)
1277        log->Printf ("SBValue(%p)::GetAddress () => (%s,%llu)", value_sp.get(), (addr.GetSection() ? addr.GetSection()->GetName().GetCString() : "NULL"), addr.GetOffset());
1278    return SBAddress(new Address(addr));
1279}
1280
1281lldb::SBData
1282SBValue::GetPointeeData (uint32_t item_idx,
1283                         uint32_t item_count)
1284{
1285    lldb::SBData sb_data;
1286    lldb::ValueObjectSP value_sp(GetSP());
1287    if (value_sp)
1288    {
1289        TargetSP target_sp (value_sp->GetTargetSP());
1290        if (target_sp)
1291        {
1292			DataExtractorSP data_sp(new DataExtractor());
1293            Mutex::Locker api_locker (target_sp->GetAPIMutex());
1294            value_sp->GetPointeeData(*data_sp, item_idx, item_count);
1295            if (data_sp->GetByteSize() > 0)
1296                *sb_data = data_sp;
1297        }
1298    }
1299    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1300    if (log)
1301        log->Printf ("SBValue(%p)::GetPointeeData (%d, %d) => SBData(%p)",
1302                     value_sp.get(),
1303                     item_idx,
1304                     item_count,
1305                     sb_data.get());
1306
1307    return sb_data;
1308}
1309
1310lldb::SBData
1311SBValue::GetData ()
1312{
1313    lldb::SBData sb_data;
1314    lldb::ValueObjectSP value_sp(GetSP());
1315    if (value_sp)
1316    {
1317        TargetSP target_sp (value_sp->GetTargetSP());
1318        if (target_sp)
1319        {
1320            Mutex::Locker api_locker (target_sp->GetAPIMutex());
1321			DataExtractorSP data_sp(new DataExtractor());
1322            value_sp->GetData(*data_sp);
1323            if (data_sp->GetByteSize() > 0)
1324                *sb_data = data_sp;
1325        }
1326    }
1327    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1328    if (log)
1329        log->Printf ("SBValue(%p)::GetData () => SBData(%p)",
1330                     value_sp.get(),
1331                     sb_data.get());
1332
1333    return sb_data;
1334}
1335
1336lldb::SBWatchpoint
1337SBValue::Watch (bool resolve_location, bool read, bool write)
1338{
1339    SBWatchpoint sb_watchpoint;
1340
1341    // If the SBValue is not valid, there's no point in even trying to watch it.
1342    lldb::ValueObjectSP value_sp(GetSP());
1343    TargetSP target_sp (GetTarget().GetSP());
1344    if (value_sp && target_sp)
1345    {
1346        // Read and Write cannot both be false.
1347        if (!read && !write)
1348            return sb_watchpoint;
1349
1350        // If the value is not in scope, don't try and watch and invalid value
1351        if (!IsInScope())
1352            return sb_watchpoint;
1353
1354        addr_t addr = GetLoadAddress();
1355        if (addr == LLDB_INVALID_ADDRESS)
1356            return sb_watchpoint;
1357        size_t byte_size = GetByteSize();
1358        if (byte_size == 0)
1359            return sb_watchpoint;
1360
1361        uint32_t watch_type = 0;
1362        if (read)
1363            watch_type |= LLDB_WATCH_TYPE_READ;
1364        if (write)
1365            watch_type |= LLDB_WATCH_TYPE_WRITE;
1366
1367        WatchpointSP watchpoint_sp = target_sp->CreateWatchpoint(addr, byte_size, watch_type);
1368
1369        if (watchpoint_sp)
1370        {
1371            sb_watchpoint.SetSP (watchpoint_sp);
1372            Declaration decl;
1373            if (value_sp->GetDeclaration (decl))
1374            {
1375                if (decl.GetFile())
1376                {
1377                    StreamString ss;
1378                    // True to show fullpath for declaration file.
1379                    decl.DumpStopContext(&ss, true);
1380                    watchpoint_sp->SetDeclInfo(ss.GetString());
1381                }
1382            }
1383        }
1384    }
1385    return sb_watchpoint;
1386}
1387
1388lldb::SBWatchpoint
1389SBValue::WatchPointee (bool resolve_location, bool read, bool write)
1390{
1391    SBWatchpoint sb_watchpoint;
1392    if (IsInScope() && GetType().IsPointerType())
1393        sb_watchpoint = Dereference().Watch (resolve_location, read, write);
1394    return sb_watchpoint;
1395}
1396
1397