blob: fb66cb7991355ee158669ce32fd18b77fcd26d32 [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- 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
Eli Friedman7a62c8b2010-06-09 07:44:37 +000010#include "lldb/API/SBValue.h"
Enrico Granatad760907c2012-02-17 03:18:30 +000011
Enrico Granata49306142012-10-10 22:54:17 +000012#include "lldb/API/SBDeclaration.h"
Caroline Tice98f930f2010-09-20 05:20:02 +000013#include "lldb/API/SBStream.h"
Enrico Granatad760907c2012-02-17 03:18:30 +000014#include "lldb/API/SBTypeFilter.h"
15#include "lldb/API/SBTypeFormat.h"
16#include "lldb/API/SBTypeSummary.h"
17#include "lldb/API/SBTypeSynthetic.h"
Chris Lattner24943d22010-06-08 16:52:24 +000018
Johnny Chenecd4feb2011-10-14 00:42:25 +000019#include "lldb/Breakpoint/Watchpoint.h"
Chris Lattner24943d22010-06-08 16:52:24 +000020#include "lldb/Core/DataExtractor.h"
Enrico Granatad760907c2012-02-17 03:18:30 +000021#include "lldb/Core/DataVisualization.h"
Caroline Tice7826c882010-10-26 03:11:13 +000022#include "lldb/Core/Log.h"
Chris Lattner24943d22010-06-08 16:52:24 +000023#include "lldb/Core/Module.h"
Greg Clayton0fb0bcc2011-08-03 22:57:10 +000024#include "lldb/Core/Scalar.h"
Greg Clayton49ce8962012-08-29 21:13:06 +000025#include "lldb/Core/Section.h"
Chris Lattner24943d22010-06-08 16:52:24 +000026#include "lldb/Core/Stream.h"
27#include "lldb/Core/StreamFile.h"
28#include "lldb/Core/Value.h"
29#include "lldb/Core/ValueObject.h"
Enrico Granata979e20d2011-07-29 19:53:35 +000030#include "lldb/Core/ValueObjectConstResult.h"
Chris Lattner24943d22010-06-08 16:52:24 +000031#include "lldb/Symbol/Block.h"
Enrico Granata49306142012-10-10 22:54:17 +000032#include "lldb/Symbol/Declaration.h"
Chris Lattner24943d22010-06-08 16:52:24 +000033#include "lldb/Symbol/ObjectFile.h"
Greg Clayton0a19a1b2012-02-04 02:27:34 +000034#include "lldb/Symbol/Type.h"
Chris Lattner24943d22010-06-08 16:52:24 +000035#include "lldb/Symbol/Variable.h"
Johnny Chenecd4feb2011-10-14 00:42:25 +000036#include "lldb/Symbol/VariableList.h"
Chris Lattner24943d22010-06-08 16:52:24 +000037#include "lldb/Target/ExecutionContext.h"
38#include "lldb/Target/Process.h"
39#include "lldb/Target/StackFrame.h"
Greg Claytonbdcda462010-12-20 20:49:23 +000040#include "lldb/Target/Target.h"
Chris Lattner24943d22010-06-08 16:52:24 +000041#include "lldb/Target/Thread.h"
42
Jim Ingham47beabb2012-10-16 21:41:58 +000043#include "lldb/API/SBDebugger.h"
44#include "lldb/API/SBExpressionOptions.h"
45#include "lldb/API/SBFrame.h"
Eli Friedman7a62c8b2010-06-09 07:44:37 +000046#include "lldb/API/SBProcess.h"
47#include "lldb/API/SBTarget.h"
48#include "lldb/API/SBThread.h"
Chris Lattner24943d22010-06-08 16:52:24 +000049
50using namespace lldb;
51using namespace lldb_private;
52
Enrico Granata3d656c72012-10-22 18:18:36 +000053namespace {
54 class ValueImpl
55 {
56 public:
57 ValueImpl ()
58 {
59 }
60
61 ValueImpl (lldb::ValueObjectSP opaque_sp,
62 lldb::DynamicValueType use_dynamic,
63 bool use_synthetic) :
64 m_opaque_sp(opaque_sp),
65 m_use_dynamic(use_dynamic),
66 m_use_synthetic(use_synthetic)
67 {
68 }
69
70 ValueImpl (const ValueImpl& rhs) :
71 m_opaque_sp(rhs.m_opaque_sp),
72 m_use_dynamic(rhs.m_use_dynamic),
73 m_use_synthetic(rhs.m_use_synthetic)
74 {
75 }
76
77 ValueImpl &
78 operator = (const ValueImpl &rhs)
79 {
80 if (this != &rhs)
81 {
82 m_opaque_sp = rhs.m_opaque_sp;
83 m_use_dynamic = rhs.m_use_dynamic;
84 m_use_synthetic = rhs.m_use_synthetic;
85 }
86 return *this;
87 }
88
89 bool
90 IsValid ()
91 {
92 return m_opaque_sp.get() != NULL;
93 }
94
95 lldb::ValueObjectSP
96 GetRootSP ()
97 {
98 return m_opaque_sp;
99 }
100
101 lldb::ValueObjectSP
102 GetSP ()
103 {
104 if (!m_opaque_sp)
105 return m_opaque_sp;
106 lldb::ValueObjectSP value_sp = m_opaque_sp;
107 if (value_sp->GetDynamicValue(m_use_dynamic))
108 value_sp = value_sp->GetDynamicValue(m_use_dynamic);
109 if (value_sp->GetSyntheticValue(m_use_synthetic))
110 value_sp = value_sp->GetSyntheticValue(m_use_synthetic);
111 return value_sp;
112 }
113
114 void
115 SetUseDynamic (lldb::DynamicValueType use_dynamic)
116 {
117 m_use_dynamic = use_dynamic;
118 }
119
120 void
121 SetUseSynthetic (bool use_synthetic)
122 {
123 m_use_synthetic = use_synthetic;
124 }
125
126 lldb::DynamicValueType
127 GetUseDynamic ()
128 {
129 return m_use_dynamic;
130 }
131
132 bool
133 GetUseSynthetic ()
134 {
135 return m_use_synthetic;
136 }
137
138 private:
139 lldb::ValueObjectSP m_opaque_sp;
140 lldb::DynamicValueType m_use_dynamic;
141 bool m_use_synthetic;
142 };
143}
144
Chris Lattner24943d22010-06-08 16:52:24 +0000145SBValue::SBValue () :
Greg Clayton63094e02010-06-23 01:19:29 +0000146 m_opaque_sp ()
Chris Lattner24943d22010-06-08 16:52:24 +0000147{
148}
149
Enrico Granatadba1de82012-03-27 02:35:13 +0000150SBValue::SBValue (const lldb::ValueObjectSP &value_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000151{
Enrico Granata3d656c72012-10-22 18:18:36 +0000152 SetSP(value_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000153}
154
Enrico Granatadba1de82012-03-27 02:35:13 +0000155SBValue::SBValue(const SBValue &rhs)
Greg Clayton538eb822010-11-05 23:17:00 +0000156{
Enrico Granata3d656c72012-10-22 18:18:36 +0000157 SetSP(rhs.m_opaque_sp);
Greg Clayton538eb822010-11-05 23:17:00 +0000158}
159
Greg Claytond68e0892011-09-09 23:04:00 +0000160SBValue &
Greg Clayton538eb822010-11-05 23:17:00 +0000161SBValue::operator = (const SBValue &rhs)
162{
163 if (this != &rhs)
Enrico Granatadba1de82012-03-27 02:35:13 +0000164 {
Enrico Granata3d656c72012-10-22 18:18:36 +0000165 SetSP(rhs.m_opaque_sp);
Enrico Granatadba1de82012-03-27 02:35:13 +0000166 }
Greg Clayton538eb822010-11-05 23:17:00 +0000167 return *this;
168}
169
Chris Lattner24943d22010-06-08 16:52:24 +0000170SBValue::~SBValue()
171{
172}
173
174bool
Greg Claytond68e0892011-09-09 23:04:00 +0000175SBValue::IsValid ()
Chris Lattner24943d22010-06-08 16:52:24 +0000176{
Greg Clayton49ce6822010-10-31 03:01:06 +0000177 // If this function ever changes to anything that does more than just
178 // check if the opaque shared pointer is non NULL, then we need to update
179 // all "if (m_opaque_sp)" code in this file.
Enrico Granata3d656c72012-10-22 18:18:36 +0000180 return m_opaque_sp.get() != NULL && m_opaque_sp->GetRootSP().get() != NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000181}
182
Jim Inghame0bd5712011-12-19 20:39:44 +0000183void
184SBValue::Clear()
185{
186 m_opaque_sp.reset();
187}
188
Greg Claytonc5f728c2010-10-06 22:10:17 +0000189SBError
190SBValue::GetError()
191{
192 SBError sb_error;
193
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000194 lldb::ValueObjectSP value_sp(GetSP());
195 if (value_sp)
196 sb_error.SetError(value_sp->GetError());
Greg Clayton334d33a2012-01-30 07:41:31 +0000197 else
198 sb_error.SetErrorString("error: invalid value");
Greg Claytonc5f728c2010-10-06 22:10:17 +0000199
200 return sb_error;
201}
202
Johnny Chen968958c2011-07-07 20:46:23 +0000203user_id_t
204SBValue::GetID()
205{
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000206 lldb::ValueObjectSP value_sp(GetSP());
207 if (value_sp)
208 return value_sp->GetID();
Johnny Chen968958c2011-07-07 20:46:23 +0000209 return LLDB_INVALID_UID;
210}
211
Chris Lattner24943d22010-06-08 16:52:24 +0000212const char *
213SBValue::GetName()
214{
Greg Clayton49ce6822010-10-31 03:01:06 +0000215
216 const char *name = NULL;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000217 lldb::ValueObjectSP value_sp(GetSP());
218 if (value_sp)
219 name = value_sp->GetName().GetCString();
Greg Clayton49ce6822010-10-31 03:01:06 +0000220
Greg Claytone005f2c2010-11-06 01:53:30 +0000221 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000222 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000223 {
224 if (name)
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000225 log->Printf ("SBValue(%p)::GetName () => \"%s\"", value_sp.get(), name);
Greg Clayton49ce6822010-10-31 03:01:06 +0000226 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000227 log->Printf ("SBValue(%p)::GetName () => NULL", value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +0000228 }
Caroline Tice7826c882010-10-26 03:11:13 +0000229
Greg Clayton49ce6822010-10-31 03:01:06 +0000230 return name;
Chris Lattner24943d22010-06-08 16:52:24 +0000231}
232
233const char *
234SBValue::GetTypeName ()
235{
Jim Ingham684d4012012-08-21 01:46:35 +0000236 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000237 const char *name = NULL;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000238 lldb::ValueObjectSP value_sp(GetSP());
239 if (value_sp)
Jim Ingham684d4012012-08-21 01:46:35 +0000240 {
241 // For a dynamic type we might have to run code to determine the type we are going to report,
242 // and we might not have updated the type before we get asked this. So make sure to get the API lock.
243
244 ProcessSP process_sp(value_sp->GetProcessSP());
245 Process::StopLocker stop_locker;
246 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
247 {
248 if (log)
249 log->Printf ("SBValue(%p)::GetTypeName() => error: process is running", value_sp.get());
250 }
251 else
252 {
253 TargetSP target_sp(value_sp->GetTargetSP());
254 if (target_sp)
255 {
256 Mutex::Locker api_locker (target_sp->GetAPIMutex());
257 name = value_sp->GetQualifiedTypeName().GetCString();
258 }
259 }
260 }
261
Greg Clayton49ce6822010-10-31 03:01:06 +0000262 if (log)
263 {
264 if (name)
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000265 log->Printf ("SBValue(%p)::GetTypeName () => \"%s\"", value_sp.get(), name);
Greg Clayton49ce6822010-10-31 03:01:06 +0000266 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000267 log->Printf ("SBValue(%p)::GetTypeName () => NULL", value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +0000268 }
269
270 return name;
Chris Lattner24943d22010-06-08 16:52:24 +0000271}
272
273size_t
274SBValue::GetByteSize ()
275{
Jim Ingham684d4012012-08-21 01:46:35 +0000276 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Chris Lattner24943d22010-06-08 16:52:24 +0000277 size_t result = 0;
278
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000279 lldb::ValueObjectSP value_sp(GetSP());
280 if (value_sp)
Jim Ingham684d4012012-08-21 01:46:35 +0000281 {
282 // For a dynamic type we might have to run code to determine the type we are going to report,
283 // and we might not have updated the type before we get asked this. So make sure to get the API lock.
284
285 ProcessSP process_sp(value_sp->GetProcessSP());
286 Process::StopLocker stop_locker;
287 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
288 {
289 if (log)
290 log->Printf ("SBValue(%p)::GetTypeName() => error: process is running", value_sp.get());
291 }
292 else
293 {
294 TargetSP target_sp(value_sp->GetTargetSP());
295 if (target_sp)
296 {
297 Mutex::Locker api_locker (target_sp->GetAPIMutex());
298 result = value_sp->GetByteSize();
299 }
300 }
301 }
Chris Lattner24943d22010-06-08 16:52:24 +0000302
Greg Clayton49ce6822010-10-31 03:01:06 +0000303 if (log)
Greg Clayton851e30e2012-09-18 18:04:04 +0000304 log->Printf ("SBValue(%p)::GetByteSize () => %llu", value_sp.get(), (uint64_t)result);
Greg Clayton49ce6822010-10-31 03:01:06 +0000305
Chris Lattner24943d22010-06-08 16:52:24 +0000306 return result;
307}
308
309bool
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000310SBValue::IsInScope ()
311{
Chris Lattner24943d22010-06-08 16:52:24 +0000312 bool result = false;
313
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000314 lldb::ValueObjectSP value_sp(GetSP());
315 if (value_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000316 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000317 TargetSP target_sp(value_sp->GetTargetSP());
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000318 if (target_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +0000319 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000320 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000321 result = value_sp->IsInScope ();
Greg Claytonb9dcc512011-06-29 18:28:50 +0000322 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000323 }
Chris Lattner24943d22010-06-08 16:52:24 +0000324
Greg Claytone005f2c2010-11-06 01:53:30 +0000325 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000326 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000327 log->Printf ("SBValue(%p)::IsInScope () => %i", value_sp.get(), result);
Greg Clayton49ce6822010-10-31 03:01:06 +0000328
Chris Lattner24943d22010-06-08 16:52:24 +0000329 return result;
330}
331
332const char *
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000333SBValue::GetValue ()
334{
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000335 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
336
Greg Clayton49ce6822010-10-31 03:01:06 +0000337 const char *cstr = NULL;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000338 lldb::ValueObjectSP value_sp(GetSP());
339 if (value_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000340 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000341 ProcessSP process_sp(value_sp->GetProcessSP());
342 Process::StopLocker stop_locker;
343 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Claytonb9dcc512011-06-29 18:28:50 +0000344 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000345 if (log)
346 log->Printf ("SBValue(%p)::GetValue() => error: process is running", value_sp.get());
347 }
348 else
349 {
350 TargetSP target_sp(value_sp->GetTargetSP());
351 if (target_sp)
352 {
353 Mutex::Locker api_locker (target_sp->GetAPIMutex());
354 cstr = value_sp->GetValueAsCString ();
355 }
Greg Claytonb9dcc512011-06-29 18:28:50 +0000356 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000357 }
Greg Clayton49ce6822010-10-31 03:01:06 +0000358 if (log)
359 {
360 if (cstr)
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000361 log->Printf ("SBValue(%p)::GetValue() => \"%s\"", value_sp.get(), cstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000362 else
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000363 log->Printf ("SBValue(%p)::GetValue() => NULL", value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +0000364 }
365
366 return cstr;
Chris Lattner24943d22010-06-08 16:52:24 +0000367}
368
Greg Claytonf3d0b0c2010-10-27 03:32:59 +0000369ValueType
370SBValue::GetValueType ()
371{
Greg Clayton49ce6822010-10-31 03:01:06 +0000372 ValueType result = eValueTypeInvalid;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000373 lldb::ValueObjectSP value_sp(GetSP());
374 if (value_sp)
375 result = value_sp->GetValueType();
Greg Claytone005f2c2010-11-06 01:53:30 +0000376 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000377 if (log)
378 {
379 switch (result)
380 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000381 case eValueTypeInvalid: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeInvalid", value_sp.get()); break;
382 case eValueTypeVariableGlobal: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableGlobal", value_sp.get()); break;
383 case eValueTypeVariableStatic: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableStatic", value_sp.get()); break;
384 case eValueTypeVariableArgument:log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableArgument", value_sp.get()); break;
385 case eValueTypeVariableLocal: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableLocal", value_sp.get()); break;
386 case eValueTypeRegister: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeRegister", value_sp.get()); break;
387 case eValueTypeRegisterSet: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeRegisterSet", value_sp.get()); break;
388 case eValueTypeConstResult: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeConstResult", value_sp.get()); break;
389 default: log->Printf ("SBValue(%p)::GetValueType () => %i ???", value_sp.get(), result); break;
Greg Clayton49ce6822010-10-31 03:01:06 +0000390 }
391 }
392 return result;
Greg Claytonf3d0b0c2010-10-27 03:32:59 +0000393}
394
Jim Ingham4ae51962010-09-10 23:12:17 +0000395const char *
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000396SBValue::GetObjectDescription ()
397{
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000398 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000399 const char *cstr = NULL;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000400 lldb::ValueObjectSP value_sp(GetSP());
401 if (value_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000402 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000403 ProcessSP process_sp(value_sp->GetProcessSP());
404 Process::StopLocker stop_locker;
405 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Claytonb9dcc512011-06-29 18:28:50 +0000406 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000407 if (log)
408 log->Printf ("SBValue(%p)::GetObjectDescription() => error: process is running", value_sp.get());
409 }
410 else
411 {
412 TargetSP target_sp(value_sp->GetTargetSP());
413 if (target_sp)
414 {
415 Mutex::Locker api_locker (target_sp->GetAPIMutex());
416 cstr = value_sp->GetObjectDescription ();
417 }
Greg Claytonb9dcc512011-06-29 18:28:50 +0000418 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000419 }
Greg Clayton49ce6822010-10-31 03:01:06 +0000420 if (log)
421 {
422 if (cstr)
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000423 log->Printf ("SBValue(%p)::GetObjectDescription() => \"%s\"", value_sp.get(), cstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000424 else
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000425 log->Printf ("SBValue(%p)::GetObjectDescription() => NULL", value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +0000426 }
427 return cstr;
Jim Ingham4ae51962010-09-10 23:12:17 +0000428}
429
Enrico Granata979e20d2011-07-29 19:53:35 +0000430SBType
431SBValue::GetType()
432{
Jim Ingham5b4905d2012-04-13 18:30:20 +0000433 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000434 SBType sb_type;
435 lldb::ValueObjectSP value_sp(GetSP());
436 TypeImplSP type_sp;
437 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +0000438 {
Jim Ingham5b4905d2012-04-13 18:30:20 +0000439 ProcessSP process_sp(value_sp->GetProcessSP());
440 Process::StopLocker stop_locker;
441 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
442 {
443 if (log)
Greg Clayton12b7ea32012-06-04 20:13:23 +0000444 log->Printf ("SBValue(%p)::GetType() => error: process is running", value_sp.get());
Jim Ingham5b4905d2012-04-13 18:30:20 +0000445 }
446 else
447 {
448 TargetSP target_sp(value_sp->GetTargetSP());
449 if (target_sp)
450 {
451 Mutex::Locker api_locker (target_sp->GetAPIMutex());
452 type_sp.reset (new TypeImpl(ClangASTType (value_sp->GetClangAST(), value_sp->GetClangType())));
453 sb_type.SetSP(type_sp);
454 }
455 }
Enrico Granata979e20d2011-07-29 19:53:35 +0000456 }
Enrico Granata979e20d2011-07-29 19:53:35 +0000457 if (log)
458 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000459 if (type_sp)
460 log->Printf ("SBValue(%p)::GetType => SBType(%p)", value_sp.get(), type_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +0000461 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000462 log->Printf ("SBValue(%p)::GetType => NULL", value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +0000463 }
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000464 return sb_type;
Enrico Granata979e20d2011-07-29 19:53:35 +0000465}
466
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000467bool
468SBValue::GetValueDidChange ()
469{
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000470 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000471 bool result = false;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000472 lldb::ValueObjectSP value_sp(GetSP());
473 if (value_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000474 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000475 ProcessSP process_sp(value_sp->GetProcessSP());
476 Process::StopLocker stop_locker;
477 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Claytonb9dcc512011-06-29 18:28:50 +0000478 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000479 if (log)
480 log->Printf ("SBValue(%p)::GetValueDidChange() => error: process is running", value_sp.get());
481 }
482 else
483 {
484 TargetSP target_sp(value_sp->GetTargetSP());
485 if (target_sp)
486 {
487 Mutex::Locker api_locker (target_sp->GetAPIMutex());
488 result = value_sp->GetValueDidChange ();
489 }
Greg Claytonb9dcc512011-06-29 18:28:50 +0000490 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000491 }
Greg Clayton49ce6822010-10-31 03:01:06 +0000492 if (log)
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000493 log->Printf ("SBValue(%p)::GetValueDidChange() => %i", value_sp.get(), result);
Greg Clayton49ce6822010-10-31 03:01:06 +0000494
495 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000496}
497
Jason Molendac48ca822012-02-21 05:33:55 +0000498#ifndef LLDB_DISABLE_PYTHON
Chris Lattner24943d22010-06-08 16:52:24 +0000499const char *
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000500SBValue::GetSummary ()
501{
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000502 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000503 const char *cstr = NULL;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000504 lldb::ValueObjectSP value_sp(GetSP());
505 if (value_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000506 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000507 ProcessSP process_sp(value_sp->GetProcessSP());
508 Process::StopLocker stop_locker;
509 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Claytonb9dcc512011-06-29 18:28:50 +0000510 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000511 if (log)
512 log->Printf ("SBValue(%p)::GetSummary() => error: process is running", value_sp.get());
513 }
514 else
515 {
516 TargetSP target_sp(value_sp->GetTargetSP());
517 if (target_sp)
518 {
519 Mutex::Locker api_locker (target_sp->GetAPIMutex());
520 cstr = value_sp->GetSummaryAsCString();
521 }
Greg Claytonb9dcc512011-06-29 18:28:50 +0000522 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000523 }
Greg Clayton49ce6822010-10-31 03:01:06 +0000524 if (log)
525 {
526 if (cstr)
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000527 log->Printf ("SBValue(%p)::GetSummary() => \"%s\"", value_sp.get(), cstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000528 else
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000529 log->Printf ("SBValue(%p)::GetSummary() => NULL", value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +0000530 }
531 return cstr;
Chris Lattner24943d22010-06-08 16:52:24 +0000532}
Jason Molendac48ca822012-02-21 05:33:55 +0000533#endif // LLDB_DISABLE_PYTHON
Chris Lattner24943d22010-06-08 16:52:24 +0000534
535const char *
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000536SBValue::GetLocation ()
537{
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000538 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000539 const char *cstr = NULL;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000540 lldb::ValueObjectSP value_sp(GetSP());
541 if (value_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000542 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000543 ProcessSP process_sp(value_sp->GetProcessSP());
544 Process::StopLocker stop_locker;
545 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Claytonb9dcc512011-06-29 18:28:50 +0000546 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000547 if (log)
548 log->Printf ("SBValue(%p)::GetLocation() => error: process is running", value_sp.get());
549 }
550 else
551 {
552 TargetSP target_sp(value_sp->GetTargetSP());
553 if (target_sp)
554 {
555 Mutex::Locker api_locker (target_sp->GetAPIMutex());
556 cstr = value_sp->GetLocationAsCString();
557 }
Greg Claytonb9dcc512011-06-29 18:28:50 +0000558 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000559 }
Greg Clayton49ce6822010-10-31 03:01:06 +0000560 if (log)
561 {
562 if (cstr)
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000563 log->Printf ("SBValue(%p)::GetLocation() => \"%s\"", value_sp.get(), cstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000564 else
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000565 log->Printf ("SBValue(%p)::GetLocation() => NULL", value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +0000566 }
567 return cstr;
Chris Lattner24943d22010-06-08 16:52:24 +0000568}
569
Enrico Granata651cbe22012-05-08 21:25:06 +0000570// Deprecated - use the one that takes an lldb::SBError
Chris Lattner24943d22010-06-08 16:52:24 +0000571bool
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000572SBValue::SetValueFromCString (const char *value_str)
573{
Enrico Granata651cbe22012-05-08 21:25:06 +0000574 lldb::SBError dummy;
575 return SetValueFromCString(value_str,dummy);
576}
577
578bool
579SBValue::SetValueFromCString (const char *value_str, lldb::SBError& error)
580{
Chris Lattner24943d22010-06-08 16:52:24 +0000581 bool success = false;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000582 lldb::ValueObjectSP value_sp(GetSP());
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000583 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000584 if (value_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000585 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000586 ProcessSP process_sp(value_sp->GetProcessSP());
587 Process::StopLocker stop_locker;
588 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Claytonb9dcc512011-06-29 18:28:50 +0000589 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000590 if (log)
591 log->Printf ("SBValue(%p)::SetValueFromCString() => error: process is running", value_sp.get());
592 }
593 else
594 {
595 TargetSP target_sp(value_sp->GetTargetSP());
596 if (target_sp)
597 {
598 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Enrico Granata651cbe22012-05-08 21:25:06 +0000599 success = value_sp->SetValueFromCString (value_str,error.ref());
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000600 }
Greg Claytonb9dcc512011-06-29 18:28:50 +0000601 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000602 }
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000603 if (log)
604 log->Printf ("SBValue(%p)::SetValueFromCString(\"%s\") => %i", value_sp.get(), value_str, success);
605
Chris Lattner24943d22010-06-08 16:52:24 +0000606 return success;
607}
608
Enrico Granatad760907c2012-02-17 03:18:30 +0000609lldb::SBTypeFormat
610SBValue::GetTypeFormat ()
611{
612 lldb::SBTypeFormat format;
613 lldb::ValueObjectSP value_sp(GetSP());
614 if (value_sp)
615 {
Jim Ingham5b4905d2012-04-13 18:30:20 +0000616 ProcessSP process_sp(value_sp->GetProcessSP());
617 Process::StopLocker stop_locker;
618 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granatad760907c2012-02-17 03:18:30 +0000619 {
Jim Ingham5b4905d2012-04-13 18:30:20 +0000620 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
621 if (log)
Greg Clayton12b7ea32012-06-04 20:13:23 +0000622 log->Printf ("SBValue(%p)::GetTypeFormat() => error: process is running", value_sp.get());
Jim Ingham5b4905d2012-04-13 18:30:20 +0000623 }
624 else
625 {
626 TargetSP target_sp(value_sp->GetTargetSP());
627 if (target_sp)
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000628 {
Jim Ingham5b4905d2012-04-13 18:30:20 +0000629 Mutex::Locker api_locker (target_sp->GetAPIMutex());
630 if (value_sp->UpdateValueIfNeeded(true))
631 {
632 lldb::TypeFormatImplSP format_sp = value_sp->GetValueFormat();
633 if (format_sp)
634 format.SetSP(format_sp);
635 }
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000636 }
Enrico Granatad760907c2012-02-17 03:18:30 +0000637 }
638 }
639 return format;
640}
641
Jason Molendac48ca822012-02-21 05:33:55 +0000642#ifndef LLDB_DISABLE_PYTHON
Enrico Granatad760907c2012-02-17 03:18:30 +0000643lldb::SBTypeSummary
644SBValue::GetTypeSummary ()
645{
646 lldb::SBTypeSummary summary;
647 lldb::ValueObjectSP value_sp(GetSP());
648 if (value_sp)
649 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000650 ProcessSP process_sp(value_sp->GetProcessSP());
651 Process::StopLocker stop_locker;
652 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granatad760907c2012-02-17 03:18:30 +0000653 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000654 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
655 if (log)
656 log->Printf ("SBValue(%p)::GetTypeSummary() => error: process is running", value_sp.get());
657 }
658 else
659 {
660 TargetSP target_sp(value_sp->GetTargetSP());
661 if (target_sp)
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000662 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000663 Mutex::Locker api_locker (target_sp->GetAPIMutex());
664 if (value_sp->UpdateValueIfNeeded(true))
665 {
666 lldb::TypeSummaryImplSP summary_sp = value_sp->GetSummaryFormat();
667 if (summary_sp)
668 summary.SetSP(summary_sp);
669 }
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000670 }
Enrico Granatad760907c2012-02-17 03:18:30 +0000671 }
672 }
673 return summary;
674}
Jason Molendac48ca822012-02-21 05:33:55 +0000675#endif // LLDB_DISABLE_PYTHON
Enrico Granatad760907c2012-02-17 03:18:30 +0000676
677lldb::SBTypeFilter
678SBValue::GetTypeFilter ()
679{
680 lldb::SBTypeFilter filter;
681 lldb::ValueObjectSP value_sp(GetSP());
682 if (value_sp)
683 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000684 ProcessSP process_sp(value_sp->GetProcessSP());
685 Process::StopLocker stop_locker;
686 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granatad760907c2012-02-17 03:18:30 +0000687 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000688 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
689 if (log)
690 log->Printf ("SBValue(%p)::GetTypeFilter() => error: process is running", value_sp.get());
691 }
692 else
693 {
694 TargetSP target_sp(value_sp->GetTargetSP());
695 if (target_sp)
Enrico Granatad760907c2012-02-17 03:18:30 +0000696 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000697 Mutex::Locker api_locker (target_sp->GetAPIMutex());
698 if (value_sp->UpdateValueIfNeeded(true))
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000699 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000700 lldb::SyntheticChildrenSP synthetic_sp = value_sp->GetSyntheticChildren();
701
702 if (synthetic_sp && !synthetic_sp->IsScripted())
703 {
704 TypeFilterImplSP filter_sp = STD_STATIC_POINTER_CAST(TypeFilterImpl,synthetic_sp);
705 filter.SetSP(filter_sp);
706 }
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000707 }
Enrico Granatad760907c2012-02-17 03:18:30 +0000708 }
709 }
710 }
711 return filter;
712}
713
Jason Molendac48ca822012-02-21 05:33:55 +0000714#ifndef LLDB_DISABLE_PYTHON
Enrico Granatad760907c2012-02-17 03:18:30 +0000715lldb::SBTypeSynthetic
716SBValue::GetTypeSynthetic ()
717{
718 lldb::SBTypeSynthetic synthetic;
719 lldb::ValueObjectSP value_sp(GetSP());
720 if (value_sp)
721 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000722 ProcessSP process_sp(value_sp->GetProcessSP());
723 Process::StopLocker stop_locker;
724 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granatad760907c2012-02-17 03:18:30 +0000725 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000726 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
727 if (log)
728 log->Printf ("SBValue(%p)::GetTypeSynthetic() => error: process is running", value_sp.get());
729 }
730 else
731 {
732 TargetSP target_sp(value_sp->GetTargetSP());
733 if (target_sp)
Enrico Granatad760907c2012-02-17 03:18:30 +0000734 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000735 Mutex::Locker api_locker (target_sp->GetAPIMutex());
736 if (value_sp->UpdateValueIfNeeded(true))
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000737 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000738 lldb::SyntheticChildrenSP children_sp = value_sp->GetSyntheticChildren();
739
740 if (children_sp && children_sp->IsScripted())
741 {
742 TypeSyntheticImplSP synth_sp = STD_STATIC_POINTER_CAST(TypeSyntheticImpl,children_sp);
743 synthetic.SetSP(synth_sp);
744 }
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000745 }
Enrico Granatad760907c2012-02-17 03:18:30 +0000746 }
747 }
748 }
749 return synthetic;
750}
Jason Molendac48ca822012-02-21 05:33:55 +0000751#endif
Enrico Granatad760907c2012-02-17 03:18:30 +0000752
Enrico Granata979e20d2011-07-29 19:53:35 +0000753lldb::SBValue
Greg Claytond68e0892011-09-09 23:04:00 +0000754SBValue::CreateChildAtOffset (const char *name, uint32_t offset, SBType type)
Enrico Granata979e20d2011-07-29 19:53:35 +0000755{
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000756 lldb::SBValue sb_value;
757 lldb::ValueObjectSP value_sp(GetSP());
758 lldb::ValueObjectSP new_value_sp;
759 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +0000760 {
Jim Ingham5b4905d2012-04-13 18:30:20 +0000761 ProcessSP process_sp(value_sp->GetProcessSP());
762 Process::StopLocker stop_locker;
763 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granata979e20d2011-07-29 19:53:35 +0000764 {
Jim Ingham5b4905d2012-04-13 18:30:20 +0000765 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
766 if (log)
Greg Clayton12b7ea32012-06-04 20:13:23 +0000767 log->Printf ("SBValue(%p)::CreateChildAtOffset() => error: process is running", value_sp.get());
Jim Ingham5b4905d2012-04-13 18:30:20 +0000768 }
769 else
770 {
771 TargetSP target_sp(value_sp->GetTargetSP());
772 if (target_sp)
773 {
774 Mutex::Locker api_locker (target_sp->GetAPIMutex());
775 TypeImplSP type_sp (type.GetSP());
776 if (type.IsValid())
777 {
Enrico Granata3d656c72012-10-22 18:18:36 +0000778 sb_value.SetSP(value_sp->GetSyntheticChildAtOffset(offset, type_sp->GetClangASTType(), true),GetPreferDynamicValue(),GetPreferSyntheticValue());
Jim Ingham5b4905d2012-04-13 18:30:20 +0000779 new_value_sp = sb_value.GetSP();
780 if (new_value_sp)
781 new_value_sp->SetName(ConstString(name));
782 }
783 }
Enrico Granata979e20d2011-07-29 19:53:35 +0000784 }
785 }
786 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
787 if (log)
788 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000789 if (new_value_sp)
Jim Ingham47beabb2012-10-16 21:41:58 +0000790 log->Printf ("SBValue(%p)::CreateChildAtOffset => \"%s\"",
791 value_sp.get(),
792 new_value_sp->GetName().AsCString());
Enrico Granata979e20d2011-07-29 19:53:35 +0000793 else
Jim Ingham47beabb2012-10-16 21:41:58 +0000794 log->Printf ("SBValue(%p)::CreateChildAtOffset => NULL",
795 value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +0000796 }
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000797 return sb_value;
Enrico Granata979e20d2011-07-29 19:53:35 +0000798}
799
800lldb::SBValue
Greg Claytond68e0892011-09-09 23:04:00 +0000801SBValue::Cast (SBType type)
Enrico Granata979e20d2011-07-29 19:53:35 +0000802{
Greg Clayton4eb01a72012-01-31 04:25:15 +0000803 lldb::SBValue sb_value;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000804 lldb::ValueObjectSP value_sp(GetSP());
805 TypeImplSP type_sp (type.GetSP());
806 if (value_sp && type_sp)
Enrico Granata3d656c72012-10-22 18:18:36 +0000807 sb_value.SetSP(value_sp->Cast(type_sp->GetClangASTType()),GetPreferDynamicValue(),GetPreferSyntheticValue());
Greg Clayton4eb01a72012-01-31 04:25:15 +0000808 return sb_value;
Enrico Granata979e20d2011-07-29 19:53:35 +0000809}
810
811lldb::SBValue
812SBValue::CreateValueFromExpression (const char *name, const char* expression)
813{
Jim Ingham47beabb2012-10-16 21:41:58 +0000814 SBExpressionOptions options;
Greg Clayton75a443b2012-10-16 22:58:25 +0000815 options.ref().SetKeepInMemory(true);
Jim Ingham47beabb2012-10-16 21:41:58 +0000816 return CreateValueFromExpression (name, expression, options);
817}
818
819lldb::SBValue
820SBValue::CreateValueFromExpression (const char *name, const char *expression, SBExpressionOptions &options)
821{
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000822 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000823 lldb::SBValue sb_value;
824 lldb::ValueObjectSP value_sp(GetSP());
825 lldb::ValueObjectSP new_value_sp;
826 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +0000827 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000828 ExecutionContext exe_ctx (value_sp->GetExecutionContextRef());
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000829 ProcessSP process_sp(exe_ctx.GetProcessSP());
830 Process::StopLocker stop_locker;
831 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Johnny Chen9fd2e382011-12-20 01:52:44 +0000832 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000833 if (log)
834 log->Printf ("SBValue(%p)::CreateValueFromExpression() => error: process is running", value_sp.get());
835 }
836 else
837 {
838 Target* target = exe_ctx.GetTargetPtr();
839 if (target)
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000840 {
Greg Clayton75a443b2012-10-16 22:58:25 +0000841 options.ref().SetKeepInMemory(true);
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000842 target->EvaluateExpression (expression,
843 exe_ctx.GetFramePtr(),
Enrico Granatad27026e2012-09-05 20:41:26 +0000844 new_value_sp,
Jim Ingham47beabb2012-10-16 21:41:58 +0000845 options.ref());
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000846 if (new_value_sp)
847 {
848 new_value_sp->SetName(ConstString(name));
849 sb_value.SetSP(new_value_sp);
850 }
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000851 }
Johnny Chen9fd2e382011-12-20 01:52:44 +0000852 }
Enrico Granata979e20d2011-07-29 19:53:35 +0000853 }
Enrico Granata979e20d2011-07-29 19:53:35 +0000854 if (log)
855 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000856 if (new_value_sp)
Greg Clayton12b7ea32012-06-04 20:13:23 +0000857 log->Printf ("SBValue(%p)::CreateValueFromExpression(name=\"%s\", expression=\"%s\") => SBValue (%p)",
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000858 value_sp.get(),
859 name,
860 expression,
861 new_value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +0000862 else
Greg Clayton12b7ea32012-06-04 20:13:23 +0000863 log->Printf ("SBValue(%p)::CreateValueFromExpression(name=\"%s\", expression=\"%s\") => NULL",
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000864 value_sp.get(),
865 name,
866 expression);
Enrico Granata979e20d2011-07-29 19:53:35 +0000867 }
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000868 return sb_value;
Enrico Granata979e20d2011-07-29 19:53:35 +0000869}
870
871lldb::SBValue
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000872SBValue::CreateValueFromAddress(const char* name, lldb::addr_t address, SBType sb_type)
Enrico Granata979e20d2011-07-29 19:53:35 +0000873{
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000874 lldb::SBValue sb_value;
875 lldb::ValueObjectSP value_sp(GetSP());
876 lldb::ValueObjectSP new_value_sp;
877 lldb::TypeImplSP type_impl_sp (sb_type.GetSP());
878 if (value_sp && type_impl_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +0000879 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000880 ClangASTType pointee_ast_type(type_impl_sp->GetASTContext(), type_impl_sp->GetClangASTType().GetPointerType ());
881 lldb::TypeImplSP pointee_type_impl_sp (new TypeImpl(pointee_ast_type));
882 if (pointee_type_impl_sp)
Enrico Granatac9310302011-08-04 17:07:02 +0000883 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000884
885 lldb::DataBufferSP buffer(new lldb_private::DataBufferHeap(&address,sizeof(lldb::addr_t)));
886
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000887 ExecutionContext exe_ctx (value_sp->GetExecutionContextRef());
888 ValueObjectSP ptr_result_valobj_sp(ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000889 pointee_type_impl_sp->GetASTContext(),
890 pointee_type_impl_sp->GetOpaqueQualType(),
891 ConstString(name),
892 buffer,
893 lldb::endian::InlHostByteOrder(),
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000894 exe_ctx.GetAddressByteSize()));
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000895
896 if (ptr_result_valobj_sp)
897 {
898 ptr_result_valobj_sp->GetValue().SetValueType(Value::eValueTypeLoadAddress);
899 Error err;
900 new_value_sp = ptr_result_valobj_sp->Dereference(err);
901 if (new_value_sp)
902 new_value_sp->SetName(ConstString(name));
903 }
904 sb_value.SetSP(new_value_sp);
Enrico Granatac9310302011-08-04 17:07:02 +0000905 }
Enrico Granata979e20d2011-07-29 19:53:35 +0000906 }
907 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
908 if (log)
909 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000910 if (new_value_sp)
911 log->Printf ("SBValue(%p)::CreateValueFromAddress => \"%s\"", value_sp.get(), new_value_sp->GetName().AsCString());
Johnny Chena713b862011-08-09 22:38:07 +0000912 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000913 log->Printf ("SBValue(%p)::CreateValueFromAddress => NULL", value_sp.get());
Johnny Chena713b862011-08-09 22:38:07 +0000914 }
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000915 return sb_value;
Enrico Granata979e20d2011-07-29 19:53:35 +0000916}
917
Enrico Granata91544802011-09-06 19:20:51 +0000918lldb::SBValue
Greg Claytond68e0892011-09-09 23:04:00 +0000919SBValue::CreateValueFromData (const char* name, SBData data, SBType type)
Enrico Granata91544802011-09-06 19:20:51 +0000920{
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000921 lldb::SBValue sb_value;
922 lldb::ValueObjectSP new_value_sp;
923 lldb::ValueObjectSP value_sp(GetSP());
924 if (value_sp)
Enrico Granata91544802011-09-06 19:20:51 +0000925 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000926 ExecutionContext exe_ctx (value_sp->GetExecutionContextRef());
927
928 new_value_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000929 type.m_opaque_sp->GetASTContext() ,
930 type.m_opaque_sp->GetOpaqueQualType(),
931 ConstString(name),
932 *data.m_opaque_sp,
933 LLDB_INVALID_ADDRESS);
934 new_value_sp->SetAddressTypeOfChildren(eAddressTypeLoad);
935 sb_value.SetSP(new_value_sp);
Enrico Granata91544802011-09-06 19:20:51 +0000936 }
937 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
938 if (log)
939 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000940 if (new_value_sp)
Greg Clayton12b7ea32012-06-04 20:13:23 +0000941 log->Printf ("SBValue(%p)::CreateValueFromData => \"%s\"", value_sp.get(), new_value_sp->GetName().AsCString());
Enrico Granata91544802011-09-06 19:20:51 +0000942 else
Greg Clayton12b7ea32012-06-04 20:13:23 +0000943 log->Printf ("SBValue(%p)::CreateValueFromData => NULL", value_sp.get());
Enrico Granata91544802011-09-06 19:20:51 +0000944 }
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000945 return sb_value;
Enrico Granata91544802011-09-06 19:20:51 +0000946}
947
Chris Lattner24943d22010-06-08 16:52:24 +0000948SBValue
949SBValue::GetChildAtIndex (uint32_t idx)
950{
Greg Clayton8f64c472011-07-15 19:31:49 +0000951 const bool can_create_synthetic = false;
952 lldb::DynamicValueType use_dynamic = eNoDynamicValues;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000953 lldb::ValueObjectSP value_sp(GetSP());
954 if (value_sp)
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000955 {
956 TargetSP target_sp(value_sp->GetTargetSP());
957 if (target_sp)
958 use_dynamic = target_sp->GetPreferDynamicValue();
959 }
Greg Clayton8f64c472011-07-15 19:31:49 +0000960 return GetChildAtIndex (idx, use_dynamic, can_create_synthetic);
Jim Inghame41494a2011-04-16 00:01:13 +0000961}
962
963SBValue
Greg Clayton8f64c472011-07-15 19:31:49 +0000964SBValue::GetChildAtIndex (uint32_t idx, lldb::DynamicValueType use_dynamic, bool can_create_synthetic)
Jim Inghame41494a2011-04-16 00:01:13 +0000965{
Chris Lattner24943d22010-06-08 16:52:24 +0000966 lldb::ValueObjectSP child_sp;
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000967 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Chris Lattner24943d22010-06-08 16:52:24 +0000968
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000969 lldb::ValueObjectSP value_sp(GetSP());
970 if (value_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000971 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000972 ProcessSP process_sp(value_sp->GetProcessSP());
973 Process::StopLocker stop_locker;
974 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Claytonb9dcc512011-06-29 18:28:50 +0000975 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000976 if (log)
977 log->Printf ("SBValue(%p)::GetChildAtIndex() => error: process is running", value_sp.get());
978 }
979 else
980 {
981 TargetSP target_sp(value_sp->GetTargetSP());
982 if (target_sp)
Greg Claytonfab305b2011-05-20 23:51:26 +0000983 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000984 Mutex::Locker api_locker (target_sp->GetAPIMutex());
985 const bool can_create = true;
986 child_sp = value_sp->GetChildAtIndex (idx, can_create);
987 if (can_create_synthetic && !child_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +0000988 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000989 if (value_sp->IsPointerType())
990 {
991 child_sp = value_sp->GetSyntheticArrayMemberFromPointer(idx, can_create);
992 }
993 else if (value_sp->IsArrayType())
994 {
995 child_sp = value_sp->GetSyntheticArrayMemberFromArray(idx, can_create);
996 }
Greg Clayton8f64c472011-07-15 19:31:49 +0000997 }
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000998
Greg Claytonfab305b2011-05-20 23:51:26 +0000999 }
Jim Inghame41494a2011-04-16 00:01:13 +00001000 }
1001 }
1002
Enrico Granata3d656c72012-10-22 18:18:36 +00001003 SBValue sb_value;
1004 sb_value.SetSP (child_sp, use_dynamic, GetPreferSyntheticValue());
Greg Clayton49ce6822010-10-31 03:01:06 +00001005 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001006 log->Printf ("SBValue(%p)::GetChildAtIndex (%u) => SBValue(%p)", value_sp.get(), idx, value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +00001007
Chris Lattner24943d22010-06-08 16:52:24 +00001008 return sb_value;
1009}
1010
1011uint32_t
1012SBValue::GetIndexOfChildWithName (const char *name)
1013{
Greg Clayton49ce6822010-10-31 03:01:06 +00001014 uint32_t idx = UINT32_MAX;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001015 lldb::ValueObjectSP value_sp(GetSP());
1016 if (value_sp)
Greg Claytonfab305b2011-05-20 23:51:26 +00001017 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001018 TargetSP target_sp(value_sp->GetTargetSP());
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001019 if (target_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +00001020 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001021 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Claytonfab305b2011-05-20 23:51:26 +00001022
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001023 idx = value_sp->GetIndexOfChildWithName (ConstString(name));
Greg Claytonb9dcc512011-06-29 18:28:50 +00001024 }
Greg Claytonfab305b2011-05-20 23:51:26 +00001025 }
Greg Claytone005f2c2010-11-06 01:53:30 +00001026 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +00001027 if (log)
1028 {
1029 if (idx == UINT32_MAX)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001030 log->Printf ("SBValue(%p)::GetIndexOfChildWithName (name=\"%s\") => NOT FOUND", value_sp.get(), name);
Greg Clayton49ce6822010-10-31 03:01:06 +00001031 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001032 log->Printf ("SBValue(%p)::GetIndexOfChildWithName (name=\"%s\") => %u", value_sp.get(), name, idx);
Greg Clayton49ce6822010-10-31 03:01:06 +00001033 }
1034 return idx;
Chris Lattner24943d22010-06-08 16:52:24 +00001035}
1036
1037SBValue
1038SBValue::GetChildMemberWithName (const char *name)
1039{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001040 lldb::ValueObjectSP value_sp(GetSP());
1041 if (value_sp)
Johnny Chen446ccaa2011-06-29 21:19:39 +00001042 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001043 lldb::DynamicValueType use_dynamic_value = eNoDynamicValues;
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001044 TargetSP target_sp(value_sp->GetTargetSP());
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001045 if (target_sp)
1046 {
1047 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1048 use_dynamic_value = target_sp->GetPreferDynamicValue();
1049 }
Johnny Chen446ccaa2011-06-29 21:19:39 +00001050 return GetChildMemberWithName (name, use_dynamic_value);
1051 }
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001052 return SBValue();
Jim Inghame41494a2011-04-16 00:01:13 +00001053}
1054
1055SBValue
Jim Ingham10de7d12011-05-04 03:43:18 +00001056SBValue::GetChildMemberWithName (const char *name, lldb::DynamicValueType use_dynamic_value)
Jim Inghame41494a2011-04-16 00:01:13 +00001057{
Chris Lattner24943d22010-06-08 16:52:24 +00001058 lldb::ValueObjectSP child_sp;
1059 const ConstString str_name (name);
1060
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001061 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton905acaf2011-05-20 22:07:17 +00001062
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001063 lldb::ValueObjectSP value_sp(GetSP());
1064 if (value_sp)
Chris Lattner24943d22010-06-08 16:52:24 +00001065 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001066 ProcessSP process_sp(value_sp->GetProcessSP());
1067 Process::StopLocker stop_locker;
1068 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Jim Inghame41494a2011-04-16 00:01:13 +00001069 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001070 if (log)
1071 log->Printf ("SBValue(%p)::GetChildMemberWithName() => error: process is running", value_sp.get());
1072 }
1073 else
1074 {
1075 TargetSP target_sp(value_sp->GetTargetSP());
1076 if (target_sp)
Greg Claytonfab305b2011-05-20 23:51:26 +00001077 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001078 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1079 child_sp = value_sp->GetChildMemberWithName (str_name, true);
Greg Claytonfab305b2011-05-20 23:51:26 +00001080 }
Jim Inghame41494a2011-04-16 00:01:13 +00001081 }
1082 }
1083
Enrico Granata3d656c72012-10-22 18:18:36 +00001084 SBValue sb_value;
1085 sb_value.SetSP(child_sp, use_dynamic_value, GetPreferSyntheticValue());
Greg Clayton49ce6822010-10-31 03:01:06 +00001086
Greg Clayton49ce6822010-10-31 03:01:06 +00001087 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001088 log->Printf ("SBValue(%p)::GetChildMemberWithName (name=\"%s\") => SBValue(%p)", value_sp.get(), name, value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +00001089
Chris Lattner24943d22010-06-08 16:52:24 +00001090 return sb_value;
1091}
1092
Enrico Granataf7a9b142011-07-15 02:26:42 +00001093lldb::SBValue
Jim Ingham1b425752011-12-08 19:44:08 +00001094SBValue::GetDynamicValue (lldb::DynamicValueType use_dynamic)
1095{
Enrico Granata3d656c72012-10-22 18:18:36 +00001096 SBValue value_sb;
1097 if (IsValid())
Jim Ingham1b425752011-12-08 19:44:08 +00001098 {
Enrico Granata3d656c72012-10-22 18:18:36 +00001099 ValueImplSP proxy_sp(new ValueImpl(m_opaque_sp->GetRootSP(),use_dynamic,m_opaque_sp->GetUseSynthetic()));
1100 value_sb.SetSP(proxy_sp);
Jim Ingham1b425752011-12-08 19:44:08 +00001101 }
Enrico Granata3d656c72012-10-22 18:18:36 +00001102 return value_sb;
Jim Ingham1b425752011-12-08 19:44:08 +00001103}
1104
1105lldb::SBValue
1106SBValue::GetStaticValue ()
1107{
Enrico Granata3d656c72012-10-22 18:18:36 +00001108 SBValue value_sb;
1109 if (IsValid())
Jim Ingham1b425752011-12-08 19:44:08 +00001110 {
Enrico Granata3d656c72012-10-22 18:18:36 +00001111 ValueImplSP proxy_sp(new ValueImpl(m_opaque_sp->GetRootSP(),eNoDynamicValues,m_opaque_sp->GetUseSynthetic()));
1112 value_sb.SetSP(proxy_sp);
Jim Ingham1b425752011-12-08 19:44:08 +00001113 }
Enrico Granata3d656c72012-10-22 18:18:36 +00001114 return value_sb;
Jim Ingham1b425752011-12-08 19:44:08 +00001115}
1116
Enrico Granatadba1de82012-03-27 02:35:13 +00001117lldb::SBValue
1118SBValue::GetNonSyntheticValue ()
1119{
Enrico Granata3d656c72012-10-22 18:18:36 +00001120 SBValue value_sb;
1121 if (IsValid())
Enrico Granatadba1de82012-03-27 02:35:13 +00001122 {
Enrico Granata3d656c72012-10-22 18:18:36 +00001123 ValueImplSP proxy_sp(new ValueImpl(m_opaque_sp->GetRootSP(),m_opaque_sp->GetUseDynamic(),false));
1124 value_sb.SetSP(proxy_sp);
Enrico Granatadba1de82012-03-27 02:35:13 +00001125 }
Enrico Granata3d656c72012-10-22 18:18:36 +00001126 return value_sb;
1127}
1128
1129lldb::DynamicValueType
1130SBValue::GetPreferDynamicValue ()
1131{
1132 if (!IsValid())
1133 return eNoDynamicValues;
1134 return m_opaque_sp->GetUseDynamic();
1135}
1136
1137void
1138SBValue::SetPreferDynamicValue (lldb::DynamicValueType use_dynamic)
1139{
1140 if (IsValid())
1141 return m_opaque_sp->SetUseDynamic (use_dynamic);
1142}
1143
1144bool
1145SBValue::GetPreferSyntheticValue ()
1146{
1147 if (!IsValid())
1148 return false;
1149 return m_opaque_sp->GetUseSynthetic();
1150}
1151
1152void
1153SBValue::SetPreferSyntheticValue (bool use_synthetic)
1154{
1155 if (IsValid())
1156 return m_opaque_sp->SetUseSynthetic (use_synthetic);
Enrico Granatadba1de82012-03-27 02:35:13 +00001157}
1158
Jim Ingham1b425752011-12-08 19:44:08 +00001159bool
1160SBValue::IsDynamic()
1161{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001162 lldb::ValueObjectSP value_sp(GetSP());
1163 if (value_sp)
Jim Ingham1b425752011-12-08 19:44:08 +00001164 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001165 TargetSP target_sp(value_sp->GetTargetSP());
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001166 if (target_sp)
Jim Ingham1b425752011-12-08 19:44:08 +00001167 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001168 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001169 return value_sp->IsDynamic();
Jim Ingham1b425752011-12-08 19:44:08 +00001170 }
1171 }
1172 return false;
1173}
1174
Enrico Granata3d656c72012-10-22 18:18:36 +00001175bool
1176SBValue::IsSynthetic ()
1177{
1178 lldb::ValueObjectSP value_sp(GetSP());
1179 if (value_sp)
1180 {
1181 TargetSP target_sp(value_sp->GetTargetSP());
1182 if (target_sp)
1183 {
1184 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1185 return value_sp->IsSynthetic();
1186 }
1187 }
1188 return false;
1189}
1190
Jim Ingham1b425752011-12-08 19:44:08 +00001191lldb::SBValue
Enrico Granataf7a9b142011-07-15 02:26:42 +00001192SBValue::GetValueForExpressionPath(const char* expr_path)
1193{
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001194 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granataf7a9b142011-07-15 02:26:42 +00001195 lldb::ValueObjectSP child_sp;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001196 lldb::ValueObjectSP value_sp(GetSP());
1197 if (value_sp)
Enrico Granataf7a9b142011-07-15 02:26:42 +00001198 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001199 ProcessSP process_sp(value_sp->GetProcessSP());
1200 Process::StopLocker stop_locker;
1201 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granataf7a9b142011-07-15 02:26:42 +00001202 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001203 if (log)
1204 log->Printf ("SBValue(%p)::GetValueForExpressionPath() => error: process is running", value_sp.get());
1205 }
1206 else
1207 {
1208 TargetSP target_sp(value_sp->GetTargetSP());
1209 if (target_sp)
1210 {
1211 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1212 // using default values for all the fancy options, just do it if you can
1213 child_sp = value_sp->GetValueForExpressionPath(expr_path);
1214 }
Enrico Granataf7a9b142011-07-15 02:26:42 +00001215 }
1216 }
1217
Enrico Granata3d656c72012-10-22 18:18:36 +00001218 SBValue sb_value;
1219 sb_value.SetSP(child_sp,GetPreferDynamicValue(),GetPreferSyntheticValue());
Enrico Granataf7a9b142011-07-15 02:26:42 +00001220
Enrico Granataf7a9b142011-07-15 02:26:42 +00001221 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001222 log->Printf ("SBValue(%p)::GetValueForExpressionPath (expr_path=\"%s\") => SBValue(%p)", value_sp.get(), expr_path, value_sp.get());
Enrico Granataf7a9b142011-07-15 02:26:42 +00001223
1224 return sb_value;
1225}
Chris Lattner24943d22010-06-08 16:52:24 +00001226
Greg Clayton0fb0bcc2011-08-03 22:57:10 +00001227int64_t
Enrico Granatac92eb402011-08-04 01:41:02 +00001228SBValue::GetValueAsSigned(SBError& error, int64_t fail_value)
1229{
Jim Ingham574c3d62011-08-12 23:34:31 +00001230 error.Clear();
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001231 lldb::ValueObjectSP value_sp(GetSP());
1232 if (value_sp)
Enrico Granatac92eb402011-08-04 01:41:02 +00001233 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001234 ProcessSP process_sp(value_sp->GetProcessSP());
1235 Process::StopLocker stop_locker;
1236 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granatac92eb402011-08-04 01:41:02 +00001237 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001238 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1239 if (log)
1240 log->Printf ("SBValue(%p)::GetValueAsSigned() => error: process is running", value_sp.get());
1241 error.SetErrorString("process is running");
Enrico Granatac92eb402011-08-04 01:41:02 +00001242 }
1243 else
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001244 {
1245 TargetSP target_sp(value_sp->GetTargetSP());
1246 if (target_sp)
1247 {
1248 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1249 Scalar scalar;
1250 if (value_sp->ResolveValue (scalar))
1251 return scalar.GetRawBits64(fail_value);
1252 else
1253 error.SetErrorString("could not get value");
1254 }
1255 else
1256 error.SetErrorString("could not get target");
1257 }
Enrico Granatac92eb402011-08-04 01:41:02 +00001258 }
1259 error.SetErrorString("invalid SBValue");
1260 return fail_value;
1261}
1262
1263uint64_t
1264SBValue::GetValueAsUnsigned(SBError& error, uint64_t fail_value)
1265{
Jim Ingham574c3d62011-08-12 23:34:31 +00001266 error.Clear();
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001267 lldb::ValueObjectSP value_sp(GetSP());
1268 if (value_sp)
Enrico Granatac92eb402011-08-04 01:41:02 +00001269 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001270 ProcessSP process_sp(value_sp->GetProcessSP());
1271 Process::StopLocker stop_locker;
1272 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granatac92eb402011-08-04 01:41:02 +00001273 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001274 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1275 if (log)
1276 log->Printf ("SBValue(%p)::GetValueAsUnsigned() => error: process is running", value_sp.get());
1277 error.SetErrorString("process is running");
Enrico Granatac92eb402011-08-04 01:41:02 +00001278 }
1279 else
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001280 {
1281 TargetSP target_sp(value_sp->GetTargetSP());
1282 if (target_sp)
1283 {
1284 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1285 Scalar scalar;
1286 if (value_sp->ResolveValue (scalar))
1287 return scalar.GetRawBits64(fail_value);
1288 else
1289 error.SetErrorString("could not get value");
1290 }
1291 else
1292 error.SetErrorString("could not get target");
1293 }
Enrico Granatac92eb402011-08-04 01:41:02 +00001294 }
1295 error.SetErrorString("invalid SBValue");
1296 return fail_value;
1297}
1298
1299int64_t
Greg Clayton0fb0bcc2011-08-03 22:57:10 +00001300SBValue::GetValueAsSigned(int64_t fail_value)
1301{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001302 lldb::ValueObjectSP value_sp(GetSP());
1303 if (value_sp)
Greg Clayton0fb0bcc2011-08-03 22:57:10 +00001304 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001305 ProcessSP process_sp(value_sp->GetProcessSP());
1306 Process::StopLocker stop_locker;
1307 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Clayton0fb0bcc2011-08-03 22:57:10 +00001308 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001309 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1310 if (log)
1311 log->Printf ("SBValue(%p)::GetValueAsSigned() => error: process is running", value_sp.get());
1312 }
1313 else
1314 {
1315 TargetSP target_sp(value_sp->GetTargetSP());
1316 if (target_sp)
1317 {
1318 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1319 Scalar scalar;
1320 if (value_sp->ResolveValue (scalar))
1321 return scalar.GetRawBits64(fail_value);
1322 }
Greg Clayton0fb0bcc2011-08-03 22:57:10 +00001323 }
1324 }
1325 return fail_value;
1326}
1327
1328uint64_t
1329SBValue::GetValueAsUnsigned(uint64_t fail_value)
1330{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001331 lldb::ValueObjectSP value_sp(GetSP());
1332 if (value_sp)
Greg Clayton0fb0bcc2011-08-03 22:57:10 +00001333 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001334 ProcessSP process_sp(value_sp->GetProcessSP());
1335 Process::StopLocker stop_locker;
1336 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Clayton0fb0bcc2011-08-03 22:57:10 +00001337 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001338 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1339 if (log)
1340 log->Printf ("SBValue(%p)::GetValueAsUnsigned() => error: process is running", value_sp.get());
1341 }
1342 else
1343 {
1344 TargetSP target_sp(value_sp->GetTargetSP());
1345 if (target_sp)
1346 {
1347 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1348 Scalar scalar;
1349 if (value_sp->ResolveValue (scalar))
1350 return scalar.GetRawBits64(fail_value);
1351 }
Greg Clayton0fb0bcc2011-08-03 22:57:10 +00001352 }
1353 }
1354 return fail_value;
1355}
1356
Greg Clayton54037b12012-10-23 01:50:10 +00001357bool
1358SBValue::MightHaveChildren ()
1359{
1360 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1361 bool has_children = false;
1362 lldb::ValueObjectSP value_sp(GetSP());
1363 if (value_sp)
1364 has_children = value_sp->MightHaveChildren();
1365
1366 if (log)
1367 log->Printf ("SBValue(%p)::HasChildren() => %i", value_sp.get(), has_children);
1368 return has_children;
1369}
1370
Chris Lattner24943d22010-06-08 16:52:24 +00001371uint32_t
1372SBValue::GetNumChildren ()
1373{
1374 uint32_t num_children = 0;
1375
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001376 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001377 lldb::ValueObjectSP value_sp(GetSP());
1378 if (value_sp)
Greg Claytonfab305b2011-05-20 23:51:26 +00001379 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001380 ProcessSP process_sp(value_sp->GetProcessSP());
1381 Process::StopLocker stop_locker;
1382 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Claytonb9dcc512011-06-29 18:28:50 +00001383 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001384 if (log)
1385 log->Printf ("SBValue(%p)::GetNumChildren() => error: process is running", value_sp.get());
1386 }
1387 else
1388 {
1389 TargetSP target_sp(value_sp->GetTargetSP());
1390 if (target_sp)
1391 {
1392 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Claytonfab305b2011-05-20 23:51:26 +00001393
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001394 num_children = value_sp->GetNumChildren();
1395 }
Greg Claytonb9dcc512011-06-29 18:28:50 +00001396 }
Greg Claytonfab305b2011-05-20 23:51:26 +00001397 }
Greg Clayton49ce6822010-10-31 03:01:06 +00001398
Greg Clayton49ce6822010-10-31 03:01:06 +00001399 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001400 log->Printf ("SBValue(%p)::GetNumChildren () => %u", value_sp.get(), num_children);
Chris Lattner24943d22010-06-08 16:52:24 +00001401
1402 return num_children;
1403}
1404
Chris Lattner24943d22010-06-08 16:52:24 +00001405
1406SBValue
1407SBValue::Dereference ()
1408{
Greg Clayton49ce6822010-10-31 03:01:06 +00001409 SBValue sb_value;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001410 lldb::ValueObjectSP value_sp(GetSP());
1411 if (value_sp)
Chris Lattner24943d22010-06-08 16:52:24 +00001412 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001413 TargetSP target_sp(value_sp->GetTargetSP());
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001414 if (target_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +00001415 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001416 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Claytonfab305b2011-05-20 23:51:26 +00001417
Greg Claytonb9dcc512011-06-29 18:28:50 +00001418 Error error;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001419 sb_value = value_sp->Dereference (error);
Greg Claytonb9dcc512011-06-29 18:28:50 +00001420 }
Chris Lattner24943d22010-06-08 16:52:24 +00001421 }
Greg Claytone005f2c2010-11-06 01:53:30 +00001422 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +00001423 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001424 log->Printf ("SBValue(%p)::Dereference () => SBValue(%p)", value_sp.get(), value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +00001425
1426 return sb_value;
Chris Lattner24943d22010-06-08 16:52:24 +00001427}
1428
1429bool
Greg Clayton49ce6822010-10-31 03:01:06 +00001430SBValue::TypeIsPointerType ()
Chris Lattner24943d22010-06-08 16:52:24 +00001431{
1432 bool is_ptr_type = false;
1433
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001434 lldb::ValueObjectSP value_sp(GetSP());
1435 if (value_sp)
Greg Claytonfab305b2011-05-20 23:51:26 +00001436 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001437 TargetSP target_sp(value_sp->GetTargetSP());
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001438 if (target_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +00001439 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001440 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Claytonfab305b2011-05-20 23:51:26 +00001441
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001442 is_ptr_type = value_sp->IsPointerType();
Greg Claytonb9dcc512011-06-29 18:28:50 +00001443 }
Greg Claytonfab305b2011-05-20 23:51:26 +00001444 }
Greg Clayton49ce6822010-10-31 03:01:06 +00001445
Greg Claytone005f2c2010-11-06 01:53:30 +00001446 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +00001447 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001448 log->Printf ("SBValue(%p)::TypeIsPointerType () => %i", value_sp.get(), is_ptr_type);
Greg Clayton49ce6822010-10-31 03:01:06 +00001449
Chris Lattner24943d22010-06-08 16:52:24 +00001450
1451 return is_ptr_type;
1452}
1453
Chris Lattner24943d22010-06-08 16:52:24 +00001454void *
1455SBValue::GetOpaqueType()
1456{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001457 lldb::ValueObjectSP value_sp(GetSP());
1458 if (value_sp)
Greg Claytonfab305b2011-05-20 23:51:26 +00001459 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001460 TargetSP target_sp(value_sp->GetTargetSP());
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001461 if (target_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +00001462 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001463 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Claytonfab305b2011-05-20 23:51:26 +00001464
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001465 return value_sp->GetClangType();
Greg Claytonb9dcc512011-06-29 18:28:50 +00001466 }
Greg Claytonfab305b2011-05-20 23:51:26 +00001467 }
Chris Lattner24943d22010-06-08 16:52:24 +00001468 return NULL;
1469}
1470
Enrico Granata979e20d2011-07-29 19:53:35 +00001471lldb::SBTarget
1472SBValue::GetTarget()
1473{
Greg Clayton334d33a2012-01-30 07:41:31 +00001474 SBTarget sb_target;
1475 TargetSP target_sp;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001476 lldb::ValueObjectSP value_sp(GetSP());
1477 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +00001478 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001479 target_sp = value_sp->GetTargetSP();
Greg Clayton334d33a2012-01-30 07:41:31 +00001480 sb_target.SetSP (target_sp);
Enrico Granata979e20d2011-07-29 19:53:35 +00001481 }
1482 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1483 if (log)
1484 {
Greg Clayton334d33a2012-01-30 07:41:31 +00001485 if (target_sp.get() == NULL)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001486 log->Printf ("SBValue(%p)::GetTarget () => NULL", value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001487 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001488 log->Printf ("SBValue(%p)::GetTarget () => %p", value_sp.get(), target_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001489 }
Greg Clayton334d33a2012-01-30 07:41:31 +00001490 return sb_target;
Enrico Granata979e20d2011-07-29 19:53:35 +00001491}
1492
1493lldb::SBProcess
1494SBValue::GetProcess()
1495{
Greg Clayton334d33a2012-01-30 07:41:31 +00001496 SBProcess sb_process;
1497 ProcessSP process_sp;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001498 lldb::ValueObjectSP value_sp(GetSP());
1499 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +00001500 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001501 process_sp = value_sp->GetProcessSP();
Greg Clayton334d33a2012-01-30 07:41:31 +00001502 if (process_sp)
1503 sb_process.SetSP (process_sp);
Enrico Granata979e20d2011-07-29 19:53:35 +00001504 }
1505 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1506 if (log)
1507 {
Greg Clayton334d33a2012-01-30 07:41:31 +00001508 if (process_sp.get() == NULL)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001509 log->Printf ("SBValue(%p)::GetProcess () => NULL", value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001510 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001511 log->Printf ("SBValue(%p)::GetProcess () => %p", value_sp.get(), process_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001512 }
Greg Clayton334d33a2012-01-30 07:41:31 +00001513 return sb_process;
Enrico Granata979e20d2011-07-29 19:53:35 +00001514}
1515
1516lldb::SBThread
1517SBValue::GetThread()
1518{
Greg Clayton90c52142012-01-30 02:53:15 +00001519 SBThread sb_thread;
1520 ThreadSP thread_sp;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001521 lldb::ValueObjectSP value_sp(GetSP());
1522 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +00001523 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001524 thread_sp = value_sp->GetThreadSP();
1525 sb_thread.SetThread(thread_sp);
Enrico Granata979e20d2011-07-29 19:53:35 +00001526 }
1527 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1528 if (log)
1529 {
Greg Clayton90c52142012-01-30 02:53:15 +00001530 if (thread_sp.get() == NULL)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001531 log->Printf ("SBValue(%p)::GetThread () => NULL", value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001532 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001533 log->Printf ("SBValue(%p)::GetThread () => %p", value_sp.get(), thread_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001534 }
Greg Clayton90c52142012-01-30 02:53:15 +00001535 return sb_thread;
Enrico Granata979e20d2011-07-29 19:53:35 +00001536}
1537
1538lldb::SBFrame
1539SBValue::GetFrame()
1540{
Greg Clayton334d33a2012-01-30 07:41:31 +00001541 SBFrame sb_frame;
1542 StackFrameSP frame_sp;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001543 lldb::ValueObjectSP value_sp(GetSP());
1544 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +00001545 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001546 frame_sp = value_sp->GetFrameSP();
1547 sb_frame.SetFrameSP (frame_sp);
Enrico Granata979e20d2011-07-29 19:53:35 +00001548 }
1549 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1550 if (log)
1551 {
Greg Clayton334d33a2012-01-30 07:41:31 +00001552 if (frame_sp.get() == NULL)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001553 log->Printf ("SBValue(%p)::GetFrame () => NULL", value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001554 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001555 log->Printf ("SBValue(%p)::GetFrame () => %p", value_sp.get(), frame_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001556 }
Greg Clayton334d33a2012-01-30 07:41:31 +00001557 return sb_frame;
Enrico Granata979e20d2011-07-29 19:53:35 +00001558}
1559
1560
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001561lldb::ValueObjectSP
1562SBValue::GetSP () const
Chris Lattner24943d22010-06-08 16:52:24 +00001563{
Enrico Granata3d656c72012-10-22 18:18:36 +00001564 if (!m_opaque_sp || !m_opaque_sp->IsValid())
1565 return ValueObjectSP();
1566 return m_opaque_sp->GetSP();
1567}
1568
1569void
1570SBValue::SetSP (ValueImplSP impl_sp)
1571{
1572 m_opaque_sp = impl_sp;
Chris Lattner24943d22010-06-08 16:52:24 +00001573}
1574
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001575void
1576SBValue::SetSP (const lldb::ValueObjectSP &sp)
Chris Lattner24943d22010-06-08 16:52:24 +00001577{
Enrico Granata3d656c72012-10-22 18:18:36 +00001578 if (sp)
1579 {
1580 lldb::TargetSP target_sp(sp->GetTargetSP());
1581 if (target_sp)
1582 {
1583 lldb::DynamicValueType use_dynamic = target_sp->GetPreferDynamicValue();
1584 bool use_synthetic = target_sp->TargetProperties::GetEnableSyntheticValue();
1585 m_opaque_sp = ValueImplSP(new ValueImpl(sp, use_dynamic, use_synthetic));
1586 }
1587 else
1588 m_opaque_sp = ValueImplSP(new ValueImpl(sp,eNoDynamicValues,true));
1589 }
1590 else
1591 m_opaque_sp = ValueImplSP(new ValueImpl(sp,eNoDynamicValues,false));
Chris Lattner24943d22010-06-08 16:52:24 +00001592}
Caroline Tice98f930f2010-09-20 05:20:02 +00001593
Enrico Granata3d656c72012-10-22 18:18:36 +00001594void
1595SBValue::SetSP (const lldb::ValueObjectSP &sp, lldb::DynamicValueType use_dynamic)
1596{
1597 if (sp)
1598 {
1599 lldb::TargetSP target_sp(sp->GetTargetSP());
1600 if (target_sp)
1601 {
1602 bool use_synthetic = target_sp->TargetProperties::GetEnableSyntheticValue();
1603 SetSP (sp, use_dynamic, use_synthetic);
1604 }
1605 else
1606 SetSP (sp, use_dynamic, true);
1607 }
1608 else
1609 SetSP (sp, use_dynamic, false);
1610}
1611
1612void
1613SBValue::SetSP (const lldb::ValueObjectSP &sp, bool use_synthetic)
1614{
1615 if (sp)
1616 {
1617 lldb::TargetSP target_sp(sp->GetTargetSP());
1618 if (target_sp)
1619 {
1620 lldb::DynamicValueType use_dynamic = target_sp->GetPreferDynamicValue();
1621 SetSP (sp, use_dynamic, use_synthetic);
1622 }
1623 else
1624 SetSP (sp, eNoDynamicValues, use_synthetic);
1625 }
1626 else
1627 SetSP (sp, eNoDynamicValues, use_synthetic);
1628}
1629
1630void
1631SBValue::SetSP (const lldb::ValueObjectSP &sp, lldb::DynamicValueType use_dynamic, bool use_synthetic)
1632{
1633 m_opaque_sp = ValueImplSP(new ValueImpl(sp,use_dynamic,use_synthetic));
1634}
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001635
Caroline Tice98f930f2010-09-20 05:20:02 +00001636bool
Greg Clayton49ce6822010-10-31 03:01:06 +00001637SBValue::GetExpressionPath (SBStream &description)
1638{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001639 lldb::ValueObjectSP value_sp(GetSP());
1640 if (value_sp)
Greg Clayton49ce6822010-10-31 03:01:06 +00001641 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001642 value_sp->GetExpressionPath (description.ref(), false);
Greg Claytonb01000f2011-01-17 03:46:26 +00001643 return true;
1644 }
1645 return false;
1646}
1647
1648bool
1649SBValue::GetExpressionPath (SBStream &description, bool qualify_cxx_base_classes)
1650{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001651 lldb::ValueObjectSP value_sp(GetSP());
1652 if (value_sp)
Greg Claytonb01000f2011-01-17 03:46:26 +00001653 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001654 value_sp->GetExpressionPath (description.ref(), qualify_cxx_base_classes);
Greg Clayton49ce6822010-10-31 03:01:06 +00001655 return true;
1656 }
1657 return false;
1658}
1659
1660bool
Caroline Tice98f930f2010-09-20 05:20:02 +00001661SBValue::GetDescription (SBStream &description)
1662{
Greg Clayton96154be2011-11-13 06:57:31 +00001663 Stream &strm = description.ref();
1664
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001665 lldb::ValueObjectSP value_sp(GetSP());
1666 if (value_sp)
Caroline Tice98f930f2010-09-20 05:20:02 +00001667 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001668 ProcessSP process_sp(value_sp->GetProcessSP());
1669 Process::StopLocker stop_locker;
1670 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
1671 {
1672 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1673 if (log)
1674 log->Printf ("SBValue(%p)::GetDescription() => error: process is running", value_sp.get());
1675 }
1676 else
1677 {
1678 ValueObject::DumpValueObject (strm, value_sp.get());
1679 }
Caroline Tice98f930f2010-09-20 05:20:02 +00001680 }
1681 else
Greg Clayton96154be2011-11-13 06:57:31 +00001682 strm.PutCString ("No value");
Caroline Tice98f930f2010-09-20 05:20:02 +00001683
1684 return true;
1685}
Greg Claytone179a582011-01-05 18:43:15 +00001686
1687lldb::Format
Greg Claytond68e0892011-09-09 23:04:00 +00001688SBValue::GetFormat ()
Greg Claytone179a582011-01-05 18:43:15 +00001689{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001690 lldb::ValueObjectSP value_sp(GetSP());
1691 if (value_sp)
1692 return value_sp->GetFormat();
Greg Claytone179a582011-01-05 18:43:15 +00001693 return eFormatDefault;
1694}
1695
1696void
1697SBValue::SetFormat (lldb::Format format)
1698{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001699 lldb::ValueObjectSP value_sp(GetSP());
1700 if (value_sp)
1701 value_sp->SetFormat(format);
Greg Claytone179a582011-01-05 18:43:15 +00001702}
1703
Enrico Granata979e20d2011-07-29 19:53:35 +00001704lldb::SBValue
1705SBValue::AddressOf()
1706{
1707 SBValue sb_value;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001708 lldb::ValueObjectSP value_sp(GetSP());
1709 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +00001710 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001711 TargetSP target_sp (value_sp->GetTargetSP());
1712 if (target_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +00001713 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001714 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Enrico Granata979e20d2011-07-29 19:53:35 +00001715 Error error;
Enrico Granata3d656c72012-10-22 18:18:36 +00001716 sb_value.SetSP(value_sp->AddressOf (error),GetPreferDynamicValue(), GetPreferSyntheticValue());
Enrico Granata979e20d2011-07-29 19:53:35 +00001717 }
1718 }
1719 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1720 if (log)
Greg Clayton12b7ea32012-06-04 20:13:23 +00001721 log->Printf ("SBValue(%p)::AddressOf () => SBValue(%p)", value_sp.get(), value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001722
1723 return sb_value;
Johnny Chena713b862011-08-09 22:38:07 +00001724}
Enrico Granata91544802011-09-06 19:20:51 +00001725
1726lldb::addr_t
1727SBValue::GetLoadAddress()
1728{
1729 lldb::addr_t value = LLDB_INVALID_ADDRESS;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001730 lldb::ValueObjectSP value_sp(GetSP());
1731 if (value_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001732 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001733 TargetSP target_sp (value_sp->GetTargetSP());
1734 if (target_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001735 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001736 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Enrico Granata91544802011-09-06 19:20:51 +00001737 const bool scalar_is_load_address = true;
1738 AddressType addr_type;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001739 value = value_sp->GetAddressOf(scalar_is_load_address, &addr_type);
Enrico Granata91544802011-09-06 19:20:51 +00001740 if (addr_type == eAddressTypeFile)
1741 {
Greg Clayton3508c382012-02-24 01:59:29 +00001742 ModuleSP module_sp (value_sp->GetModule());
1743 if (!module_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001744 value = LLDB_INVALID_ADDRESS;
1745 else
1746 {
1747 Address addr;
Greg Clayton3508c382012-02-24 01:59:29 +00001748 module_sp->ResolveFileAddress(value, addr);
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001749 value = addr.GetLoadAddress(target_sp.get());
Enrico Granata91544802011-09-06 19:20:51 +00001750 }
1751 }
1752 else if (addr_type == eAddressTypeHost || addr_type == eAddressTypeInvalid)
1753 value = LLDB_INVALID_ADDRESS;
1754 }
1755 }
1756 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1757 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001758 log->Printf ("SBValue(%p)::GetLoadAddress () => (%llu)", value_sp.get(), value);
Enrico Granata91544802011-09-06 19:20:51 +00001759
1760 return value;
1761}
1762
1763lldb::SBAddress
1764SBValue::GetAddress()
1765{
1766 Address addr;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001767 lldb::ValueObjectSP value_sp(GetSP());
1768 if (value_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001769 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001770 TargetSP target_sp (value_sp->GetTargetSP());
1771 if (target_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001772 {
1773 lldb::addr_t value = LLDB_INVALID_ADDRESS;
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001774 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Enrico Granata91544802011-09-06 19:20:51 +00001775 const bool scalar_is_load_address = true;
1776 AddressType addr_type;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001777 value = value_sp->GetAddressOf(scalar_is_load_address, &addr_type);
Enrico Granata91544802011-09-06 19:20:51 +00001778 if (addr_type == eAddressTypeFile)
1779 {
Greg Clayton3508c382012-02-24 01:59:29 +00001780 ModuleSP module_sp (value_sp->GetModule());
1781 if (module_sp)
1782 module_sp->ResolveFileAddress(value, addr);
Enrico Granata91544802011-09-06 19:20:51 +00001783 }
1784 else if (addr_type == eAddressTypeLoad)
1785 {
1786 // no need to check the return value on this.. if it can actually do the resolve
1787 // addr will be in the form (section,offset), otherwise it will simply be returned
1788 // as (NULL, value)
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001789 addr.SetLoadAddress(value, target_sp.get());
Enrico Granata91544802011-09-06 19:20:51 +00001790 }
1791 }
1792 }
1793 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1794 if (log)
Jim Ingham47beabb2012-10-16 21:41:58 +00001795 log->Printf ("SBValue(%p)::GetAddress () => (%s,%llu)", value_sp.get(),
1796 (addr.GetSection() ? addr.GetSection()->GetName().GetCString() : "NULL"),
1797 addr.GetOffset());
Enrico Granata91544802011-09-06 19:20:51 +00001798 return SBAddress(new Address(addr));
1799}
1800
1801lldb::SBData
1802SBValue::GetPointeeData (uint32_t item_idx,
1803 uint32_t item_count)
1804{
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001805 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata91544802011-09-06 19:20:51 +00001806 lldb::SBData sb_data;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001807 lldb::ValueObjectSP value_sp(GetSP());
1808 if (value_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001809 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001810 ProcessSP process_sp(value_sp->GetProcessSP());
1811 Process::StopLocker stop_locker;
1812 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granata91544802011-09-06 19:20:51 +00001813 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001814 if (log)
1815 log->Printf ("SBValue(%p)::GetPointeeData() => error: process is running", value_sp.get());
1816 }
1817 else
1818 {
1819 TargetSP target_sp (value_sp->GetTargetSP());
1820 if (target_sp)
1821 {
1822 DataExtractorSP data_sp(new DataExtractor());
1823 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1824 value_sp->GetPointeeData(*data_sp, item_idx, item_count);
1825 if (data_sp->GetByteSize() > 0)
1826 *sb_data = data_sp;
1827 }
Enrico Granata91544802011-09-06 19:20:51 +00001828 }
1829 }
Enrico Granata91544802011-09-06 19:20:51 +00001830 if (log)
1831 log->Printf ("SBValue(%p)::GetPointeeData (%d, %d) => SBData(%p)",
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001832 value_sp.get(),
Enrico Granata91544802011-09-06 19:20:51 +00001833 item_idx,
1834 item_count,
1835 sb_data.get());
1836
1837 return sb_data;
1838}
1839
1840lldb::SBData
1841SBValue::GetData ()
1842{
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001843 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata91544802011-09-06 19:20:51 +00001844 lldb::SBData sb_data;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001845 lldb::ValueObjectSP value_sp(GetSP());
1846 if (value_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001847 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001848 ProcessSP process_sp(value_sp->GetProcessSP());
1849 Process::StopLocker stop_locker;
1850 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granata91544802011-09-06 19:20:51 +00001851 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001852 if (log)
1853 log->Printf ("SBValue(%p)::GetData() => error: process is running", value_sp.get());
1854 }
1855 else
1856 {
1857 TargetSP target_sp (value_sp->GetTargetSP());
1858 if (target_sp)
1859 {
1860 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1861 DataExtractorSP data_sp(new DataExtractor());
1862 value_sp->GetData(*data_sp);
1863 if (data_sp->GetByteSize() > 0)
1864 *sb_data = data_sp;
1865 }
Enrico Granata91544802011-09-06 19:20:51 +00001866 }
1867 }
Enrico Granata91544802011-09-06 19:20:51 +00001868 if (log)
1869 log->Printf ("SBValue(%p)::GetData () => SBData(%p)",
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001870 value_sp.get(),
Enrico Granata91544802011-09-06 19:20:51 +00001871 sb_data.get());
1872
1873 return sb_data;
1874}
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001875
Enrico Granata49306142012-10-10 22:54:17 +00001876lldb::SBDeclaration
1877SBValue::GetDeclaration ()
1878{
1879 lldb::ValueObjectSP value_sp(GetSP());
1880 SBDeclaration decl_sb;
1881 if (value_sp)
1882 {
1883 Declaration decl;
1884 if (value_sp->GetDeclaration(decl))
1885 decl_sb.SetDeclaration(decl);
1886 }
1887 return decl_sb;
1888}
1889
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001890lldb::SBWatchpoint
Johnny Chen3f883492012-06-04 23:19:54 +00001891SBValue::Watch (bool resolve_location, bool read, bool write, SBError &error)
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001892{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001893 SBWatchpoint sb_watchpoint;
1894
1895 // If the SBValue is not valid, there's no point in even trying to watch it.
1896 lldb::ValueObjectSP value_sp(GetSP());
1897 TargetSP target_sp (GetTarget().GetSP());
1898 if (value_sp && target_sp)
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001899 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001900 // Can't watch this if the process is running
1901 ProcessSP process_sp(value_sp->GetProcessSP());
1902 Process::StopLocker stop_locker;
1903 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
1904 {
1905 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1906 if (log)
1907 log->Printf ("SBValue(%p)::Watch() => error: process is running", value_sp.get());
1908 return sb_watchpoint;
1909 }
1910
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001911 // Read and Write cannot both be false.
1912 if (!read && !write)
1913 return sb_watchpoint;
1914
1915 // If the value is not in scope, don't try and watch and invalid value
1916 if (!IsInScope())
1917 return sb_watchpoint;
1918
1919 addr_t addr = GetLoadAddress();
1920 if (addr == LLDB_INVALID_ADDRESS)
1921 return sb_watchpoint;
1922 size_t byte_size = GetByteSize();
1923 if (byte_size == 0)
1924 return sb_watchpoint;
1925
1926 uint32_t watch_type = 0;
1927 if (read)
1928 watch_type |= LLDB_WATCH_TYPE_READ;
1929 if (write)
1930 watch_type |= LLDB_WATCH_TYPE_WRITE;
1931
Johnny Chen3f883492012-06-04 23:19:54 +00001932 Error rc;
Jim Ingham9e376622012-10-23 07:20:06 +00001933 ClangASTType type (value_sp->GetClangAST(), value_sp->GetClangType());
1934 WatchpointSP watchpoint_sp = target_sp->CreateWatchpoint(addr, byte_size, &type, watch_type, rc);
Johnny Chen3f883492012-06-04 23:19:54 +00001935 error.SetError(rc);
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001936
1937 if (watchpoint_sp)
1938 {
1939 sb_watchpoint.SetSP (watchpoint_sp);
1940 Declaration decl;
1941 if (value_sp->GetDeclaration (decl))
1942 {
1943 if (decl.GetFile())
1944 {
1945 StreamString ss;
1946 // True to show fullpath for declaration file.
1947 decl.DumpStopContext(&ss, true);
1948 watchpoint_sp->SetDeclInfo(ss.GetString());
1949 }
1950 }
1951 }
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001952 }
1953 return sb_watchpoint;
1954}
1955
Johnny Chen8a5ce772012-06-04 23:45:50 +00001956// FIXME: Remove this method impl (as well as the decl in .h) once it is no longer needed.
1957// Backward compatibility fix in the interim.
1958lldb::SBWatchpoint
1959SBValue::Watch (bool resolve_location, bool read, bool write)
1960{
Johnny Chen9c4a3442012-06-05 00:14:15 +00001961 SBError error;
1962 return Watch(resolve_location, read, write, error);
Johnny Chen8a5ce772012-06-04 23:45:50 +00001963}
1964
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001965lldb::SBWatchpoint
Johnny Chen3f883492012-06-04 23:19:54 +00001966SBValue::WatchPointee (bool resolve_location, bool read, bool write, SBError &error)
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001967{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001968 SBWatchpoint sb_watchpoint;
1969 if (IsInScope() && GetType().IsPointerType())
Johnny Chen3f883492012-06-04 23:19:54 +00001970 sb_watchpoint = Dereference().Watch (resolve_location, read, write, error);
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001971 return sb_watchpoint;
1972}