blob: 318029fdc43b9d29c8842c820838c67e86e3b5de [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
Chris Lattner24943d22010-06-08 16:52:24 +00001357uint32_t
1358SBValue::GetNumChildren ()
1359{
1360 uint32_t num_children = 0;
1361
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001362 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001363 lldb::ValueObjectSP value_sp(GetSP());
1364 if (value_sp)
Greg Claytonfab305b2011-05-20 23:51:26 +00001365 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001366 ProcessSP process_sp(value_sp->GetProcessSP());
1367 Process::StopLocker stop_locker;
1368 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Claytonb9dcc512011-06-29 18:28:50 +00001369 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001370 if (log)
1371 log->Printf ("SBValue(%p)::GetNumChildren() => error: process is running", value_sp.get());
1372 }
1373 else
1374 {
1375 TargetSP target_sp(value_sp->GetTargetSP());
1376 if (target_sp)
1377 {
1378 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Claytonfab305b2011-05-20 23:51:26 +00001379
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001380 num_children = value_sp->GetNumChildren();
1381 }
Greg Claytonb9dcc512011-06-29 18:28:50 +00001382 }
Greg Claytonfab305b2011-05-20 23:51:26 +00001383 }
Greg Clayton49ce6822010-10-31 03:01:06 +00001384
Greg Clayton49ce6822010-10-31 03:01:06 +00001385 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001386 log->Printf ("SBValue(%p)::GetNumChildren () => %u", value_sp.get(), num_children);
Chris Lattner24943d22010-06-08 16:52:24 +00001387
1388 return num_children;
1389}
1390
Chris Lattner24943d22010-06-08 16:52:24 +00001391
1392SBValue
1393SBValue::Dereference ()
1394{
Greg Clayton49ce6822010-10-31 03:01:06 +00001395 SBValue sb_value;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001396 lldb::ValueObjectSP value_sp(GetSP());
1397 if (value_sp)
Chris Lattner24943d22010-06-08 16:52:24 +00001398 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001399 TargetSP target_sp(value_sp->GetTargetSP());
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001400 if (target_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +00001401 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001402 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Claytonfab305b2011-05-20 23:51:26 +00001403
Greg Claytonb9dcc512011-06-29 18:28:50 +00001404 Error error;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001405 sb_value = value_sp->Dereference (error);
Greg Claytonb9dcc512011-06-29 18:28:50 +00001406 }
Chris Lattner24943d22010-06-08 16:52:24 +00001407 }
Greg Claytone005f2c2010-11-06 01:53:30 +00001408 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +00001409 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001410 log->Printf ("SBValue(%p)::Dereference () => SBValue(%p)", value_sp.get(), value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +00001411
1412 return sb_value;
Chris Lattner24943d22010-06-08 16:52:24 +00001413}
1414
1415bool
Greg Clayton49ce6822010-10-31 03:01:06 +00001416SBValue::TypeIsPointerType ()
Chris Lattner24943d22010-06-08 16:52:24 +00001417{
1418 bool is_ptr_type = false;
1419
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001420 lldb::ValueObjectSP value_sp(GetSP());
1421 if (value_sp)
Greg Claytonfab305b2011-05-20 23:51:26 +00001422 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001423 TargetSP target_sp(value_sp->GetTargetSP());
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001424 if (target_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +00001425 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001426 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Claytonfab305b2011-05-20 23:51:26 +00001427
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001428 is_ptr_type = value_sp->IsPointerType();
Greg Claytonb9dcc512011-06-29 18:28:50 +00001429 }
Greg Claytonfab305b2011-05-20 23:51:26 +00001430 }
Greg Clayton49ce6822010-10-31 03:01:06 +00001431
Greg Claytone005f2c2010-11-06 01:53:30 +00001432 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +00001433 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001434 log->Printf ("SBValue(%p)::TypeIsPointerType () => %i", value_sp.get(), is_ptr_type);
Greg Clayton49ce6822010-10-31 03:01:06 +00001435
Chris Lattner24943d22010-06-08 16:52:24 +00001436
1437 return is_ptr_type;
1438}
1439
Chris Lattner24943d22010-06-08 16:52:24 +00001440void *
1441SBValue::GetOpaqueType()
1442{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001443 lldb::ValueObjectSP value_sp(GetSP());
1444 if (value_sp)
Greg Claytonfab305b2011-05-20 23:51:26 +00001445 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001446 TargetSP target_sp(value_sp->GetTargetSP());
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001447 if (target_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +00001448 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001449 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Claytonfab305b2011-05-20 23:51:26 +00001450
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001451 return value_sp->GetClangType();
Greg Claytonb9dcc512011-06-29 18:28:50 +00001452 }
Greg Claytonfab305b2011-05-20 23:51:26 +00001453 }
Chris Lattner24943d22010-06-08 16:52:24 +00001454 return NULL;
1455}
1456
Enrico Granata979e20d2011-07-29 19:53:35 +00001457lldb::SBTarget
1458SBValue::GetTarget()
1459{
Greg Clayton334d33a2012-01-30 07:41:31 +00001460 SBTarget sb_target;
1461 TargetSP target_sp;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001462 lldb::ValueObjectSP value_sp(GetSP());
1463 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +00001464 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001465 target_sp = value_sp->GetTargetSP();
Greg Clayton334d33a2012-01-30 07:41:31 +00001466 sb_target.SetSP (target_sp);
Enrico Granata979e20d2011-07-29 19:53:35 +00001467 }
1468 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1469 if (log)
1470 {
Greg Clayton334d33a2012-01-30 07:41:31 +00001471 if (target_sp.get() == NULL)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001472 log->Printf ("SBValue(%p)::GetTarget () => NULL", value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001473 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001474 log->Printf ("SBValue(%p)::GetTarget () => %p", value_sp.get(), target_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001475 }
Greg Clayton334d33a2012-01-30 07:41:31 +00001476 return sb_target;
Enrico Granata979e20d2011-07-29 19:53:35 +00001477}
1478
1479lldb::SBProcess
1480SBValue::GetProcess()
1481{
Greg Clayton334d33a2012-01-30 07:41:31 +00001482 SBProcess sb_process;
1483 ProcessSP process_sp;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001484 lldb::ValueObjectSP value_sp(GetSP());
1485 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +00001486 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001487 process_sp = value_sp->GetProcessSP();
Greg Clayton334d33a2012-01-30 07:41:31 +00001488 if (process_sp)
1489 sb_process.SetSP (process_sp);
Enrico Granata979e20d2011-07-29 19:53:35 +00001490 }
1491 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1492 if (log)
1493 {
Greg Clayton334d33a2012-01-30 07:41:31 +00001494 if (process_sp.get() == NULL)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001495 log->Printf ("SBValue(%p)::GetProcess () => NULL", value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001496 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001497 log->Printf ("SBValue(%p)::GetProcess () => %p", value_sp.get(), process_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001498 }
Greg Clayton334d33a2012-01-30 07:41:31 +00001499 return sb_process;
Enrico Granata979e20d2011-07-29 19:53:35 +00001500}
1501
1502lldb::SBThread
1503SBValue::GetThread()
1504{
Greg Clayton90c52142012-01-30 02:53:15 +00001505 SBThread sb_thread;
1506 ThreadSP thread_sp;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001507 lldb::ValueObjectSP value_sp(GetSP());
1508 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +00001509 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001510 thread_sp = value_sp->GetThreadSP();
1511 sb_thread.SetThread(thread_sp);
Enrico Granata979e20d2011-07-29 19:53:35 +00001512 }
1513 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1514 if (log)
1515 {
Greg Clayton90c52142012-01-30 02:53:15 +00001516 if (thread_sp.get() == NULL)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001517 log->Printf ("SBValue(%p)::GetThread () => NULL", value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001518 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001519 log->Printf ("SBValue(%p)::GetThread () => %p", value_sp.get(), thread_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001520 }
Greg Clayton90c52142012-01-30 02:53:15 +00001521 return sb_thread;
Enrico Granata979e20d2011-07-29 19:53:35 +00001522}
1523
1524lldb::SBFrame
1525SBValue::GetFrame()
1526{
Greg Clayton334d33a2012-01-30 07:41:31 +00001527 SBFrame sb_frame;
1528 StackFrameSP frame_sp;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001529 lldb::ValueObjectSP value_sp(GetSP());
1530 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +00001531 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001532 frame_sp = value_sp->GetFrameSP();
1533 sb_frame.SetFrameSP (frame_sp);
Enrico Granata979e20d2011-07-29 19:53:35 +00001534 }
1535 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1536 if (log)
1537 {
Greg Clayton334d33a2012-01-30 07:41:31 +00001538 if (frame_sp.get() == NULL)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001539 log->Printf ("SBValue(%p)::GetFrame () => NULL", value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001540 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001541 log->Printf ("SBValue(%p)::GetFrame () => %p", value_sp.get(), frame_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001542 }
Greg Clayton334d33a2012-01-30 07:41:31 +00001543 return sb_frame;
Enrico Granata979e20d2011-07-29 19:53:35 +00001544}
1545
1546
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001547lldb::ValueObjectSP
1548SBValue::GetSP () const
Chris Lattner24943d22010-06-08 16:52:24 +00001549{
Enrico Granata3d656c72012-10-22 18:18:36 +00001550 if (!m_opaque_sp || !m_opaque_sp->IsValid())
1551 return ValueObjectSP();
1552 return m_opaque_sp->GetSP();
1553}
1554
1555void
1556SBValue::SetSP (ValueImplSP impl_sp)
1557{
1558 m_opaque_sp = impl_sp;
Chris Lattner24943d22010-06-08 16:52:24 +00001559}
1560
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001561void
1562SBValue::SetSP (const lldb::ValueObjectSP &sp)
Chris Lattner24943d22010-06-08 16:52:24 +00001563{
Enrico Granata3d656c72012-10-22 18:18:36 +00001564 if (sp)
1565 {
1566 lldb::TargetSP target_sp(sp->GetTargetSP());
1567 if (target_sp)
1568 {
1569 lldb::DynamicValueType use_dynamic = target_sp->GetPreferDynamicValue();
1570 bool use_synthetic = target_sp->TargetProperties::GetEnableSyntheticValue();
1571 m_opaque_sp = ValueImplSP(new ValueImpl(sp, use_dynamic, use_synthetic));
1572 }
1573 else
1574 m_opaque_sp = ValueImplSP(new ValueImpl(sp,eNoDynamicValues,true));
1575 }
1576 else
1577 m_opaque_sp = ValueImplSP(new ValueImpl(sp,eNoDynamicValues,false));
Chris Lattner24943d22010-06-08 16:52:24 +00001578}
Caroline Tice98f930f2010-09-20 05:20:02 +00001579
Enrico Granata3d656c72012-10-22 18:18:36 +00001580void
1581SBValue::SetSP (const lldb::ValueObjectSP &sp, lldb::DynamicValueType use_dynamic)
1582{
1583 if (sp)
1584 {
1585 lldb::TargetSP target_sp(sp->GetTargetSP());
1586 if (target_sp)
1587 {
1588 bool use_synthetic = target_sp->TargetProperties::GetEnableSyntheticValue();
1589 SetSP (sp, use_dynamic, use_synthetic);
1590 }
1591 else
1592 SetSP (sp, use_dynamic, true);
1593 }
1594 else
1595 SetSP (sp, use_dynamic, false);
1596}
1597
1598void
1599SBValue::SetSP (const lldb::ValueObjectSP &sp, bool use_synthetic)
1600{
1601 if (sp)
1602 {
1603 lldb::TargetSP target_sp(sp->GetTargetSP());
1604 if (target_sp)
1605 {
1606 lldb::DynamicValueType use_dynamic = target_sp->GetPreferDynamicValue();
1607 SetSP (sp, use_dynamic, use_synthetic);
1608 }
1609 else
1610 SetSP (sp, eNoDynamicValues, use_synthetic);
1611 }
1612 else
1613 SetSP (sp, eNoDynamicValues, use_synthetic);
1614}
1615
1616void
1617SBValue::SetSP (const lldb::ValueObjectSP &sp, lldb::DynamicValueType use_dynamic, bool use_synthetic)
1618{
1619 m_opaque_sp = ValueImplSP(new ValueImpl(sp,use_dynamic,use_synthetic));
1620}
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001621
Caroline Tice98f930f2010-09-20 05:20:02 +00001622bool
Greg Clayton49ce6822010-10-31 03:01:06 +00001623SBValue::GetExpressionPath (SBStream &description)
1624{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001625 lldb::ValueObjectSP value_sp(GetSP());
1626 if (value_sp)
Greg Clayton49ce6822010-10-31 03:01:06 +00001627 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001628 value_sp->GetExpressionPath (description.ref(), false);
Greg Claytonb01000f2011-01-17 03:46:26 +00001629 return true;
1630 }
1631 return false;
1632}
1633
1634bool
1635SBValue::GetExpressionPath (SBStream &description, bool qualify_cxx_base_classes)
1636{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001637 lldb::ValueObjectSP value_sp(GetSP());
1638 if (value_sp)
Greg Claytonb01000f2011-01-17 03:46:26 +00001639 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001640 value_sp->GetExpressionPath (description.ref(), qualify_cxx_base_classes);
Greg Clayton49ce6822010-10-31 03:01:06 +00001641 return true;
1642 }
1643 return false;
1644}
1645
1646bool
Caroline Tice98f930f2010-09-20 05:20:02 +00001647SBValue::GetDescription (SBStream &description)
1648{
Greg Clayton96154be2011-11-13 06:57:31 +00001649 Stream &strm = description.ref();
1650
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001651 lldb::ValueObjectSP value_sp(GetSP());
1652 if (value_sp)
Caroline Tice98f930f2010-09-20 05:20:02 +00001653 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001654 ProcessSP process_sp(value_sp->GetProcessSP());
1655 Process::StopLocker stop_locker;
1656 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
1657 {
1658 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1659 if (log)
1660 log->Printf ("SBValue(%p)::GetDescription() => error: process is running", value_sp.get());
1661 }
1662 else
1663 {
1664 ValueObject::DumpValueObject (strm, value_sp.get());
1665 }
Caroline Tice98f930f2010-09-20 05:20:02 +00001666 }
1667 else
Greg Clayton96154be2011-11-13 06:57:31 +00001668 strm.PutCString ("No value");
Caroline Tice98f930f2010-09-20 05:20:02 +00001669
1670 return true;
1671}
Greg Claytone179a582011-01-05 18:43:15 +00001672
1673lldb::Format
Greg Claytond68e0892011-09-09 23:04:00 +00001674SBValue::GetFormat ()
Greg Claytone179a582011-01-05 18:43:15 +00001675{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001676 lldb::ValueObjectSP value_sp(GetSP());
1677 if (value_sp)
1678 return value_sp->GetFormat();
Greg Claytone179a582011-01-05 18:43:15 +00001679 return eFormatDefault;
1680}
1681
1682void
1683SBValue::SetFormat (lldb::Format format)
1684{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001685 lldb::ValueObjectSP value_sp(GetSP());
1686 if (value_sp)
1687 value_sp->SetFormat(format);
Greg Claytone179a582011-01-05 18:43:15 +00001688}
1689
Enrico Granata979e20d2011-07-29 19:53:35 +00001690lldb::SBValue
1691SBValue::AddressOf()
1692{
1693 SBValue sb_value;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001694 lldb::ValueObjectSP value_sp(GetSP());
1695 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +00001696 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001697 TargetSP target_sp (value_sp->GetTargetSP());
1698 if (target_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +00001699 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001700 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Enrico Granata979e20d2011-07-29 19:53:35 +00001701 Error error;
Enrico Granata3d656c72012-10-22 18:18:36 +00001702 sb_value.SetSP(value_sp->AddressOf (error),GetPreferDynamicValue(), GetPreferSyntheticValue());
Enrico Granata979e20d2011-07-29 19:53:35 +00001703 }
1704 }
1705 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1706 if (log)
Greg Clayton12b7ea32012-06-04 20:13:23 +00001707 log->Printf ("SBValue(%p)::AddressOf () => SBValue(%p)", value_sp.get(), value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001708
1709 return sb_value;
Johnny Chena713b862011-08-09 22:38:07 +00001710}
Enrico Granata91544802011-09-06 19:20:51 +00001711
1712lldb::addr_t
1713SBValue::GetLoadAddress()
1714{
1715 lldb::addr_t value = LLDB_INVALID_ADDRESS;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001716 lldb::ValueObjectSP value_sp(GetSP());
1717 if (value_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001718 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001719 TargetSP target_sp (value_sp->GetTargetSP());
1720 if (target_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001721 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001722 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Enrico Granata91544802011-09-06 19:20:51 +00001723 const bool scalar_is_load_address = true;
1724 AddressType addr_type;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001725 value = value_sp->GetAddressOf(scalar_is_load_address, &addr_type);
Enrico Granata91544802011-09-06 19:20:51 +00001726 if (addr_type == eAddressTypeFile)
1727 {
Greg Clayton3508c382012-02-24 01:59:29 +00001728 ModuleSP module_sp (value_sp->GetModule());
1729 if (!module_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001730 value = LLDB_INVALID_ADDRESS;
1731 else
1732 {
1733 Address addr;
Greg Clayton3508c382012-02-24 01:59:29 +00001734 module_sp->ResolveFileAddress(value, addr);
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001735 value = addr.GetLoadAddress(target_sp.get());
Enrico Granata91544802011-09-06 19:20:51 +00001736 }
1737 }
1738 else if (addr_type == eAddressTypeHost || addr_type == eAddressTypeInvalid)
1739 value = LLDB_INVALID_ADDRESS;
1740 }
1741 }
1742 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1743 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001744 log->Printf ("SBValue(%p)::GetLoadAddress () => (%llu)", value_sp.get(), value);
Enrico Granata91544802011-09-06 19:20:51 +00001745
1746 return value;
1747}
1748
1749lldb::SBAddress
1750SBValue::GetAddress()
1751{
1752 Address addr;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001753 lldb::ValueObjectSP value_sp(GetSP());
1754 if (value_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001755 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001756 TargetSP target_sp (value_sp->GetTargetSP());
1757 if (target_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001758 {
1759 lldb::addr_t value = LLDB_INVALID_ADDRESS;
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001760 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Enrico Granata91544802011-09-06 19:20:51 +00001761 const bool scalar_is_load_address = true;
1762 AddressType addr_type;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001763 value = value_sp->GetAddressOf(scalar_is_load_address, &addr_type);
Enrico Granata91544802011-09-06 19:20:51 +00001764 if (addr_type == eAddressTypeFile)
1765 {
Greg Clayton3508c382012-02-24 01:59:29 +00001766 ModuleSP module_sp (value_sp->GetModule());
1767 if (module_sp)
1768 module_sp->ResolveFileAddress(value, addr);
Enrico Granata91544802011-09-06 19:20:51 +00001769 }
1770 else if (addr_type == eAddressTypeLoad)
1771 {
1772 // no need to check the return value on this.. if it can actually do the resolve
1773 // addr will be in the form (section,offset), otherwise it will simply be returned
1774 // as (NULL, value)
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001775 addr.SetLoadAddress(value, target_sp.get());
Enrico Granata91544802011-09-06 19:20:51 +00001776 }
1777 }
1778 }
1779 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1780 if (log)
Jim Ingham47beabb2012-10-16 21:41:58 +00001781 log->Printf ("SBValue(%p)::GetAddress () => (%s,%llu)", value_sp.get(),
1782 (addr.GetSection() ? addr.GetSection()->GetName().GetCString() : "NULL"),
1783 addr.GetOffset());
Enrico Granata91544802011-09-06 19:20:51 +00001784 return SBAddress(new Address(addr));
1785}
1786
1787lldb::SBData
1788SBValue::GetPointeeData (uint32_t item_idx,
1789 uint32_t item_count)
1790{
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001791 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata91544802011-09-06 19:20:51 +00001792 lldb::SBData sb_data;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001793 lldb::ValueObjectSP value_sp(GetSP());
1794 if (value_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001795 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001796 ProcessSP process_sp(value_sp->GetProcessSP());
1797 Process::StopLocker stop_locker;
1798 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granata91544802011-09-06 19:20:51 +00001799 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001800 if (log)
1801 log->Printf ("SBValue(%p)::GetPointeeData() => error: process is running", value_sp.get());
1802 }
1803 else
1804 {
1805 TargetSP target_sp (value_sp->GetTargetSP());
1806 if (target_sp)
1807 {
1808 DataExtractorSP data_sp(new DataExtractor());
1809 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1810 value_sp->GetPointeeData(*data_sp, item_idx, item_count);
1811 if (data_sp->GetByteSize() > 0)
1812 *sb_data = data_sp;
1813 }
Enrico Granata91544802011-09-06 19:20:51 +00001814 }
1815 }
Enrico Granata91544802011-09-06 19:20:51 +00001816 if (log)
1817 log->Printf ("SBValue(%p)::GetPointeeData (%d, %d) => SBData(%p)",
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001818 value_sp.get(),
Enrico Granata91544802011-09-06 19:20:51 +00001819 item_idx,
1820 item_count,
1821 sb_data.get());
1822
1823 return sb_data;
1824}
1825
1826lldb::SBData
1827SBValue::GetData ()
1828{
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001829 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata91544802011-09-06 19:20:51 +00001830 lldb::SBData sb_data;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001831 lldb::ValueObjectSP value_sp(GetSP());
1832 if (value_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001833 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001834 ProcessSP process_sp(value_sp->GetProcessSP());
1835 Process::StopLocker stop_locker;
1836 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granata91544802011-09-06 19:20:51 +00001837 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001838 if (log)
1839 log->Printf ("SBValue(%p)::GetData() => error: process is running", value_sp.get());
1840 }
1841 else
1842 {
1843 TargetSP target_sp (value_sp->GetTargetSP());
1844 if (target_sp)
1845 {
1846 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1847 DataExtractorSP data_sp(new DataExtractor());
1848 value_sp->GetData(*data_sp);
1849 if (data_sp->GetByteSize() > 0)
1850 *sb_data = data_sp;
1851 }
Enrico Granata91544802011-09-06 19:20:51 +00001852 }
1853 }
Enrico Granata91544802011-09-06 19:20:51 +00001854 if (log)
1855 log->Printf ("SBValue(%p)::GetData () => SBData(%p)",
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001856 value_sp.get(),
Enrico Granata91544802011-09-06 19:20:51 +00001857 sb_data.get());
1858
1859 return sb_data;
1860}
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001861
Enrico Granata49306142012-10-10 22:54:17 +00001862lldb::SBDeclaration
1863SBValue::GetDeclaration ()
1864{
1865 lldb::ValueObjectSP value_sp(GetSP());
1866 SBDeclaration decl_sb;
1867 if (value_sp)
1868 {
1869 Declaration decl;
1870 if (value_sp->GetDeclaration(decl))
1871 decl_sb.SetDeclaration(decl);
1872 }
1873 return decl_sb;
1874}
1875
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001876lldb::SBWatchpoint
Johnny Chen3f883492012-06-04 23:19:54 +00001877SBValue::Watch (bool resolve_location, bool read, bool write, SBError &error)
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001878{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001879 SBWatchpoint sb_watchpoint;
1880
1881 // If the SBValue is not valid, there's no point in even trying to watch it.
1882 lldb::ValueObjectSP value_sp(GetSP());
1883 TargetSP target_sp (GetTarget().GetSP());
1884 if (value_sp && target_sp)
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001885 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001886 // Can't watch this if the process is running
1887 ProcessSP process_sp(value_sp->GetProcessSP());
1888 Process::StopLocker stop_locker;
1889 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
1890 {
1891 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1892 if (log)
1893 log->Printf ("SBValue(%p)::Watch() => error: process is running", value_sp.get());
1894 return sb_watchpoint;
1895 }
1896
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001897 // Read and Write cannot both be false.
1898 if (!read && !write)
1899 return sb_watchpoint;
1900
1901 // If the value is not in scope, don't try and watch and invalid value
1902 if (!IsInScope())
1903 return sb_watchpoint;
1904
1905 addr_t addr = GetLoadAddress();
1906 if (addr == LLDB_INVALID_ADDRESS)
1907 return sb_watchpoint;
1908 size_t byte_size = GetByteSize();
1909 if (byte_size == 0)
1910 return sb_watchpoint;
1911
1912 uint32_t watch_type = 0;
1913 if (read)
1914 watch_type |= LLDB_WATCH_TYPE_READ;
1915 if (write)
1916 watch_type |= LLDB_WATCH_TYPE_WRITE;
1917
Johnny Chen3f883492012-06-04 23:19:54 +00001918 Error rc;
1919 WatchpointSP watchpoint_sp = target_sp->CreateWatchpoint(addr, byte_size, watch_type, rc);
1920 error.SetError(rc);
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001921
1922 if (watchpoint_sp)
1923 {
1924 sb_watchpoint.SetSP (watchpoint_sp);
1925 Declaration decl;
1926 if (value_sp->GetDeclaration (decl))
1927 {
1928 if (decl.GetFile())
1929 {
1930 StreamString ss;
1931 // True to show fullpath for declaration file.
1932 decl.DumpStopContext(&ss, true);
1933 watchpoint_sp->SetDeclInfo(ss.GetString());
1934 }
1935 }
1936 }
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001937 }
1938 return sb_watchpoint;
1939}
1940
Johnny Chen8a5ce772012-06-04 23:45:50 +00001941// FIXME: Remove this method impl (as well as the decl in .h) once it is no longer needed.
1942// Backward compatibility fix in the interim.
1943lldb::SBWatchpoint
1944SBValue::Watch (bool resolve_location, bool read, bool write)
1945{
Johnny Chen9c4a3442012-06-05 00:14:15 +00001946 SBError error;
1947 return Watch(resolve_location, read, write, error);
Johnny Chen8a5ce772012-06-04 23:45:50 +00001948}
1949
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001950lldb::SBWatchpoint
Johnny Chen3f883492012-06-04 23:19:54 +00001951SBValue::WatchPointee (bool resolve_location, bool read, bool write, SBError &error)
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001952{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001953 SBWatchpoint sb_watchpoint;
1954 if (IsInScope() && GetType().IsPointerType())
Johnny Chen3f883492012-06-04 23:19:54 +00001955 sb_watchpoint = Dereference().Watch (resolve_location, read, write, error);
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001956 return sb_watchpoint;
1957}